Testing Spring Boot ORM Applications

Java Technologies - স্প্রিং বুট ওআরএম (Spring Boot ORM)
109
109

স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য Unit Testing এবং Integration Testing দুটি প্রধান পদ্ধতি ব্যবহার করা হয়। স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি সাধারণত JPA (Java Persistence API) বা Hibernate ব্যবহার করে ডেটাবেজের সাথে ইন্টিগ্রেটেড থাকে, এবং এগুলি সঠিকভাবে পরীক্ষা করা গুরুত্বপূর্ণ। স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলি পরীক্ষা করার জন্য JUnit এবং Spring Test ফ্রেমওয়ার্কগুলো খুবই কার্যকর।


স্প্রিং বুট ORM অ্যাপ্লিকেশনের জন্য পরীক্ষার প্রকারভেদ

  1. Unit Testing: এই ধরনের পরীক্ষায় একক মেথড বা কম্পোনেন্ট পরীক্ষা করা হয়, যা ডেটাবেজের সাথে সংযুক্ত হয় না।
  2. Integration Testing: এই ধরনের পরীক্ষায় পুরো অ্যাপ্লিকেশন বা সিস্টেমের বিভিন্ন কম্পোনেন্টের মধ্যে ইন্টিগ্রেশন পরীক্ষা করা হয়, যাতে ডেটাবেসও অন্তর্ভুক্ত থাকে।

স্প্রিং বুট ORM অ্যাপ্লিকেশনে Unit Testing

Unit Testing-এ মূলত Mockito ব্যবহার করা হয়, যা ডেটাবেজ ইন্টারঅ্যাকশন ছাড়া ডোমেইন লজিক পরীক্ষা করতে সহায়তা করে। @MockBean অ্যানোটেশন স্প্রিং বুটের মধ্যে মক অবজেক্ট তৈরির জন্য ব্যবহৃত হয়, যা ডেটাবেজ অ্যাক্সেস বা অন্যান্য বাইরের সিস্টেমের সাথে ইন্টিগ্রেশন ছাড়া পরীক্ষা চালায়।

উদাহরণ: Service Layer Testing

ধরা যাক, আমাদের একটি 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(...) ব্যবহার করে নিশ্চিত করা হয়েছে যে মেথডটি একবারই কল হয়েছে।


স্প্রিং বুট ORM অ্যাপ্লিকেশনে Integration Testing

Integration Testing-এ পুরো সিস্টেমের কার্যকারিতা পরীক্ষা করা হয়, যেখানে ডেটাবেজের সাথে ইন্টিগ্রেশনও অন্তর্ভুক্ত থাকে। স্প্রিং বুটে, @SpringBootTest অ্যানোটেশন ব্যবহার করে ডেটাবেজের সাথে পুরো অ্যাপ্লিকেশন পরীক্ষা করা যায়। ডেটাবেজের জন্য H2 অথবা HSQLDB এর মতো ইন-মেমরি ডেটাবেজ ব্যবহার করা যেতে পারে, যাতে পরীক্ষার সময় কোন স্থায়ী ডেটাবেজে কোনো পরিবর্তন না ঘটে।

উদাহরণ: Integration Test with In-Memory Database

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 ডেটাবেজের মাধ্যমে পরীক্ষিত হতে পারে, যেটি স্প্রিং বুটের মধ্যে স্বয়ংক্রিয়ভাবে কনফিগার করা যায়।


স্প্রিং বুট ORM অ্যাপ্লিকেশনে ডেটাবেজের জন্য @DataJpaTest

@DataJpaTest স্প্রিং বুটে ডেটাবেজ সম্পর্কিত পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি শুধুমাত্র JPA উপাদান (Repository, Entity) এর জন্য কনটেক্সট লোড করে এবং দ্রুত পরীক্ষা চালানোর জন্য ডেটাবেজ সেটআপ করে।

উদাহরণ: @DataJpaTest ব্যবহার করা

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() ব্যবহার করে ডেটাবেজে সঞ্চয় এবং সন্ধান কার্যকর করা হয়েছে।


