Java Technologies Spring Boot এবং Testing গাইড ও নোট

361

Spring Boot অ্যাপ্লিকেশন তৈরি করার সময়, Testing একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। এটি নিশ্চিত করে যে আপনার অ্যাপ্লিকেশনটি সঠিকভাবে কাজ করছে এবং নির্ধারিত আচরণ অনুসরণ করছে। স্প্রিং বুটের সঙ্গে ইউনিট টেস্টিং (Unit Testing), ইন্টিগ্রেশন টেস্টিং (Integration Testing), এবং ফাংশনাল টেস্টিং (Functional Testing) খুবই সহজ, কারণ এটি বিভিন্ন টেস্টিং টুল এবং লাইব্রেরি যেমন JUnit, Mockito, Spring Test ইত্যাদি সহ আসে।

স্প্রিং বুটে টেস্টিং মূলত তিনটি স্তরে করা হয়:

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

Spring Boot Testing এর জন্য প্রয়োজনীয় ডিপেনডেন্সি

স্প্রিং বুটে টেস্টিং করার জন্য আপনাকে JUnit এবং Spring Test সম্পর্কিত ডিপেনডেন্সি ব্যবহার করতে হবে। স্প্রিং বুটে JUnit 5 এর ব্যবহার প্রচলিত এবং এটি ইনবিল্ট টেস্টিং ফিচার প্রদান করে।

Maven ডিপেনডেন্সি:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

Gradle ডিপেনডেন্সি:

testImplementation 'org.springframework.boot:spring-boot-starter-test'

এই ডিপেনডেন্সি মূলত JUnit, Mockito, Spring Test, Hamcrest এবং AssertJ সহ অন্যান্য টেস্টিং লাইব্রেরি অন্তর্ভুক্ত করে।


স্প্রিং বুটে Unit Testing

Unit Testing অ্যাপ্লিকেশনের ছোট ছোট অংশ, যেমন মেথড বা সার্ভিস ক্লাস পরীক্ষা করার জন্য করা হয়। এখানে সাধারণত Mockito এবং JUnit ব্যবহার করা হয়।

উদাহরণ: Service Layer Unit Test

ধরা যাক, আমাদের একটি EmployeeService ক্লাস আছে যা EmployeeRepository ব্যবহার করে ডেটাবেজ থেকে তথ্য সংগ্রহ করে। আমরা EmployeeService ক্লাসটি টেস্ট করতে যাচ্ছি।

EmployeeService Class:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public Employee getEmployeeById(Long id) {
        return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
    }

    public Employee saveEmployee(Employee employee) {
        return employeeRepository.save(employee);
    }
}

Unit Test Class:

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
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", "HR");
        when(employeeRepository.findById(1L)).thenReturn(Optional.of(employee));

        Employee result = employeeService.getEmployeeById(1L);

        assertNotNull(result);
        assertEquals("John Doe", result.getName());
    }

    @Test
    public void testSaveEmployee() {
        Employee employee = new Employee("Jane Doe", "IT");
        when(employeeRepository.save(employee)).thenReturn(employee);

        Employee result = employeeService.saveEmployee(employee);

        assertNotNull(result);
        assertEquals("Jane Doe", result.getName());
    }
}

এখানে, @Mock অ্যানোটেশন দিয়ে আমরা EmployeeRepository মক করেছি, এবং @InjectMocks ব্যবহার করে EmployeeService ক্লাসে ইনজেকশন করেছি। when(...).thenReturn(...) এর মাধ্যমে মক অবজেক্টের রিটার্ন ভ্যালু নির্ধারণ করা হয়েছে এবং JUnit এর assertNotNull এবং assertEquals মেথড ব্যবহার করে ফলাফল যাচাই করা হয়েছে।


স্প্রিং বুটে Integration Testing

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

উদাহরণ: 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 testSaveAndFindEmployee() {
        Employee employee = new Employee("Alice", "Finance");
        employeeRepository.save(employee);

        Employee foundEmployee = employeeRepository.findById(employee.getId()).orElse(null);

        assertNotNull(foundEmployee);
        assertEquals("Alice", foundEmployee.getName());
    }
}

এখানে:

  • @SpringBootTest অ্যানোটেশন ব্যবহার করা হয়েছে যা পুরো স্প্রিং বুট অ্যাপ্লিকেশন কনটেক্সট লোড করবে।
  • ইন-মেমরি ডেটাবেজ (যেমন H2) ব্যবহার করা হয়েছে যাতে পরীক্ষা চলাকালীন কোনো স্থায়ী ডেটাবেজের উপরে কোনো প্রভাব না পড়ে।

