Spring Boot JPA অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing অত্যন্ত গুরুত্বপূর্ণ, কারণ এই পরীক্ষাগুলি আপনার ডেটাবেস এবং অ্যাপ্লিকেশনের লজিক্যাল অংশগুলির কার্যকারিতা নিশ্চিত করে। JUnit এবং Spring Test ফ্রেমওয়ার্কের মাধ্যমে স্প্রিং বুট জেপিএ অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing করা হয়।
এখানে আমরা দেখব কিভাবে Spring Boot JPA অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing করা যায়।
Step 1: Maven ডিপেনডেন্সি যোগ করা
Unit এবং Integration Testing করার জন্য প্রয়োজনীয় ডিপেনডেন্সি আপনার pom.xml ফাইলে যোগ করুন।
<dependencies>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Spring Boot Starter Test (For Unit and Integration Testing) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- H2 Database (In-memory Database for Testing) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
এখানে, spring-boot-starter-test ডিপেনডেন্সিটি JUnit, Mockito, Spring Test, Hamcrest ইত্যাদি টেস্টিং লাইব্রেরি অন্তর্ভুক্ত করে, যা Unit এবং Integration Testing-এর জন্য ব্যবহৃত হবে। এছাড়া, h2 ডাটাবেস ইন-মেমরি ডাটাবেস হিসেবে ব্যবহার করা হচ্ছে, যাতে টেস্টিংয়ের সময় একটি ডেডিকেটেড ডাটাবেস তৈরি না করতে হয়।
Step 2: Unit Testing
Unit Testing সাধারণত সিঙ্গল ক্লাসের উপর পরীক্ষা করা হয় এবং বাহ্যিক ডিপেনডেন্সির উপর নির্ভরশীলতা কমাতে Mockito ব্যবহৃত হয়। এখানে আমরা ProductService এর একটি সিম্পল ইউনিট টেস্ট তৈরি করব।
Service Class:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Product getProductById(Long id) {
return productRepository.findById(id).orElse(null);
}
}
ProductService Unit Test:
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class ProductServiceTest {
@Mock
private ProductRepository productRepository;
@InjectMocks
private ProductService productService;
private Product product;
@BeforeEach
public void setUp() {
product = new Product(1L, "Test Product", 100.0);
}
@Test
public void testSaveProduct() {
when(productRepository.save(product)).thenReturn(product);
Product savedProduct = productService.saveProduct(product);
assertNotNull(savedProduct);
assertEquals("Test Product", savedProduct.getName());
}
@Test
public void testGetProductById() {
when(productRepository.findById(1L)).thenReturn(Optional.of(product));
Product foundProduct = productService.getProductById(1L);
assertNotNull(foundProduct);
assertEquals("Test Product", foundProduct.getName());
}
}
এখানে, Mockito ব্যবহার করে ProductRepository এর মক তৈরি করা হয়েছে এবং ProductService ক্লাসের মেথডগুলির টেস্ট করা হয়েছে।
Step 3: Integration Testing
Integration Testing এর মাধ্যমে আমরা একটি সম্পূর্ণ অ্যাপ্লিকেশন স্তরের পরীক্ষা করি, যেখানে ডাটাবেসসহ অন্যান্য কম্পোনেন্টগুলি একত্রে কাজ করে। স্প্রিং বুটে @SpringBootTest অ্যানোটেশন ব্যবহার করে আমরা সহজেই Integration Test করতে পারি।
Integration Test for ProductService:
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.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
public class ProductServiceIntegrationTest {
@Autowired
private ProductService productService;
@Autowired
private ProductRepository productRepository;
@Test
public void testSaveProduct() {
Product product = new Product(1L, "Integration Test Product", 150.0);
Product savedProduct = productService.saveProduct(product);
assertNotNull(savedProduct);
assertEquals("Integration Test Product", savedProduct.getName());
}
@Test
public void testGetProductById() {
Product product = new Product(1L, "Integration Test Product", 150.0);
productService.saveProduct(product);
Product foundProduct = productService.getProductById(1L);
assertNotNull(foundProduct);
assertEquals("Integration Test Product", foundProduct.getName());
}
}
এখানে, @SpringBootTest অ্যানোটেশন ব্যবহার করা হয়েছে যাতে পুরো অ্যাপ্লিকেশন কনটেক্সট লোড হয় এবং এক্সটেন্ডেড টেস্ট করা যায়। @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) দিয়ে আমরা একটি ইন-মেমরি ডাটাবেস ব্যবহার করছি, যাতে টেস্টের সময় ডাটাবেসের কোনো রিয়েল কনফিগারেশন প্রয়োজন না হয়।
Step 4: Test Configuration
টেস্ট করার সময় @SpringBootTest এর সাথে ডাটাবেসের কনফিগারেশন নির্দিষ্ট করা হলে, ইন-মেমরি ডাটাবেস বা অন্যান্য ডাটাবেস কনফিগারেশন কার্যকর করা যেতে পারে। এখানে H2 Database ব্যবহার করা হচ্ছে।
# application-test.properties (For Integration Tests)
spring.datasource.url=jdbc:h2:mem:testdb
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=create-drop
এখানে, spring.jpa.hibernate.ddl-auto=create-drop ব্যবহার করলে টেস্টের শুরুতে ডাটাবেস স্কিমা তৈরি হবে এবং টেস্টের শেষে তা মুছে ফেলা হবে।
Step 5: Running Tests
স্প্রিং বুট অ্যাপ্লিকেশনে টেস্ট রান করার জন্য, আপনি নিচের কমান্ড ব্যবহার করতে পারেন:
Maven:
mvn test
Gradle:
gradle test
সারাংশ
স্প্রিং বুট জেপিএ (Spring Boot JPA) অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing গুরুত্বপূর্ণ ভূমিকা পালন করে, বিশেষ করে যখন আপনার ডেটাবেসের সাথে কাজ করার জন্য CRUD অপারেশনগুলো যাচাই করতে হয়। JUnit, Mockito, এবং Spring Test ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনগুলির কার্যকারিতা পরীক্ষা করা হয়।
- Unit Testing: একক কম্পোনেন্টের (যেমন,
ServiceবাRepository) পরীক্ষা করা হয়, যেখানে বাইরের ডিপেনডেন্সি মক করা হয়। - Integration Testing: পুরো অ্যাপ্লিকেশন কনটেক্সট লোড করে বাস্তব ডেটাবেসের সাথে পরীক্ষা করা হয়, যেখানে ডাটাবেস অপারেশনসহ অন্যান্য সিস্টেমের সঙ্গে একত্রে পরীক্ষা করা হয়।
এই টেস্টিং কৌশলগুলি আপনার স্প্রিং বুট জেপিএ অ্যাপ্লিকেশনকে আরও নির্ভরযোগ্য এবং উন্নত করে তোলে।
Read more