Testing স্প্রিং বুট ORM অ্যাপ্লিকেশনঃ কিছু গুরুত্বপূর্ণ পয়েন্ট

  • In-memory Database: ইন-মেমরি ডেটাবেজ (যেমন H2) ব্যবহার করুন, যাতে পরীক্ষার সময় স্থায়ী ডেটাবেজের ওপর কোনো প্রভাব না পড়ে।
  • @SpringBootTest: পুরো অ্যাপ্লিকেশন কনটেক্সট লোড করে পরীক্ষা করার জন্য ব্যবহৃত হয়।
  • @DataJpaTest: শুধুমাত্র JPA সম্পর্কিত উপাদান পরীক্ষা করার জন্য ব্যবহৃত হয়।
  • @MockBean: Service বা Repository টেস্ট করার জন্য মক অবজেক্ট তৈরি করতে ব্যবহৃত হয়।
  • Mockito: মক অবজেক্ট তৈরির জন্য ব্যবহার করা হয় যাতে বাইরের সিস্টেমের উপর নির্ভরশীলতা কমানো যায়।

সারসংক্ষেপ

স্প্রিং বুট ORM অ্যাপ্লিকেশনগুলির পরীক্ষার জন্য Unit Testing এবং Integration Testing দুটি পদ্ধতি ব্যবহার করা হয়। @MockBean, @SpringBootTest, এবং @DataJpaTest এর মতো অ্যানোটেশনগুলোর মাধ্যমে আপনি সহজেই ORM অ্যাপ্লিকেশনের বিভিন্ন অংশ পরীক্ষা করতে পারেন। ইন-মেমরি ডেটাবেজ ব্যবহার করে সিস্টেমের কার্যকারিতা নিশ্চিত করা এবং JPA বা Hibernate-এর সাথে সম্পর্কিত অপারেশনগুলো সঠিকভাবে কাজ করছে কি না তা পরীক্ষা করা খুবই গুরুত্বপূর্ণ।

Content added By

Spring Boot ORM এর Unit এবং Integration Testing

111
111

Spring Boot ORM (Object-Relational Mapping) অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing খুবই গুরুত্বপূর্ণ। এগুলো ব্যবহার করে অ্যাপ্লিকেশনটির কার্যকারিতা এবং ডেটাবেস সংক্রান্ত কার্যক্রম সঠিকভাবে পরীক্ষা করা যায়। Spring Boot ORM অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing-এর জন্য সাধারণত JUnit এবং Mockito ব্যবহার করা হয়।


Unit Testing in Spring Boot ORM

Unit Testing হল একটি নির্দিষ্ট ইউনিট বা ফাংশন (যেমন সার্ভিস ক্লাস, মেথড) পরীক্ষা করার প্রক্রিয়া। ORM অ্যাপ্লিকেশনে, সাধারণত DAO (Data Access Object) বা Repository লেয়ার টেস্ট করা হয়, যেখানে ডেটাবেস অপারেশন বা জেএপি-এর লজিক প্রক্রিয়া পরীক্ষা করা হয়। Mockito মক (Mock) অবজেক্ট ব্যবহার করে ডেটাবেস বা রেপোজিটরি লেয়ারের ওপর টেস্ট করা হয়।

১. Repository Layer এর Unit Test

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 in Spring Boot ORM

Integration Testing হল একাধিক ইউনিটের একত্রে কার্যকারিতা পরীক্ষা করার প্রক্রিয়া, যেখানে পুরো অ্যাপ্লিকেশন বা একটি নির্দিষ্ট লেয়ার (যেমন, ডেটাবেস সংযোগ) পরীক্ষা করা হয়। Spring Boot ORM অ্যাপ্লিকেশনে ডেটাবেস সংক্রান্ত ইনটিগ্রেশন টেস্ট করার জন্য @SpringBootTest, @DataJpaTest, এবং @AutoConfigureTestDatabase ব্যবহার করা হয়।

১. Integration Test for JPA (Database Test)

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 অবজেক্ট তৈরি এবং সেভ করে পরে তা খুঁজে বের করা হয়েছে।

২. Custom Database Configuration for Tests

কিছু ক্ষেত্রে, আপনি ইন-মেমরি ডেটাবেসের পরিবর্তে রিয়েল ডেটাবেস ব্যবহার করতে চাইতে পারেন। এতে @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 এর মাধ্যমে ডেভেলপাররা অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং ভুলমুক্ত রাখতে সক্ষম হয়।

Content added By

H2 Database ব্যবহার করে In-Memory Testing

81
81

