Spring Boot JPA এর Unit এবং Integration Testing

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Testing Spring Boot JPA Applications
281

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: পুরো অ্যাপ্লিকেশন কনটেক্সট লোড করে বাস্তব ডেটাবেসের সাথে পরীক্ষা করা হয়, যেখানে ডাটাবেস অপারেশনসহ অন্যান্য সিস্টেমের সঙ্গে একত্রে পরীক্ষা করা হয়।

এই টেস্টিং কৌশলগুলি আপনার স্প্রিং বুট জেপিএ অ্যাপ্লিকেশনকে আরও নির্ভরযোগ্য এবং উন্নত করে তোলে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...