Acceptance Testing (End-to-End Testing)

Acceptance Testing (বা End-to-End Testing) পুরো অ্যাপ্লিকেশনের কার্যকারিতা যাচাই করতে ব্যবহৃত হয়। সাধারণত TestRestTemplate বা MockMvc ব্যবহার করা হয় স্প্রিং বুটের রেস্ট API-র টেস্টিং করতে।

উদাহরণ: Acceptance Test with MockMvc

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

@SpringBootTest
@AutoConfigureMockMvc
public class EmployeeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetEmployee() throws Exception {
        mockMvc.perform(get("/employees/1"))
               .andExpect(status().isOk());
    }
}

এখানে:

  • @AutoConfigureMockMvc অ্যানোটেশন ব্যবহার করে স্প্রিং MVC কনটেক্সট তৈরি করা হয় এবং MockMvc দিয়ে HTTP রিকোয়েস্ট পাঠানো হয়।
  • MockMvc মাধ্যমে আমরা ইউজার রিকোয়েস্টের ফলাফল যাচাই করি (যেমন HTTP স্ট্যাটাস কোড এবং রেসপন্স কনটেন্ট)।

স্প্রিং বুট Testing Tips

  1. In-memory Database: টেস্টিং করার সময় ইন-মেমরি ডেটাবেজ ব্যবহার করা ভাল, যাতে টেস্টের জন্য ডেটাবেজে কোনো স্থায়ী পরিবর্তন না হয়।
  2. Mocking: স্প্রিং বুটের টেস্টিংয়ে Mockito ব্যবহারে মক অবজেক্ট তৈরি করতে পারেন, যা বাহ্যিক সার্ভিস বা ডেটাবেজ ইন্টারঅ্যাকশন থেকে মুক্ত রাখে।
  3. @SpringBootTest: পুরো স্প্রিং কনটেক্সট লোড করার জন্য এটি ব্যবহার করা হয়, তবে যদি আপনি শুধু কিছু নির্দিষ্ট কম্পোনেন্ট টেস্ট করতে চান তবে @WebMvcTest বা @DataJpaTest ব্যবহার করুন।
  4. Test Profiles: টেস্টিংয়ের জন্য বিশেষ application-test.properties কনফিগারেশন ব্যবহার করুন যাতে টেস্টের জন্য আলাদা ডেটাবেজ বা কনফিগারেশন ব্যবহার করা যায়।

সারসংক্ষেপ

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

Content added By

Spring Boot তে Unit এবং Integration Testing

296

Spring Boot অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing অত্যন্ত গুরুত্বপূর্ণ। Unit Testing এর মাধ্যমে একক ফাংশন বা মেথডের কার্যকারিতা পরীক্ষা করা হয়, যেখানে Integration Testing ব্যবহার করে পুরো সিস্টেম বা একাধিক উপাদানের ইন্টিগ্রেশন পরীক্ষা করা হয়।

Spring Boot-এ JUnit, Mockito, এবং Spring Test এর মতো টুলস ব্যবহার করা হয় Unit এবং Integration Testing করতে। Spring Boot স্বয়ংক্রিয়ভাবে এই টেস্টিং সরঞ্জামগুলির জন্য কনফিগারেশন এবং সমর্থন প্রদান করে, যা ডেভেলপারদের দ্রুত এবং কার্যকরী টেস্টিং করতে সহায়তা করে।


Unit Testing in Spring Boot

Unit Testing এর মাধ্যমে একক মেথড বা ক্লাসের কার্যকারিতা পরীক্ষা করা হয়, যাতে এটি প্রত্যাশিত ফলাফল প্রদান করে কিনা তা নিশ্চিত করা যায়। Spring Boot-এ Unit Testing করতে JUnit এবং Mockito খুব জনপ্রিয় টুল।

১. JUnit: ইউনিট টেস্ট করার জন্য Spring Boot-এ JUnit ব্যবহৃত হয়। JUnit 5 ব্যবহার করা হচ্ছে Spring Boot অ্যাপ্লিকেশনের জন্য।

২. Mockito: Mockito ব্যবহার করে ডিপেনডেন্সি ইনজেকশন মক (Mock) করা হয়, যাতে ডেটাবেস বা অন্য কোন এক্সটার্নাল সার্ভিসে যাওয়ার প্রয়োজন না হয়।

উদাহরণ: Unit Testing with Mockito and JUnit