স্প্রিং বুট (Spring Boot) ORM ব্যবহার করে ডাটাবেস সম্পর্কিত বিভিন্ন কার্যক্রম সহজে পরিচালনা করা যায়। কিন্তু প্রকৃত ডাটাবেস ব্যবহারের সময় সিস্টেমের পারফরম্যান্স ও স্থিতিশীলতা পরীক্ষা করা কঠিন হতে পারে। এই কারণে, ইন-মেমরি ডাটাবেস ব্যবহার করে টেস্টিং একটি কার্যকরী পদ্ধতি। H2 ডাটাবেস একটি জনপ্রিয় ইন-মেমরি ডাটাবেস যা স্প্রিং বুট প্রজেক্টে দ্রুত টেস্টিং পরিচালনার জন্য ব্যবহৃত হয়। H2 ডাটাবেসের সবচেয়ে বড় সুবিধা হলো এটি টেস্টিং এর জন্য কনফিগারেশনে সহজ, দ্রুত এবং কম রিসোর্স ব্যবহার করে কাজ করে।


H2 ডাটাবেসের সুবিধা

H2 ডাটাবেস ইন-মেমরি ডাটাবেস হিসেবে অনেক সুবিধা প্রদান করে:

  • দ্রুত ডাটাবেস ইন্সট্যান্স: এটি মেমরি রিসোর্স ব্যবহার করে ডাটাবেস চালায়, ফলে ডাটাবেস ইনস্ট্যান্সের জন্য কোনো স্টোরেজ প্রয়োজন হয় না।
  • টেস্টিং সুবিধা: ইন-মেমরি ডাটাবেস ব্যবহার করে সহজে অটোমেটেড টেস্ট করা যায় এবং টেস্টের শেষে ডাটাবেস পরিষ্কার হয়ে যায়।
  • কমপ্যাক্ট এবং লাইটওয়েট: H2 ডাটাবেস ছোট এবং ফাস্ট, যা স্প্রিং বুট অ্যাপ্লিকেশনগুলোতে দ্রুত টেস্টিং করার জন্য উপযুক্ত।

H2 ডাটাবেস কনফিগারেশন

স্প্রিং বুটে H2 ডাটাবেস কনফিগার করা খুবই সহজ। প্রাথমিকভাবে, H2 ডাটাবেসকে মেমরি হিসেবে কনফিগার করা হয় এবং টেস্টিংয়ের জন্য এটি অটোমেটিক্যালি ডাটা প্রোসেসিং করতে সাহায্য করে।

Maven বা Gradle ডিপেনডেন্সি যুক্ত করা

H2 ডাটাবেসের জন্য প্রয়োজনীয় ডিপেনডেন্সি pom.xml বা build.gradle ফাইলে যোগ করতে হবে।

Maven (pom.xml)

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>

Gradle (build.gradle)

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.urlmem: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 সম্পর্কিত কার্যক্রম পরীক্ষা করা সহজ। এই প্রক্রিয়া অটোমেটিক্যালি ডেটাবেস পরিষ্কার করে এবং টেস্ট চলাকালীন সময়ে দ্রুত ফলাফল প্রদান করে।


Content added By

@DataJpaTest এবং @MockBean এর মাধ্যমে Testing

74
74

স্প্রিং বুট ORM ব্যবহার করার সময় ডেটাবেস সম্পর্কিত কোডের পরীক্ষার জন্য @DataJpaTest এবং @MockBean অ্যানোটেশন দুটি খুবই কার্যকরী। এগুলি স্প্রিং টেস্টিং ফ্রেমওয়ার্কের একটি অংশ, যা JPA রেপোজিটরি, সার্ভিস এবং ডেটাবেস লজিক পরীক্ষা করতে সহায়তা করে। এই টেস্টিং টেকনিকগুলি আপনাকে স্প্রিং বুট অ্যাপ্লিকেশন টেস্ট করতে সহজ উপায় প্রদান করে।

@DataJpaTest অ্যানোটেশন

@DataJpaTest অ্যানোটেশনটি স্প্রিং বুট টেস্টিংয়ের জন্য ব্যবহৃত হয়, যা শুধুমাত্র JPA রেপোজিটরির পরীক্ষা চালায়। এটি ডেটাবেস অপারেশনগুলো পরীক্ষা করার জন্য একটি বিশেষ টেস্ট কনফিগারেশন প্রস্তুত করে, যা ডেটাবেসের সাথে সম্পর্কিত কোডের পরীক্ষার ক্ষেত্রে খুবই কার্যকরী। এটি স্প্রিং কনটেক্সটকে হালকা রাখে এবং শুধু প্রয়োজনীয় কনফিগারেশনগুলো লোড করে, যেমন JPA রেপোজিটরির কোড এবং ডেটাবেস কনফিগারেশন।

