Spring Boot JPA Testing হল Spring Boot অ্যাপ্লিকেশনে JPA (Java Persistence API) ভিত্তিক ডেটাবেস অপারেশন পরীক্ষা করার প্রক্রিয়া। Spring Boot JPA Testing সাধারণত JUnit এবং Mockito এর মাধ্যমে করা হয়, যেখানে @DataJpaTest অ্যানোটেশন ব্যবহার করে JPA সম্পর্কিত টেস্ট কেস লেখা হয়। এই টেস্ট কেসগুলিতে ডেটাবেসে ইনসার্ট, আপডেট, ডিলিট, এবং রিড অপারেশন পরীক্ষা করা হয়।
Spring Boot JPA Testing এর মূল বিষয়
- @DataJpaTest: এই অ্যানোটেশনটি Spring Data JPA-র টেস্টিংয়ের জন্য ব্যবহৃত হয়। এটি শুধুমাত্র JPA রিলেটেড টেস্টিং কার্যক্রমকে সক্রিয় করে, যেমন রেপোজিটরি এবং ডেটাবেস সংক্রান্ত টেস্টিং। এই অ্যানোটেশনটি Spring Boot Test এর একটি অংশ এবং JUnit এর সাথে কাজ করে।
- In-Memory Database: টেস্টিংয়ের জন্য সাধারণত ইন-মেমরি ডেটাবেস (যেমন H2, HSQL) ব্যবহার করা হয় যাতে ডেটাবেসের অবস্থা প্রকৃত ডেটাবেসের সাথে মিল না করে এবং টেস্ট শেষে ডেটাবেস ক্লিন করা যায়।
- Repository Testing: Spring Data JPA রেপোজিটরি এবং কুয়েরি মেথডগুলির কার্যকারিতা যাচাই করার জন্য repository layer টেস্ট করা হয়।
- Mocking: Mockito ব্যবহার করে নির্দিষ্ট ডিপেনডেন্সি মক করা যেতে পারে। তবে, JPA-র ক্ষেত্রে @MockBean বা @Autowired দিয়ে সরাসরি রেপোজিটরি ইনজেক্ট করা হয়।
Spring Boot JPA Testing: উদাহরণ
ধরা যাক, আপনার একটি Employee Entity রয়েছে এবং আপনি এটি দিয়ে কিছু ডেটাবেস অপারেশন পরীক্ষা করবেন।
১. Entity Class: Employee
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String position;
// Getters এবং Setters
}
২. Repository Interface: EmployeeRepository
Spring Data JPA-র মাধ্যমে EmployeeRepository ইন্টারফেস তৈরি করা হবে, যেখানে কিছু সাধারণ ডেটাবেস অপারেশন থাকবে:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
List<Employee> findByPosition(String position);
}
৩. Service Layer: EmployeeService
EmployeeService ক্লাসে রেপোজিটরি ব্যবহার করে কিছু সার্ভিস ফাংশন তৈরি করা হবে:
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee saveEmployee(Employee employee) {
return employeeRepository.save(employee);
}
public List<Employee> getEmployeesByPosition(String position) {
return employeeRepository.findByPosition(position);
}
public void deleteEmployee(Long id) {
employeeRepository.deleteById(id);
}
}
Spring Boot JPA Testing - Test Class
Spring Boot JPA Testing করতে @DataJpaTest অ্যানোটেশন ব্যবহার করা হবে। আমরা রেপোজিটরি এবং সার্ভিস স্তরের কার্যকারিতা যাচাই করার জন্য টেস্ট কেস তৈরি করব।
১. Repository Testing:
@DataJpaTest
public class EmployeeRepositoryTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testSaveEmployee() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setPosition("Developer");
Employee savedEmployee = employeeRepository.save(employee);
assertNotNull(savedEmployee);
assertEquals("John Doe", savedEmployee.getName());
}
@Test
public void testFindByPosition() {
Employee employee1 = new Employee();
employee1.setName("John Doe");
employee1.setPosition("Developer");
employeeRepository.save(employee1);
Employee employee2 = new Employee();
employee2.setName("Jane Doe");
employee2.setPosition("Manager");
employeeRepository.save(employee2);
List<Employee> developers = employeeRepository.findByPosition("Developer");
assertEquals(1, developers.size());
assertEquals("John Doe", developers.get(0).getName());
}
@Test
public void testDeleteEmployee() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setPosition("Developer");
Employee savedEmployee = employeeRepository.save(employee);
employeeRepository.delete(savedEmployee);
Optional<Employee> deletedEmployee = employeeRepository.findById(savedEmployee.getId());
assertFalse(deletedEmployee.isPresent());
}
}
ব্যাখ্যা:
- testSaveEmployee:
Employeeঅবজেক্টটিsave()মেথড ব্যবহার করে ডেটাবেসে সেভ করা হচ্ছে। টেস্টটি যাচাই করে যে সেভ হওয়া অবজেক্টেরnameসঠিকভাবে সেট হয়েছে। - testFindByPosition:
findByPositionমেথডের মাধ্যমে ডেটাবেসেpositionঅনুসারেEmployeeখুঁজে বের করা হচ্ছে। এটি যাচাই করে যেpositionএর মানের সাথে মেলে এমন ডেটা পাওয়া গেছে কিনা। - testDeleteEmployee:
deleteByIdমেথড ব্যবহার করেEmployeeমুছে ফেলা হচ্ছে এবং পরে যাচাই করা হচ্ছে যে ডেটাবেসে ঐEmployeeঅবজেক্টটি আর নেই।
২. Service Layer Testing:
@SpringBootTest
public class EmployeeServiceTest {
@Autowired
private EmployeeService employeeService;
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testSaveEmployee() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setPosition("Developer");
Employee savedEmployee = employeeService.saveEmployee(employee);
assertNotNull(savedEmployee);
assertEquals("John Doe", savedEmployee.getName());
}
@Test
public void testGetEmployeesByPosition() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setPosition("Developer");
employeeRepository.save(employee);
List<Employee> developers = employeeService.getEmployeesByPosition("Developer");
assertEquals(1, developers.size());
assertEquals("John Doe", developers.get(0).getName());
}
@Test
public void testDeleteEmployee() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setPosition("Developer");
Employee savedEmployee = employeeRepository.save(employee);
employeeService.deleteEmployee(savedEmployee.getId());
Optional<Employee> deletedEmployee = employeeRepository.findById(savedEmployee.getId());
assertFalse(deletedEmployee.isPresent());
}
}
ব্যাখ্যা:
- testSaveEmployee:
EmployeeServiceএরsaveEmployeeমেথডেEmployeeঅবজেক্ট সেভ করা হচ্ছে এবং টেস্টটি যাচাই করছে সেভ করা অবজেক্টেরnameসঠিকভাবে ইনজেক্ট হয়েছে কিনা। - testGetEmployeesByPosition:
EmployeeServiceএরgetEmployeesByPositionমেথডেpositionঅনুসারে ডেটা খুঁজে বের করা হচ্ছে এবং টেস্টটি যাচাই করছে যে সঠিকEmployeeপাওয়া গেছে। - testDeleteEmployee:
EmployeeServiceএরdeleteEmployeeমেথডেEmployeeমুছে ফেলা হচ্ছে এবং পরে যাচাই করা হচ্ছে যে সেইEmployeeআর ডেটাবেসে নেই।
Spring Boot JPA Testing-এ Best Practices
- @DataJpaTest: শুধুমাত্র JPA সম্পর্কিত টেস্টিং করতে এই অ্যানোটেশন ব্যবহার করুন। এটি টেস্ট কনটেক্সটকে দ্রুত তৈরি করতে সাহায্য করে এবং ইন-মেমরি ডেটাবেস ব্যবহার করে টেস্টিং করে।
- Transactional Tests: টেস্টের শেষে ডেটাবেসের অবস্থা সাফ রাখতে @Transactional ব্যবহার করুন, যা টেস্ট শেষে সব পরিবর্তন রোলব্যাক করে।
- In-Memory Databases: টেস্টিংয়ের জন্য H2 বা HSQL এর মতো ইন-মেমরি ডেটাবেস ব্যবহার করুন, যাতে টেস্টের পরে ডেটাবেস পরিষ্কার থাকে।
- Mocking: যখন সার্ভিস স্তরের টেস্ট করছেন, তখন Mockito ব্যবহার করে ডিপেনডেন্সিগুলো মক করতে পারেন।
সারাংশ
Spring Boot JPA Testing হল Spring Boot অ্যাপ্লিকেশনগুলিতে JPA সম্পর্কিত ডেটাবেস অপারেশনগুলির সঠিক কার্যকারিতা যাচাই করার প্রক্রিয়া। @DataJpaTest এবং @SpringBootTest অ্যানোটেশন ব্যবহার করে আমরা রেপোজিটরি এবং সার্ভিস স্তরের টেস্টিং করতে পারি। Spring Boot JPA Testing ডেটাবেসের CRUD অপারেশন, কাস্টম কুয়েরি এবং বিভিন্ন এক্সসেপশন হ্যান্ডলিং পরীক্ষা করতে সহায়তা করে।
Read more