স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য Unit Testing এবং Integration Testing দুটি প্রধান পদ্ধতি ব্যবহার করা হয়। স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি সাধারণত JPA (Java Persistence API) বা Hibernate ব্যবহার করে ডেটাবেজের সাথে ইন্টিগ্রেটেড থাকে, এবং এগুলি সঠিকভাবে পরীক্ষা করা গুরুত্বপূর্ণ। স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য JUnit এবং Spring Test ফ্রেমওয়ার্কগুলো খুবই কার্যকর।
Unit Testing-এ মূলত Mockito ব্যবহার করা হয়, যা ডেটাবেজ ইন্টারঅ্যাকশন ছাড়া ডোমেইন লজিক পরীক্ষা করতে সহায়তা করে। @MockBean অ্যানোটেশন স্প্রিং বুটের মধ্যে মক অবজেক্ট তৈরির জন্য ব্যবহৃত হয়, যা ডেটাবেজ অ্যাক্সেস বা অন্যান্য বাইরের সিস্টেমের সাথে ইন্টিগ্রেশন ছাড়া পরীক্ষা চালায়।
ধরা যাক, আমাদের একটি EmployeeService
ক্লাস রয়েছে, যেটি EmployeeRepository
এর মাধ্যমে ডেটাবেজের সাথে কাজ করে। আমরা EmployeeService
ক্লাসের মেথড getEmployeeById
পরীক্ষা করতে চাই।
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(MockitoExtension.class)
public class EmployeeServiceTest {
@Mock
private EmployeeRepository employeeRepository;
@InjectMocks
private EmployeeService employeeService;
@Test
public void testGetEmployeeById() {
Employee employee = new Employee(1L, "John Doe", "Engineering");
when(employeeRepository.findById(1L)).thenReturn(Optional.of(employee));
Employee result = employeeService.getEmployeeById(1L);
assertNotNull(result);
assertEquals("John Doe", result.getName());
verify(employeeRepository, times(1)).findById(1L); // Verify that the method was called once
}
}
এখানে, আমরা Mockito
ব্যবহার করে EmployeeRepository
কে মক করেছি এবং EmployeeService
-এর getEmployeeById
মেথডটিকে পরীক্ষা করেছি। when(...).thenReturn(...)
ব্যবহার করে মক অবজেক্টের রিটার্ন ভ্যালু সেট করা হয়েছে, এবং verify(...)
ব্যবহার করে নিশ্চিত করা হয়েছে যে মেথডটি একবারই কল হয়েছে।
Integration Testing-এ পুরো সিস্টেমের কার্যকারিতা পরীক্ষা করা হয়, যেখানে ডেটাবেজের সাথে ইন্টিগ্রেশনও অন্তর্ভুক্ত থাকে। স্প্রিং বুটে, @SpringBootTest
অ্যানোটেশন ব্যবহার করে ডেটাবেজের সাথে পুরো অ্যাপ্লিকেশন পরীক্ষা করা যায়। ডেটাবেজের জন্য H2 অথবা HSQLDB এর মতো ইন-মেমরি ডেটাবেজ ব্যবহার করা যেতে পারে, যাতে পরীক্ষার সময় কোন স্থায়ী ডেটাবেজে কোনো পরিবর্তন না ঘটে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class EmployeeRepositoryIntegrationTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testSaveEmployee() {
Employee employee = new Employee("Jane Doe", "Marketing");
Employee savedEmployee = employeeRepository.save(employee);
assertNotNull(savedEmployee);
assertEquals("Jane Doe", savedEmployee.getName());
}
@Test
public void testFindEmployeeById() {
Employee employee = new Employee("Alice", "HR");
employeeRepository.save(employee);
Employee foundEmployee = employeeRepository.findById(employee.getId()).orElse(null);
assertNotNull(foundEmployee);
assertEquals("Alice", foundEmployee.getName());
}
}
এখানে, @SpringBootTest অ্যানোটেশন ব্যবহার করা হয়েছে, যা পুরো অ্যাপ্লিকেশন কনটেক্সট লোড করে এবং ডেটাবেজ অপারেশনগুলোকে ইন-মেমরি ডেটাবেজে পরীক্ষা করতে সহায়তা করে। employeeRepository.save()
এবং employeeRepository.findById()
ব্যবহার করে ডেটাবেজে সংরক্ষণ এবং খোঁজা হয়েছে।
এটি H2 ডেটাবেজের মাধ্যমে পরীক্ষিত হতে পারে, যেটি স্প্রিং বুটের মধ্যে স্বয়ংক্রিয়ভাবে কনফিগার করা যায়।
@DataJpaTest স্প্রিং বুটে ডেটাবেজ সম্পর্কিত পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি শুধুমাত্র JPA উপাদান (Repository, Entity) এর জন্য কনটেক্সট লোড করে এবং দ্রুত পরীক্ষা চালানোর জন্য ডেটাবেজ সেটআপ করে।
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
public class EmployeeRepositoryTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testSaveAndFindEmployee() {
Employee employee = new Employee("Bob", "Sales");
employeeRepository.save(employee);
Employee foundEmployee = employeeRepository.findById(employee.getId()).orElse(null);
assertNotNull(foundEmployee);
assertEquals("Bob", foundEmployee.getName());
}
}
এখানে, @DataJpaTest
অ্যানোটেশন ব্যবহার করা হয়েছে, যা শুধুমাত্র JPA সম্পর্কিত কম্পোনেন্ট পরীক্ষা করতে ডেটাবেজ কনটেক্সট লোড করে এবং ইন-মেমরি ডেটাবেজ ব্যবহার করে। employeeRepository.save()
এবং employeeRepository.findById()
ব্যবহার করে ডেটাবেজে সঞ্চয় এবং সন্ধান কার্যকর করা হয়েছে।
স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলির পরীক্ষার জন্য Unit Testing এবং Integration Testing দুটি পদ্ধতি ব্যবহার করা হয়। @MockBean
, @SpringBootTest
, এবং @DataJpaTest
এর মতো অ্যানোটেশনগুলোর মাধ্যমে আপনি সহজেই ORM অ্যাপ্লিকেশনের বিভিন্ন অংশ পরীক্ষা করতে পারেন। ইন-মেমরি ডেটাবেজ ব্যবহার করে সিস্টেমের কার্যকারিতা নিশ্চিত করা এবং JPA বা Hibernate-এর সাথে সম্পর্কিত অপারেশনগুলো সঠিকভাবে কাজ করছে কি না তা পরীক্ষা করা খুবই গুরুত্বপূর্ণ।
Spring Boot ORM (Object-Relational Mapping) অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing খুবই গুরুত্বপূর্ণ। এগুলো ব্যবহার করে অ্যাপ্লিকেশনটির কার্যকারিতা এবং ডেটাবেস সংক্রান্ত কার্যক্রম সঠিকভাবে পরীক্ষা করা যায়। Spring Boot ORM অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing-এর জন্য সাধারণত JUnit এবং Mockito ব্যবহার করা হয়।
Unit Testing হল একটি নির্দিষ্ট ইউনিট বা ফাংশন (যেমন সার্ভিস ক্লাস, মেথড) পরীক্ষা করার প্রক্রিয়া। ORM অ্যাপ্লিকেশনে, সাধারণত DAO (Data Access Object) বা Repository লেয়ার টেস্ট করা হয়, যেখানে ডেটাবেস অপারেশন বা জেএপি-এর লজিক প্রক্রিয়া পরীক্ষা করা হয়। Mockito
মক (Mock) অবজেক্ট ব্যবহার করে ডেটাবেস বা রেপোজিটরি লেয়ারের ওপর টেস্ট করা হয়।
Repository Layer হলো ডেটাবেস অ্যাক্সেসের অংশ, এবং এটি JUnit এবং Mockito দিয়ে টেস্ট করা হয়। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে UserRepository
টেস্ট করা হচ্ছে।
Dependency for Unit Test (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.6.1</version>
<scope>test</scope>
</dependency>
UserRepository Interface (Repository Layer):
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
Unit Test (Mockito Example):
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserRepositoryTest {
@Mock
private UserRepository userRepository; // Mock Repository
@InjectMocks
private UserService userService; // Inject Mocks into Service
@Test
public void testFindByName() {
User user = new User(1L, "John Doe", "john@example.com");
when(userRepository.findByName("John Doe")).thenReturn(user);
User result = userService.findByName("John Doe");
assertEquals("John Doe", result.getName());
}
}
ব্যাখ্যা:
@Mock
দিয়ে UserRepository
মক করা হয়েছে।@InjectMocks
দিয়ে মক অবজেক্টকে UserService
ক্লাসে ইনজেক্ট করা হয়েছে।when(...).thenReturn(...)
দিয়ে মক অবজেক্টের প্রত্যাশিত আউটপুট দেওয়া হয়েছে।assertEquals
দিয়ে টেস্টের ফলাফল যাচাই করা হয়েছে।Integration Testing হল একাধিক ইউনিটের একত্রে কার্যকারিতা পরীক্ষা করার প্রক্রিয়া, যেখানে পুরো অ্যাপ্লিকেশন বা একটি নির্দিষ্ট লেয়ার (যেমন, ডেটাবেস সংযোগ) পরীক্ষা করা হয়। Spring Boot ORM অ্যাপ্লিকেশনে ডেটাবেস সংক্রান্ত ইনটিগ্রেশন টেস্ট করার জন্য @SpringBootTest, @DataJpaTest, এবং @AutoConfigureTestDatabase ব্যবহার করা হয়।
Spring Boot ORM অ্যাপ্লিকেশনে @DataJpaTest এনোটেশন ব্যবহার করা হয়, যা শুধুমাত্র JPA-র জন্য প্রয়োজনীয় কনফিগারেশন করে এবং টেস্ট রান করার সময় এক্সটার্নাল ডেটাবেস ব্যবহার করা হয় না। Spring Boot H2 Database বা ইন-মেমরি ডেটাবেস ব্যবহার করে এই টেস্ট চালানো যায়।
Dependency for Integration Test (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
User Entity:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
UserRepository:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
Integration Test:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@DataJpaTest
public class UserRepositoryIntegrationTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveAndFindUser() {
User user = new User(1L, "John Doe", "john.doe@example.com");
userRepository.save(user);
User foundUser = userRepository.findByName("John Doe");
assertNotNull(foundUser);
assertEquals("John Doe", foundUser.getName());
}
}
ব্যাখ্যা:
@DataJpaTest
দ্বারা Spring Boot JPA টেস্ট কনফিগার করা হয়, যেখানে H2 বা ইন-মেমরি ডেটাবেস ব্যবহৃত হয়।@Autowired
দ্বারা UserRepository
ইনজেক্ট করা হয়।User
অবজেক্ট তৈরি এবং সেভ করে পরে তা খুঁজে বের করা হয়েছে।কিছু ক্ষেত্রে, আপনি ইন-মেমরি ডেটাবেসের পরিবর্তে রিয়েল ডেটাবেস ব্যবহার করতে চাইতে পারেন। এতে @AutoConfigureTestDatabase ব্যবহার করা হয়।
Custom Database Test Example:
import org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class CustomDatabaseIntegrationTest {
// Your test methods here
}
ব্যাখ্যা: @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
ব্যবহার করা হলে টেস্ট চলাকালে ডিফল্ট ইন-মেমরি ডেটাবেসের পরিবর্তে আসল ডেটাবেস ব্যবহার করা হবে।
Spring Boot ORM এর Unit এবং Integration Testing গুরুত্বপূর্ণ অংশ, যা অ্যাপ্লিকেশন এবং ডেটাবেস লেয়ারের কার্যকারিতা নিশ্চিত করতে সহায়তা করে। Unit Testing সাধারণত Repository এবং Service লেয়ার টেস্ট করতে ব্যবহৃত হয়, যেখানে Mockito মক অবজেক্ট ব্যবহার করা হয়। Integration Testing Spring Boot এর সাথে ডেটাবেস সংক্রান্ত কার্যক্রম পরীক্ষা করতে ব্যবহৃত হয়, যেখানে @DataJpaTest, @SpringBootTest, এবং @AutoConfigureTestDatabase ব্যবহৃত হয়। Unit এবং Integration Testing এর মাধ্যমে ডেভেলপাররা অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং ভুলমুক্ত রাখতে সক্ষম হয়।
স্প্রিং বুট (Spring Boot) ORM ব্যবহার করে ডাটাবেস সম্পর্কিত বিভিন্ন কার্যক্রম সহজে পরিচালনা করা যায়। কিন্তু প্রকৃত ডাটাবেস ব্যবহারের সময় সিস্টেমের পারফরম্যান্স ও স্থিতিশীলতা পরীক্ষা করা কঠিন হতে পারে। এই কারণে, ইন-মেমরি ডাটাবেস ব্যবহার করে টেস্টিং একটি কার্যকরী পদ্ধতি। H2 ডাটাবেস একটি জনপ্রিয় ইন-মেমরি ডাটাবেস যা স্প্রিং বুট প্রজেক্টে দ্রুত টেস্টিং পরিচালনার জন্য ব্যবহৃত হয়। H2 ডাটাবেসের সবচেয়ে বড় সুবিধা হলো এটি টেস্টিং এর জন্য কনফিগারেশনে সহজ, দ্রুত এবং কম রিসোর্স ব্যবহার করে কাজ করে।
H2 ডাটাবেস ইন-মেমরি ডাটাবেস হিসেবে অনেক সুবিধা প্রদান করে:
স্প্রিং বুটে H2 ডাটাবেস কনফিগার করা খুবই সহজ। প্রাথমিকভাবে, H2 ডাটাবেসকে মেমরি হিসেবে কনফিগার করা হয় এবং টেস্টিংয়ের জন্য এটি অটোমেটিক্যালি ডাটা প্রোসেসিং করতে সাহায্য করে।
H2 ডাটাবেসের জন্য প্রয়োজনীয় ডিপেনডেন্সি pom.xml বা build.gradle ফাইলে যোগ করতে হবে।
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
testImplementation 'com.h2database:h2'
স্প্রিং বুট কনফিগারেশনে ইন-মেমরি ডাটাবেস ব্যবহার করতে application.properties
বা application.yml
ফাইলের মাধ্যমে H2 ডাটাবেস কনফিগার করা যায়।
application.properties
কনফিগারেশন:# H2 ইন-মেমরি ডাটাবেস কনফিগারেশন
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
এখানে, spring.datasource.url
এ mem:testdb
ব্যবহার করা হয়েছে, যার ফলে ডাটাবেসটি শুধুমাত্র মেমরিতে থাকবে এবং অ্যাপ্লিকেশন বন্ধ হওয়ার পর ডাটাবেসটি অটোমেটিক্যালি মুছে যাবে।
স্প্রিং বুটের ইন-মেমরি ডাটাবেস টেস্টিং করতে @DataJpaTest
অ্যানোটেশন ব্যবহার করা হয়। এই অ্যানোটেশনটি শুধুমাত্র JPA সম্পর্কিত টেস্টিং চালায়, অর্থাৎ এটি ডাটাবেস, রেপোজিটরি, এবং ডেটাবেস সম্পর্কিত অন্যান্য কার্যক্রম পরীক্ষার জন্য ব্যবহৃত হয়।
@RunWith(SpringRunner.class)
@DataJpaTest
public class ProductRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private ProductRepository productRepository;
@Test
public void testCreateProduct() {
Product product = new Product("Test Product", 100.0);
entityManager.persist(product);
entityManager.flush();
Product foundProduct = productRepository.findByName("Test Product");
assertThat(foundProduct.getName()).isEqualTo(product.getName());
}
@Test
public void testFindAllProducts() {
Product product1 = new Product("Product 1", 50.0);
Product product2 = new Product("Product 2", 75.0);
entityManager.persist(product1);
entityManager.persist(product2);
entityManager.flush();
List<Product> allProducts = productRepository.findAll();
assertThat(allProducts).hasSize(2).extracting(Product::getName).contains("Product 1", "Product 2");
}
}
এখানে @DataJpaTest
অ্যানোটেশনটি স্প্রিং কনটেইনারে JPA টেস্টিং প্রক্রিয়া পরিচালনা করে এবং H2 ইন-মেমরি ডাটাবেস ব্যবহার করে টেস্ট ফলাফল সরবরাহ করে।
H2 ইন-মেমরি ডাটাবেস স্প্রিং বুট ORM টেস্টিংয়ের জন্য একটি শক্তিশালী এবং কার্যকরী উপায়। এটি ডাটাবেসের জন্য কোনো স্টোরেজ প্রয়োজন না করে দ্রুত এবং সহজে টেস্ট পরিচালনা করতে সহায়তা করে। H2 ডাটাবেস ব্যবহার করে ইন-মেমরি টেস্টিং কনফিগার করা এবং এর মাধ্যমে JPA সম্পর্কিত কার্যক্রম পরীক্ষা করা সহজ। এই প্রক্রিয়া অটোমেটিক্যালি ডেটাবেস পরিষ্কার করে এবং টেস্ট চলাকালীন সময়ে দ্রুত ফলাফল প্রদান করে।
স্প্রিং বুট ORM ব্যবহার করার সময় ডেটাবেস সম্পর্কিত কোডের পরীক্ষার জন্য @DataJpaTest
এবং @MockBean
অ্যানোটেশন দুটি খুবই কার্যকরী। এগুলি স্প্রিং টেস্টিং ফ্রেমওয়ার্কের একটি অংশ, যা JPA রেপোজিটরি, সার্ভিস এবং ডেটাবেস লজিক পরীক্ষা করতে সহায়তা করে। এই টেস্টিং টেকনিকগুলি আপনাকে স্প্রিং বুট অ্যাপ্লিকেশন টেস্ট করতে সহজ উপায় প্রদান করে।
@DataJpaTest
অ্যানোটেশনটি স্প্রিং বুট টেস্টিংয়ের জন্য ব্যবহৃত হয়, যা শুধুমাত্র JPA রেপোজিটরির পরীক্ষা চালায়। এটি ডেটাবেস অপারেশনগুলো পরীক্ষা করার জন্য একটি বিশেষ টেস্ট কনফিগারেশন প্রস্তুত করে, যা ডেটাবেসের সাথে সম্পর্কিত কোডের পরীক্ষার ক্ষেত্রে খুবই কার্যকরী। এটি স্প্রিং কনটেক্সটকে হালকা রাখে এবং শুধু প্রয়োজনীয় কনফিগারেশনগুলো লোড করে, যেমন JPA রেপোজিটরির কোড এবং ডেটাবেস কনফিগারেশন।
এটি ডেটাবেসের সাথে ইন্টিগ্রেশন টেস্টিং করার জন্য ব্যবহার করা হয়, যেখানে স্প্রিং টেস্ট কনফিগারেশন শুধুমাত্র JPA এবং রেপোজিটরি সম্পর্কিত অংশগুলো লোড করবে এবং ডেটাবেসে প্রকৃত অপারেশন করবে না। এটি ডেটাবেসে প্রকৃত ডেটা ইনসার্ট করে টেস্টগুলি সম্পাদন করে।
@DataJpaTest
public class EmployeeRepositoryTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testFindByName() {
Employee employee = new Employee("John", "Doe");
employeeRepository.save(employee);
Employee foundEmployee = employeeRepository.findByName("John");
assertNotNull(foundEmployee);
assertEquals("John", foundEmployee.getFirstName());
}
}
এখানে EmployeeRepositoryTest
একটি টেস্ট ক্লাস, যেখানে @DataJpaTest
অ্যানোটেশন ব্যবহার করা হয়েছে। এটি EmployeeRepository
কে ইনজেক্ট করে এবং ডেটাবেসে একটি নতুন Employee
সেভ করার পরে তা পরীক্ষা করা হয়েছে।
@MockBean
অ্যানোটেশনটি স্প্রিং বুট টেস্টিংয়ে ব্যবহৃত হয়, যেখানে আপনি আপনার সার্ভিস ক্লাসের ডিপেনডেন্সি হিসেবে মক অবজেক্ট ইনজেক্ট করতে পারেন। এটি সাধারণত সার্ভিস লেয়ার এবং কন্ট্রোলার লেয়ারের টেস্টিংয়ে ব্যবহৃত হয়, যেখানে ডেটাবেসে প্রকৃত অপারেশন করার প্রয়োজন নেই।
@MockBean
অ্যানোটেশনটি মক সার্ভিস বা রেপোজিটরি তৈরি করে এবং আপনার টেস্ট ক্লাসে ইনজেক্ট করে। এতে স্প্রিং কনটেক্সটের মধ্যে ওই মক অবজেক্ট ব্যবহৃত হয়, তবে এটি মূল ডেটাবেসে পরিবর্তন বা সেভ করবে না।
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmployeeServiceTest {
@MockBean
private EmployeeRepository employeeRepository;
@Autowired
private EmployeeService employeeService;
@Test
public void testGetEmployeeByName() {
Employee mockEmployee = new Employee("John", "Doe");
Mockito.when(employeeRepository.findByName("John")).thenReturn(mockEmployee);
Employee employee = employeeService.getEmployeeByName("John");
assertNotNull(employee);
assertEquals("John", employee.getFirstName());
}
}
এখানে @MockBean
ব্যবহার করে EmployeeRepository
কে মক করা হয়েছে, যাতে স্প্রিং কনটেক্সটে মক অবজেক্ট ইনজেক্ট করা হয়। Mockito.when()
ব্যবহার করে findByName
মেথডের জন্য একটি মক ভ্যালু রিটার্ন করা হয়েছে, এবং employeeService.getEmployeeByName()
কল করার সময় প্রকৃত ডেটাবেস অপারেশন না করে মক ডেটা রিটার্ন হয়েছে।
@DataJpaTest
ব্যবহার করার সময় টেস্ট ডেটাবেস ব্যবহৃত হয়, তাই টেস্ট ফাইলগুলি হালনাগাদ থাকতে হবে এবং টেস্টের শেষে ডেটাবেস পরিষ্কার করা উচিত।@MockBean
ব্যবহার করার সময় এটি কেবলমাত্র সার্ভিস এবং কন্ট্রোলার লেয়ার টেস্ট করতে কার্যকরী, যেখানে ডেটাবেস ইন্টারঅ্যাকশন না করা উচিত।স্প্রিং বুট ORM টেস্টিংয়ের জন্য @DataJpaTest
এবং @MockBean
খুবই গুরুত্বপূর্ণ টুলস, যা ডেটাবেস ইন্টিগ্রেশন টেস্টিং এবং সার্ভিস লেয়ার টেস্টিংয়ে ব্যবহার করা হয়। এগুলি ডেটাবেস অপারেশনগুলো মক বা প্রকৃত ডেটাবেসের মাধ্যমে পরীক্ষা করতে সাহায্য করে।
স্প্রিং বুট ওআরএম (Spring Boot ORM) অ্যাপ্লিকেশন টেস্টিং একটি গুরুত্বপূর্ণ অংশ যা আমাদের নিশ্চিত করতে সাহায্য করে যে আমাদের ডেটাবেস অপারেশনগুলি সঠিকভাবে কাজ করছে। ORM (Object-Relational Mapping) প্রযুক্তি ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনের ডেটাবেসের সাথে যোগাযোগ এবং ডেটা ম্যানিপুলেশন সাধারণত JPA (Java Persistence API) বা Hibernate এর মাধ্যমে করা হয়। এই প্রযুক্তির সঠিক কার্যকারিতা নিশ্চিত করতে হলে টেস্টিং অত্যন্ত গুরুত্বপূর্ণ।
ORM অ্যাপ্লিকেশন টেস্টিং হল সেই প্রক্রিয়া, যেখানে ORM (Object-Relational Mapping) প্রযুক্তি ব্যবহার করে তৈরি করা অ্যাপ্লিকেশনকে সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করা হয়। এখানে আমরা সাধারণত ডেটাবেস অপারেশন যেমন ডেটা সন্নিবেশ (insert), আপডেট (update), মুছে ফেলা (delete), এবং অনুসন্ধান (search) পরীক্ষা করি।
স্প্রিং বুট ORM অ্যাপ্লিকেশন টেস্ট করার জন্য আমরা সাধারণত @DataJpaTest অ্যানোটেশন ব্যবহার করি, যা শুধুমাত্র JPA রিলেটেড টেস্টিং চালায় এবং ডেটাবেসে প্রয়োজনীয় পরিবর্তন করা হয়।
প্রথমে, একটি স্প্রিং বুট টেস্ট কনফিগারেশন তৈরি করতে হবে। এটি ডেটাবেস কনফিগারেশন ও রেপোজিটরি টেস্টের জন্য ব্যবহার করা হবে।
@SpringBootTest
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testCreateUser() {
User user = new User();
user.setUsername("JohnDoe");
user.setEmail("john@example.com");
User savedUser = userRepository.save(user);
assertNotNull(savedUser.getId()); // নিশ্চিত করা যে ID সঠিকভাবে তৈরি হয়েছে
assertEquals("JohnDoe", savedUser.getUsername()); // নিশ্চিত করা যে সঠিক ইউজারনেম সন্নিবেশিত হয়েছে
}
}
এই টেস্টে, আমরা একটি নতুন User
অবজেক্ট তৈরি করেছি এবং সেটি userRepository.save()
পদ্ধতির মাধ্যমে ডেটাবেসে সন্নিবেশিত করেছি। তারপর আমরা নিশ্চিত করেছি যে ডেটাবেসে সঠিকভাবে ইউজার সন্নিবেশিত হয়েছে কিনা।
স্প্রিং বুট অটোমেটিক্যালি একটি এমবেডেড ডেটাবেস ব্যবহার করে (যেমন H2) @DataJpaTest
এর মধ্যে, কিন্তু আপনি চাইলে কাস্টম ডেটাবেস কনফিগারেশনও করতে পারেন। উদাহরণস্বরূপ, H2 ডেটাবেসের মাধ্যমে টেস্ট করা:
@Configuration
public class TestConfig {
@Bean
public DataSource dataSource() {
return new H2DataSource();
}
}
এভাবে, টেস্ট ডেটাবেসের সাথে আপনার অ্যাপ্লিকেশনকে সংযুক্ত করতে পারবেন এবং টেস্ট চলাকালে কোনো প্রকৃত ডেটাবেসে প্রভাব পড়বে না।
ORM অ্যাপ্লিকেশন টেস্টিংয়ের জন্য CRUD (Create, Read, Update, Delete) অপারেশনগুলো সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করা খুবই গুরুত্বপূর্ণ। নিচে একটি পূর্ণাঙ্গ উদাহরণ দেওয়া হলো।
@SpringBootTest
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testCreateUser() {
User user = new User();
user.setUsername("JaneDoe");
user.setEmail("jane@example.com");
User savedUser = userRepository.save(user);
assertNotNull(savedUser.getId()); // নিশ্চিত করা যে ID সঠিকভাবে তৈরি হয়েছে
}
@Test
public void testReadUser() {
User user = userRepository.findByUsername("JaneDoe");
assertNotNull(user); // নিশ্চিত করা যে ইউজারটি পাওয়া গেছে
assertEquals("JaneDoe", user.getUsername());
}
@Test
public void testUpdateUser() {
User user = userRepository.findByUsername("JaneDoe");
user.setEmail("jane_updated@example.com");
userRepository.save(user);
User updatedUser = userRepository.findByUsername("JaneDoe");
assertEquals("jane_updated@example.com", updatedUser.getEmail()); // নিশ্চিত করা যে ইমেইল সঠিকভাবে আপডেট হয়েছে
}
@Test
public void testDeleteUser() {
User user = userRepository.findByUsername("JaneDoe");
userRepository.delete(user);
User deletedUser = userRepository.findByUsername("JaneDoe");
assertNull(deletedUser); // নিশ্চিত করা যে ইউজারটি মুছে ফেলা হয়েছে
}
}
এখানে, CRUD অপারেশনগুলো সঠিকভাবে কাজ করছে কিনা তা টেস্ট করা হয়েছে।
টেস্টের ফলাফল যাচাই করার জন্য আপনি assert পদ্ধতি ব্যবহার করতে পারেন, যা নিশ্চিত করে যে আপনার ডেটাবেস অপারেশন সঠিকভাবে কাজ করছে।
assertNotNull()
: এটি যাচাই করে যে কোনো অবজেক্ট নাল নয়।assertEquals()
: এটি যাচাই করে যে দুটি মান সমান কিনা।assertNull()
: এটি যাচাই করে যে কোনো অবজেক্ট নাল কি না।স্প্রিং বুট ORM অ্যাপ্লিকেশন টেস্টিং, বিশেষত JPA এর মাধ্যমে ডেটাবেস অপারেশনগুলো পরীক্ষা করার জন্য খুবই গুরুত্বপূর্ণ। আপনি @DataJpaTest এবং @SpringBootTest অ্যানোটেশন ব্যবহার করে সহজেই ORM টেস্টিং করতে পারেন। CRUD অপারেশনগুলো, টেস্ট ডেটাবেস, এবং ডেটাবেসের সাথে সম্পর্কিত টেস্ট কনফিগারেশন সঠিকভাবে টেস্ট করার মাধ্যমে আপনি আপনার স্প্রিং বুট ORM অ্যাপ্লিকেশনটি নির্ভরযোগ্য এবং পারফরম্যান্স-ভিত্তিক বানাতে পারেন।
Read more