@DataJpaTest এর ব্যবহার

এটি ডেটাবেসের সাথে ইন্টিগ্রেশন টেস্টিং করার জন্য ব্যবহার করা হয়, যেখানে স্প্রিং টেস্ট কনফিগারেশন শুধুমাত্র 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 অ্যানোটেশনটি স্প্রিং বুট টেস্টিংয়ে ব্যবহৃত হয়, যেখানে আপনি আপনার সার্ভিস ক্লাসের ডিপেনডেন্সি হিসেবে মক অবজেক্ট ইনজেক্ট করতে পারেন। এটি সাধারণত সার্ভিস লেয়ার এবং কন্ট্রোলার লেয়ারের টেস্টিংয়ে ব্যবহৃত হয়, যেখানে ডেটাবেসে প্রকৃত অপারেশন করার প্রয়োজন নেই।

@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 এর মধ্যে পার্থক্য

  • @DataJpaTest শুধুমাত্র JPA সম্পর্কিত কোড পরীক্ষা করার জন্য ব্যবহৃত হয়, যেখানে প্রকৃত ডেটাবেস অপারেশন করা হয়। এটি ডেটাবেসের টেবিলের সাথে একত্রে কাজ করে।
  • @MockBean সার্ভিস বা রেপোজিটরি ক্লাসের মক অবজেক্ট তৈরি করে এবং পরীক্ষার জন্য ইনজেক্ট করা হয়, তবে এটি প্রকৃত ডেটাবেসের সঙ্গে কাজ করে না এবং কোনো ডেটা পরিবর্তন বা সেভ করে না।

টেস্টিংয়ের জন্য উপকারী টিপস

  • @DataJpaTest ব্যবহার করার সময় টেস্ট ডেটাবেস ব্যবহৃত হয়, তাই টেস্ট ফাইলগুলি হালনাগাদ থাকতে হবে এবং টেস্টের শেষে ডেটাবেস পরিষ্কার করা উচিত।
  • @MockBean ব্যবহার করার সময় এটি কেবলমাত্র সার্ভিস এবং কন্ট্রোলার লেয়ার টেস্ট করতে কার্যকরী, যেখানে ডেটাবেস ইন্টারঅ্যাকশন না করা উচিত।

স্প্রিং বুট ORM টেস্টিংয়ের জন্য @DataJpaTest এবং @MockBean খুবই গুরুত্বপূর্ণ টুলস, যা ডেটাবেস ইন্টিগ্রেশন টেস্টিং এবং সার্ভিস লেয়ার টেস্টিংয়ে ব্যবহার করা হয়। এগুলি ডেটাবেস অপারেশনগুলো মক বা প্রকৃত ডেটাবেসের মাধ্যমে পরীক্ষা করতে সাহায্য করে।

Content added By

উদাহরণ সহ ORM Application Testing

91
91

স্প্রিং বুট ওআরএম (Spring Boot ORM) অ্যাপ্লিকেশন টেস্টিং একটি গুরুত্বপূর্ণ অংশ যা আমাদের নিশ্চিত করতে সাহায্য করে যে আমাদের ডেটাবেস অপারেশনগুলি সঠিকভাবে কাজ করছে। ORM (Object-Relational Mapping) প্রযুক্তি ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনের ডেটাবেসের সাথে যোগাযোগ এবং ডেটা ম্যানিপুলেশন সাধারণত JPA (Java Persistence API) বা Hibernate এর মাধ্যমে করা হয়। এই প্রযুক্তির সঠিক কার্যকারিতা নিশ্চিত করতে হলে টেস্টিং অত্যন্ত গুরুত্বপূর্ণ।


ORM অ্যাপ্লিকেশন টেস্টিং কি?

ORM অ্যাপ্লিকেশন টেস্টিং হল সেই প্রক্রিয়া, যেখানে ORM (Object-Relational Mapping) প্রযুক্তি ব্যবহার করে তৈরি করা অ্যাপ্লিকেশনকে সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করা হয়। এখানে আমরা সাধারণত ডেটাবেস অপারেশন যেমন ডেটা সন্নিবেশ (insert), আপডেট (update), মুছে ফেলা (delete), এবং অনুসন্ধান (search) পরীক্ষা করি।