UserService ক্লাসের Unit Test:

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 UserServiceTest {

    @Mock
    private UserRepository userRepository; // Mock Repository

    @InjectMocks
    private UserService userService; // Inject Mocks into Service

    @Test
    public void testFindByName() {
        // Arrange
        User user = new User(1L, "John Doe", "john@example.com");
        when(userRepository.findByName("John Doe")).thenReturn(user);

        // Act
        User result = userService.findByName("John Doe");

        // Assert
        assertEquals("John Doe", result.getName());
        verify(userRepository, times(1)).findByName("John Doe");
    }
}

এখানে:

  • @Mock ব্যবহার করে UserRepository মক করা হয়েছে।
  • @InjectMocks ব্যবহার করে UserService ক্লাসে মক অবজেক্ট ইনজেক্ট করা হয়েছে।
  • when(...).thenReturn(...) ব্যবহার করে মক অবজেক্টের প্রত্যাশিত আউটপুট নির্ধারণ করা হয়েছে।
  • assertEquals ব্যবহার করে টেস্টের আউটপুট যাচাই করা হয়েছে।

Integration Testing in Spring Boot

Integration Testing হল একাধিক ইউনিট বা সিস্টেমের অংশের একত্রে কার্যকারিতা পরীক্ষা করার প্রক্রিয়া। Spring Boot-এ @SpringBootTest, @DataJpaTest, এবং @WebMvcTest এর মতো এনোটেশন ব্যবহার করে Integration Testing করা হয়।

১. @SpringBootTest: পুরো Spring Boot অ্যাপ্লিকেশনকে লোড করে Integration Testing চালাতে ব্যবহৃত হয়।

২. @DataJpaTest: ডেটাবেস রিলেটেড ফিচারগুলো টেস্ট করতে ব্যবহৃত হয়। এটি শুধুমাত্র JPA সম্পর্কিত কম্পোনেন্টগুলো লোড করে, যেমন: Repository এবং Entity ক্লাস।

উদাহরণ: Integration Testing with @SpringBootTest

UserService ক্লাসের 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.context.SpringBootTest;

@SpringBootTest
public class UserServiceIntegrationTest {

    @Autowired
    private UserService userService; // Inject the real service

    @Test
    public void testSaveAndFindUser() {
        // Arrange
        User user = new User(1L, "John Doe", "john.doe@example.com");
        userService.saveUser(user);

        // Act
        User foundUser = userService.getUserByName("John Doe");

        // Assert
        assertNotNull(foundUser);
        assertEquals("John Doe", foundUser.getName());
    }
}

এখানে:

  • @SpringBootTest ব্যবহার করা হয়েছে Spring Boot অ্যাপ্লিকেশনের পুরো কনটেক্সট লোড করার জন্য।
  • userService.saveUser এবং userService.getUserByName মেথড ব্যবহার করে পুরো সিস্টেমে ডেটা সেভ এবং রিট্রিভ করা হয়েছে।

৩. @WebMvcTest: শুধুমাত্র ওয়েব লেয়ারের টেস্ট (Controller Layer) করতে ব্যবহৃত হয়।

৪. @DataJpaTest: JPA এবং ডেটাবেসের সাথে কাজ করা টেস্ট করতে ব্যবহৃত হয়।

Example: @DataJpaTest for Repository Layer Testing

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;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testFindByName() {
        // Arrange
        User user = new User(1L, "John Doe", "john.doe@example.com");
        userRepository.save(user);

        // Act
        User foundUser = userRepository.findByName("John Doe");

        // Assert
        assertNotNull(foundUser);
        assertEquals("John Doe", foundUser.getName());
    }
}

এখানে:

  • @DataJpaTest ব্যবহার করে শুধুমাত্র JPA রেপোজিটরি এবং ডেটাবেসের সাথে সম্পর্কিত টেস্ট করা হয়েছে।
  • userRepository.save এবং userRepository.findByName এর মাধ্যমে ডেটাবেস অপারেশন টেস্ট করা হয়েছে।

Spring Boot Testing এর জন্য প্রয়োজনীয় কিছু টুল

  1. JUnit 5: Unit Testing এর জন্য ব্যবহার করা হয়।
  2. Mockito: Mocking এর জন্য ব্যবহৃত হয়, যাতে এক্সটার্নাল সার্ভিস বা ডেটাবেসের সাথে যোগাযোগ না করে টেস্ট করা যায়।
  3. Spring Test: Spring Boot অ্যাপ্লিকেশন টেস্ট করার জন্য @SpringBootTest, @DataJpaTest, @WebMvcTest ব্যবহার করা হয়।
  4. AssertJ: Assertions এর জন্য ব্যবহৃত হয়, যা আরো বাচনীয় এবং পরিষ্কার টেস্ট ফলাফল প্রদান করে।
  5. H2 Database: ইন-মেমরি ডেটাবেস হিসেবে ব্যবহার করা হয় টেস্টিংয়ের জন্য।

সারাংশ

Spring Boot-এ Unit Testing এবং Integration Testing অত্যন্ত গুরুত্বপূর্ণ, যাতে অ্যাপ্লিকেশনটির কার্যকারিতা এবং বিভিন্ন অংশের ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়। JUnit এবং Mockito ব্যবহার করে Unit Testing করা হয়, যেখানে @SpringBootTest, @DataJpaTest, এবং @WebMvcTest ব্যবহার করে Integration Testing করা হয়। Spring Boot টেস্টিং সরঞ্জাম সরবরাহ করে, যা ডেভেলপারদের দ্রুত এবং কার্যকরী টেস্টিং করতে সহায়তা করে।

Content added By

@SpringBootTest এবং @MockBean এর ব্যবহার

243

স্প্রিং বুটের টেস্টিং অত্যন্ত গুরুত্বপূর্ণ একটি দিক, যা অ্যাপ্লিকেশনটির বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করতে সহায়তা করে। @SpringBootTest এবং @MockBean অ্যানোটেশন দুটি স্প্রিং বুট টেস্টিং ফ্রেমওয়ার্কে ব্যাপকভাবে ব্যবহৃত হয়। এগুলো বিশেষভাবে ইন্টিগ্রেশন টেস্ট এবং ইউনিট টেস্ট পরিচালনার জন্য সহায়ক।


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

@SpringBootTest একটি স্প্রিং বুট টেস্টিং অ্যানোটেশন, যা পুরো স্প্রিং কনটেইনার লোড করে এবং টেস্টে স্প্রিং বুট অ্যাপ্লিকেশনটির পুরো প্রসেস পরীক্ষা করতে সক্ষম হয়। এটি ইনটিগ্রেশন টেস্ট (Integration Test) পরিচালনা করার জন্য ব্যবহৃত হয়, যেখানে অ্যাপ্লিকেশনটি পুরোপুরি রান হয় এবং ডাটাবেস, সার্ভিস, কনট্রোলারসহ সবগুলো উপাদান ইন্টিগ্রেটেড থাকে। এটি মূলত পুরো অ্যাপ্লিকেশন কনটেক্সটের সঙ্গে ইন্টিগ্রেশন টেস্ট করার জন্য ব্যবহৃত হয়।

ব্যবহারের উদাহরণ:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ApplicationTests {

    @Test
    void contextLoads() {
        // টেস্ট যখন রান করবে, তখন অ্যাপ্লিকেশন কনটেক্সট লোড হবে
    }
}

এখানে @SpringBootTest অ্যানোটেশনটি ব্যবহার করা হয়েছে, যা স্প্রিং কনটেইনার লোড করে এবং টেস্ট চলাকালীন পুরো অ্যাপ্লিকেশন কনটেক্সট পরীক্ষার জন্য প্রস্তুত থাকে।

সুবিধা:

  • পুরো স্প্রিং কনটেইনারের জন্য একটি প্রিলোডেড কনটেক্সট তৈরি করে।
  • বিভিন্ন সার্ভিস, রেপোজিটরি এবং কনট্রোলারসহ অ্যাপ্লিকেশনের যাবতীয় কাজ পরীক্ষা করা যায়।

সীমাবদ্ধতা:

  • @SpringBootTest অনেক বড় এবং জটিল অ্যাপ্লিকেশনগুলির ক্ষেত্রে টেস্ট চলাকালীন সময় অনেক বেশি রিসোর্স ব্যবহার করতে পারে।
  • টেস্টের এক্সিকিউশন সময় বেশি হতে পারে কারণ পুরো কনটেইনার লোড হতে সময় নেয়।

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

@MockBean স্প্রিং বুট টেস্টিং এর একটি অ্যানোটেশন যা Mockito লাইব্রেরি ব্যবহার করে স্প্রিং কনটেক্সট এর মধ্যে মক (mock) অবজেক্ট ইনজেক্ট করার জন্য ব্যবহৃত হয়। এটি সাধারণত একক ইউনিট টেস্টে ব্যবহৃত হয়, যেখানে আপনি স্প্রিং কনটেইনারের নির্দিষ্ট সেবা বা ডিপেনডেন্সি মক করতে চান। @MockBean একে মক করে, টেস্টের সময় আসল সেবা বা ডিপেনডেন্সির পরিবর্তে মক অবজেক্ট ব্যবহার করা হয়।

ব্যবহারের উদাহরণ:

import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.*;

@SpringBootTest
public class UserServiceTest {

    @MockBean
    private UserRepository userRepository;

    @Test
    public void testGetUserById() {
        User mockUser = new User(1L, "John Doe");
        when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));

        User result = userService.getUserById(1L);

        assertEquals("John Doe", result.getName());
    }
}

এখানে @MockBean অ্যানোটেশন ব্যবহার করা হয়েছে যাতে UserRepository এর মক অবজেক্ট ইনজেক্ট করা হয়। তারপর, userService.getUserById(1L) কল করলে আসল userRepository এর পরিবর্তে মক অবজেক্টটি ব্যবহৃত হবে।

সুবিধা:

  • টেস্ট চলাকালীন নির্দিষ্ট ডিপেনডেন্সি মক করে শুধুমাত্র সেই অংশটি পরীক্ষা করা সম্ভব।
  • ইন্টিগ্রেশন টেস্টে ব্যবহারকারী সেবা বা ডাটাবেসের অ্যাক্সেসের পরিবর্তে মক অবজেক্ট ব্যবহৃত হয়, যার ফলে অ্যাপ্লিকেশনের বিভিন্ন অংশ পরীক্ষা করা সহজ হয়।

সীমাবদ্ধতা:

  • মক অবজেক্ট ব্যবহার করলে বাস্তব ডাটাবেস বা সার্ভিসের কার্যকারিতা পরীক্ষা করা সম্ভব হয় না। তাই, শুধু নির্দিষ্ট সার্ভিসের কার্যকারিতা পরীক্ষা করা যায়।

@SpringBootTest এবং @MockBean এর পার্থক্য

বৈশিষ্ট্য@SpringBootTest@MockBean
ব্যবহারইনটিগ্রেশন টেস্টের জন্য ব্যবহৃতইউনিট টেস্টের জন্য ব্যবহৃত
ফোকাসপুরো অ্যাপ্লিকেশন কনটেক্সট পরীক্ষানির্দিষ্ট ডিপেনডেন্সি মক করা
রিসোর্স ব্যবহারবেশী রিসোর্স ব্যবহার হতে পারেমক অবজেক্ট ব্যবহার করে কম রিসোর্স
পারফরম্যান্সঅ্যাপ্লিকেশন কনটেইনার লোড হতে সময় নেয়দ্রুত এবং কাস্টম টেস্টের জন্য উপযুক্ত

সারাংশ

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


Content added By

JUnit এবং Mockito দিয়ে Testing করা

285

স্প্রিং বুট অ্যাপ্লিকেশনগুলির জন্য সঠিক টেস্টিং গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের কার্যকারিতা নিশ্চিত করতে সহায়তা করে। JUnit এবং Mockito দুটি জনপ্রিয় টুল যা স্প্রিং বুট অ্যাপ্লিকেশন টেস্টিংয়ের জন্য ব্যবহৃত হয়। JUnit টেস্ট ফ্রেমওয়ার্ক হিসেবে ব্যবহৃত হয়, যেখানে Mockito একটি মকিং ফ্রেমওয়ার্ক হিসেবে কাজ করে। এই দুটি টুলের মাধ্যমে আপনি স্প্রিং বুট অ্যাপ্লিকেশনগুলির বিভিন্ন অংশ যেমন সার্ভিস, রেপোজিটরি, কন্ট্রোলার ইত্যাদির টেস্টিং করতে পারেন।

JUnit

JUnit একটি ওপেন সোর্স টেস্টিং ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় লেখা টেস্ট কেসগুলো রান করতে ব্যবহৃত হয়। স্প্রিং বুট অ্যাপ্লিকেশন টেস্ট করতে JUnit-এর বিভিন্ন ভার্সন ব্যবহার করা যায়, তবে বর্তমানে JUnit 5 ব্যবহৃত হয় যা আরও উন্নত এবং আধুনিক।

Mockito

Mockito একটি মকিং ফ্রেমওয়ার্ক যা টেস্ট কেসগুলিতে নির্ভরশীল (dependency) অবজেক্টগুলিকে মক (mock) করার জন্য ব্যবহৃত হয়। এটি বিশেষত ইউনি টেস্টিংয়ের জন্য কার্যকরী, কারণ আপনি একটি মক অবজেক্ট তৈরি করতে পারেন এবং টেস্টের সময় সেই মক অবজেক্টের কার্যকারিতা নির্ধারণ করতে পারেন।

স্প্রিং বুট টেস্টিংয়ের জন্য প্রয়োজনীয় ডিপেনডেন্সি

স্প্রিং বুট অ্যাপ্লিকেশন টেস্টিংয়ের জন্য প্রথমে আপনাকে কিছু ডিপেনডেন্সি আপনার pom.xml ফাইলে যোগ করতে হবে।

Maven ডিপেনডেন্সি

<dependencies>
    <!-- Spring Boot Test Dependency -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- Mockito Dependency -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.11.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

এই ডিপেনডেন্সির মাধ্যমে আপনি @SpringBootTest, @MockBean, @RunWith, এবং Mockito ব্যবহার করতে পারবেন।

JUnit এবং Mockito দিয়ে টেস্টিংয়ের উদাহরণ

ধরা যাক, আমাদের একটি EmployeeService ক্লাস রয়েছে, যেটি EmployeeRepository থেকে ডেটা নিয়ে কাজ করে। আমরা EmployeeService ক্লাসটিকে টেস্ট করার জন্য Mockito ব্যবহার করে EmployeeRepository কে মক করব।

১. EmployeeService ক্লাস

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public List<Employee> getAllEmployees() {
        return employeeRepository.findAll();
    }

    public Employee getEmployeeById(Long id) {
        return employeeRepository.findById(id).orElse(null);
    }
}

২. EmployeeRepository (ইন্টারফেস)

import org.springframework.data.jpa.repository.JpaRepository;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

৩. EmployeeController (কন্ট্রোলার)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/employees/{id}")
    public Employee getEmployeeById(@PathVariable Long id) {
        return employeeService.getEmployeeById(id);
    }
}

৪. টেস্ট ক্লাস তৈরি করা

এখন আমরা EmployeeService ক্লাসটির জন্য টেস্ট ক্লাস তৈরি করব। এখানে আমরা @MockBean এবং @SpringBootTest ব্যবহার করব। @MockBean ব্যবহার করে আমরা EmployeeRepository কে মক করব যাতে ডেটাবেসের প্রয়োজন না হয়।

টেস্ট ক্লাস উদাহরণ

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;
import org.springframework.boot.test.mock.mockito.MockBean;

import java.util.Arrays;
import java.util.List;

@SpringBootTest
public class EmployeeServiceTest {

    @MockBean
    private EmployeeRepository employeeRepository;

    @InjectMocks
    private EmployeeService employeeService;

    @Test
    public void testGetAllEmployees() {
        // Mocking the repository method
        Employee employee1 = new Employee(1L, "John", "Doe");
        Employee employee2 = new Employee(2L, "Jane", "Doe");

        when(employeeRepository.findAll()).thenReturn(Arrays.asList(employee1, employee2));

        // Calling the service method
        List<Employee> employees = employeeService.getAllEmployees();

        // Verifying the result
        assertNotNull(employees);
        assertEquals(2, employees.size());
        assertEquals("John", employees.get(0).getFirstName());
    }

    @Test
    public void testGetEmployeeById() {
        // Mocking the repository method
        Employee employee = new Employee(1L, "John", "Doe");

        when(employeeRepository.findById(1L)).thenReturn(java.util.Optional.of(employee));

        // Calling the service method
        Employee foundEmployee = employeeService.getEmployeeById(1L);

        // Verifying the result
        assertNotNull(foundEmployee);
        assertEquals("John", foundEmployee.getFirstName());
    }
}

ব্যাখ্যা:

  1. @MockBean: EmployeeRepository কে মক করা হচ্ছে, যাতে ডেটাবেস কনফিগারেশন ছাড়াই টেস্ট করা যায়।
  2. @InjectMocks: স্প্রিং বুট স্বয়ংক্রিয়ভাবে EmployeeService ক্লাসে মক করা EmployeeRepository ইনজেক্ট করে।
  3. when() and thenReturn(): Mockito এর মাধ্যমে আমরা EmployeeRepository এর মেথড findAll() এবং findById() এর জন্য মক ভ্যালু রিটার্ন করিয়েছি।
  4. assertNotNull() and assertEquals(): JUnit এর assert মেথড দিয়ে আমরা টেস্টের রেজাল্ট যাচাই করেছি।

স্প্রিং বুট টেস্টিং-এর সুবিধা

  • ইনটিগ্রেশন টেস্টিং: স্প্রিং বুট টেস্টিং অ্যাপ্লিকেশন কনটেক্সট লোড করে, ফলে এটি ডেটাবেস, সার্ভিস, কন্ট্রোলারসহ অন্যান্য সমস্ত অংশের ইন্টিগ্রেশন টেস্টিং সহজ করে তোলে।
  • Mockito মকিং: Mockito ব্যবহার করে নির্ভরশীল অবজেক্ট (যেমন রেপোজিটরি) মক করা যায়, ফলে আপনি শুধুমাত্র সার্ভিস বা কন্ট্রোলারের লজিক টেস্ট করতে পারেন।
  • JUnit: JUnit এর মাধ্যমে আপনি আপনার টেস্ট কেস গুলি চালাতে পারেন এবং অ্যাপ্লিকেশনের পারফরম্যান্স ও কার্যকারিতা যাচাই করতে পারেন।

JUnit এবং Mockito এর মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশন টেস্টিং করার মাধ্যমে আপনি দ্রুত এবং সহজভাবে আপনার কোডের কার্যকারিতা যাচাই করতে পারেন। এটি আপনার অ্যাপ্লিকেশনকে আরো নির্ভরযোগ্য এবং রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য প্রস্তুত করে তোলে।

Content added By

উদাহরণ সহ Spring Boot Testing

250

স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশন টেস্টিং একটি গুরুত্বপূর্ণ অংশ, যা আমাদের অ্যাপ্লিকেশনের কার্যকারিতা যাচাই করতে সহায়তা করে। স্প্রিং বুটে টেস্টিং করার জন্য বেশ কিছু টুল এবং কৌশল রয়েছে, যার মধ্যে JUnit, Mockito, Spring Boot Test, এবং @DataJpaTest অন্যতম। এই টেস্টিং টুলগুলো ব্যবহার করে আমরা অ্যাপ্লিকেশন এর বিভিন্ন স্তরের (যেমন, ইউনিট টেস্ট, ইন্টিগ্রেশন টেস্ট, রেস্ট API টেস্ট) কার্যকারিতা পরীক্ষা করতে পারি।

স্প্রিং বুট অ্যাপ্লিকেশনে টেস্টিং করার মূল উদ্দেশ্য হল:

  • অ্যাপ্লিকেশনের প্রতিটি কম্পোনেন্ট (যেমন সার্ভিস, রেপোজিটরি, কন্ট্রোলার) সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা।
  • বিভিন্ন ধরনের আউটপুট, ইনপুট এবং সিস্টেম বিহেভিয়ার যাচাই করা।
  • অ্যাপ্লিকেশনের টেকসই এবং নির্ভরযোগ্যতা নিশ্চিত করা।

এখানে, স্প্রিং বুট টেস্টিং এর কিছু সাধারণ পদ্ধতি এবং উদাহরণ দেওয়া হলো।


১. ইউনিট টেস্ট (Unit Testing) - @SpringBootTest

স্প্রিং বুট অ্যাপ্লিকেশনে ইউনিট টেস্ট করার জন্য @SpringBootTest ব্যবহার করা হয়। এটি পুরো স্প্রিং কনটেক্সট লোড করে এবং অ্যাপ্লিকেশনের যেকোনো বিহেভিয়ার যাচাই করতে সাহায্য করে।

উদাহরণ: সার্ভিস লেয়ার টেস্টিং

ধরা যাক আমাদের একটি UserService ক্লাস আছে, যার মধ্যে একটি মেথড রয়েছে যা ইউজার ডেটা ফেরত দেয়।

@Service
public class UserService {

    public String getUserById(Long id) {
        return "User" + id;  // Simple method returning User name based on ID
    }
}

এখন আমরা এটি টেস্ট করব।

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testGetUserById() {
        Long userId = 1L;
        String result = userService.getUserById(userId);
        assertEquals("User1", result);  // Checking if the result is correct
    }
}

এখানে:

  • @SpringBootTest: এটি স্প্রিং বুট কনটেক্সট লোড করে এবং অ্যাপ্লিকেশনের বাস্তব সার্ভিসের সাথে কাজ করতে সহায়তা করে।
  • assertEquals: এটি ইউজারের ইনপুট ও প্রত্যাশিত আউটপুট মিলিয়ে যাচাই করে।

২. ডেটাবেস টেস্টিং (Database Testing) - @DataJpaTest

স্প্রিং বুটের @DataJpaTest অ্যানোটেশনটি শুধুমাত্র JPA রিলেটেড টেস্টিংয়ের জন্য ব্যবহৃত হয়। এটি ডেটাবেস সংক্রান্ত টেস্টিং খুব সহজ করে তোলে এবং একমাত্র JPA বিহেভিয়ার টেস্ট করতে সহায়তা করে।

উদাহরণ: রেপোজিটরি টেস্টিং

ধরা যাক আমাদের একটি UserRepository আছে এবং আমরা একটি ইউজারের ডেটা ডাটাবেসে সেভ করতে চাই।

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

এখন, UserRepository টেস্ট করবো।

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.*;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testSaveUser() {
        User user = new User();
        user.setUsername("JohnDoe");
        user.setEmail("john@example.com");
        User savedUser = userRepository.save(user);

        assertNotNull(savedUser.getId());  // Check if user ID is not null after saving
        assertEquals("JohnDoe", savedUser.getUsername());  // Check if the username is correct
    }

    @Test
    public void testFindUserByUsername() {
        User user = new User();
        user.setUsername("JaneDoe");
        user.setEmail("jane@example.com");
        userRepository.save(user);

        User foundUser = userRepository.findByUsername("JaneDoe");
        assertNotNull(foundUser);  // Ensure user is found
        assertEquals("JaneDoe", foundUser.getUsername());  // Check the username
    }
}

এখানে:

  • @DataJpaTest: এটি শুধুমাত্র JPA সম্পর্কিত টেস্টিংয়ের জন্য ব্যবহার করা হয় এবং ডেটাবেস টেবিল তৈরি ও পরিচালনা করার জন্য H2 ডেটাবেস ব্যবহার করে।
  • assertNotNull, assertEquals: ব্যবহার করা হচ্ছে ইউজারের ডেটা যাচাই করার জন্য।

৩. রেস্ট API টেস্টিং - @WebMvcTest

স্প্রিং বুটে রেস্ট API টেস্ট করার জন্য @WebMvcTest ব্যবহার করা হয়। এটি শুধুমাত্র ওয়েব লেয়ার টেস্ট করে এবং সার্ভিস বা ডেটাবেস লেয়ার লোড করে না।

উদাহরণ: কন্ট্রোলার টেস্টিং

ধরা যাক আমাদের একটি UserController ক্লাস আছে, যা ব্যবহারকারী সম্পর্কিত ডেটা প্রদান করে।

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<String> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }
}

এখন, UserController টেস্ট করবো।

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetUser() throws Exception {
        mockMvc.perform(get("/users/1"))
                .andExpect(status().isOk())  // Check if status is OK
                .andExpect(content().string("User1"));  // Check the response content
    }
}

এখানে:

  • @WebMvcTest: এটি শুধুমাত্র ওয়েব লেয়ার টেস্ট করে, সার্ভিস বা ডেটাবেসের বাস্তব কনটেক্সট লোড করে না।
  • MockMvc: এটি HTTP অনুরোধ সিমুলেট করে এবং রেসপন্স যাচাই করার জন্য ব্যবহৃত হয়।
  • andExpect(status().isOk()): রেসপন্স স্ট্যাটাস কোড যাচাই করা হচ্ছে।

৪. মক টেস্টিং (Mock Testing) - @MockBean

যখন আপনি স্প্রিং বুট অ্যাপ্লিকেশনে ডিপেনডেন্সি ইনজেকশন এবং মকিং করতে চান, তখন @MockBean ব্যবহার করা হয়। এটি রেপোজিটরি বা সার্ভিস এর মতো ডিপেনডেন্সি মক করে এবং টেস্টে ফোকাস করা সহজ হয়।

উদাহরণ: মক সার্ভিস টেস্টিং

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class UserServiceMockTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetUserById() {
        User mockUser = new User();
        mockUser.setUsername("MockUser");
        Mockito.when(userRepository.findById(1L)).thenReturn(java.util.Optional.of(mockUser));

        User user = userService.getUserById(1L);

        assertEquals("MockUser", user.getUsername());
    }
}

এখানে:

  • @Mock: এটি UserRepository মক করে।
  • @InjectMocks: এটি UserService ক্লাসে মক ডিপেনডেন্সি ইনজেক্ট করে।

সারাংশ

স্প্রিং বুট টেস্টিং অত্যন্ত গুরুত্বপূর্ণ, যা অ্যাপ্লিকেশনের বিভিন্ন স্তরে কার্যকারিতা নিশ্চিত করে। @SpringBootTest, @DataJpaTest, @WebMvcTest, এবং @MockBean সহ বিভিন্ন টেস্টিং অ্যানোটেশন এবং কৌশল ব্যবহার করে আমরা ইউনিট টেস্ট, ডেটাবেস টেস্ট, রেস্ট API টেস্ট, এবং মক টেস্টিং সহজেই করতে পারি। এসব পদ্ধতির মাধ্যমে অ্যাপ্লিকেশনটি আরও নির্ভরযোগ্য, টেকসই এবং ভুলমুক্ত হয়ে ওঠে।

Content added By
Promotion

Are you sure to start over?

Loading...