টেস্টিংয়ের উদ্দেশ্য

  • ডেটাবেস ইন্টিগ্রেশন: ডেটাবেসের সাথে অ্যাপ্লিকেশন সঠিকভাবে ইন্টিগ্রেটেড হচ্ছে কিনা।
  • ডেটা ভ্যালিডেশন: ডেটা সঠিকভাবে সন্নিবেশ, আপডেট, বা মুছে ফেলা হচ্ছে কিনা।
  • পারফরম্যান্স টেস্টিং: ডেটাবেস অপারেশনগুলি দ্রুত এবং কার্যকরীভাবে কাজ করছে কিনা।

স্প্রিং বুট ORM অ্যাপ্লিকেশন টেস্টিং - উদাহরণ

স্প্রিং বুট ORM অ্যাপ্লিকেশন টেস্ট করার জন্য আমরা সাধারণত @DataJpaTest অ্যানোটেশন ব্যবহার করি, যা শুধুমাত্র JPA রিলেটেড টেস্টিং চালায় এবং ডেটাবেসে প্রয়োজনীয় পরিবর্তন করা হয়।


1. টেস্ট কনফিগারেশন

প্রথমে, একটি স্প্রিং বুট টেস্ট কনফিগারেশন তৈরি করতে হবে। এটি ডেটাবেস কনফিগারেশন ও রেপোজিটরি টেস্টের জন্য ব্যবহার করা হবে।

@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() পদ্ধতির মাধ্যমে ডেটাবেসে সন্নিবেশিত করেছি। তারপর আমরা নিশ্চিত করেছি যে ডেটাবেসে সঠিকভাবে ইউজার সন্নিবেশিত হয়েছে কিনা।


2. টেস্ট ডেটাবেস ব্যবহার করা

স্প্রিং বুট অটোমেটিক্যালি একটি এমবেডেড ডেটাবেস ব্যবহার করে (যেমন H2) @DataJpaTest এর মধ্যে, কিন্তু আপনি চাইলে কাস্টম ডেটাবেস কনফিগারেশনও করতে পারেন। উদাহরণস্বরূপ, H2 ডেটাবেসের মাধ্যমে টেস্ট করা:

@Configuration
public class TestConfig {
    @Bean
    public DataSource dataSource() {
        return new H2DataSource();
    }
}

এভাবে, টেস্ট ডেটাবেসের সাথে আপনার অ্যাপ্লিকেশনকে সংযুক্ত করতে পারবেন এবং টেস্ট চলাকালে কোনো প্রকৃত ডেটাবেসে প্রভাব পড়বে না।


3. CRUD অপারেশন টেস্টিং

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 অপারেশনগুলো সঠিকভাবে কাজ করছে কিনা তা টেস্ট করা হয়েছে।


4. টেস্টের ফলাফল যাচাই করা

টেস্টের ফলাফল যাচাই করার জন্য আপনি assert পদ্ধতি ব্যবহার করতে পারেন, যা নিশ্চিত করে যে আপনার ডেটাবেস অপারেশন সঠিকভাবে কাজ করছে।

  • assertNotNull(): এটি যাচাই করে যে কোনো অবজেক্ট নাল নয়।
  • assertEquals(): এটি যাচাই করে যে দুটি মান সমান কিনা।
  • assertNull(): এটি যাচাই করে যে কোনো অবজেক্ট নাল কি না।

সারাংশ

স্প্রিং বুট ORM অ্যাপ্লিকেশন টেস্টিং, বিশেষত JPA এর মাধ্যমে ডেটাবেস অপারেশনগুলো পরীক্ষা করার জন্য খুবই গুরুত্বপূর্ণ। আপনি @DataJpaTest এবং @SpringBootTest অ্যানোটেশন ব্যবহার করে সহজেই ORM টেস্টিং করতে পারেন। CRUD অপারেশনগুলো, টেস্ট ডেটাবেস, এবং ডেটাবেসের সাথে সম্পর্কিত টেস্ট কনফিগারেশন সঠিকভাবে টেস্ট করার মাধ্যমে আপনি আপনার স্প্রিং বুট ORM অ্যাপ্লিকেশনটি নির্ভরযোগ্য এবং পারফরম্যান্স-ভিত্তিক বানাতে পারেন।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion