JUnit হল একটি widely used framework Java এ unit testing এর জন্য, যা Spring Boot অ্যাপ্লিকেশনসহ অন্যান্য Java অ্যাপ্লিকেশনগুলির testing করার জন্য অত্যন্ত গুরুত্বপূর্ণ। Integration testing এমন একটি testing পদ্ধতি যেখানে সম্পূর্ণ সিস্টেমের বিভিন্ন উপাদান একসাথে কাজ করার ক্ষমতা পরীক্ষা করা হয়। Spring Boot অ্যাপ্লিকেশনে JUnit এবং Spring Test ব্যবহার করে ইন্টিগ্রেশন টেস্টিং করা যায়।
এই টিউটোরিয়ালে আমরা দেখব কীভাবে Spring Boot অ্যাপ্লিকেশনে JUnit ব্যবহার করে ইন্টিগ্রেশন টেস্টিং করতে হয়। এর মধ্যে Spring Boot Test, @SpringBootTest, এবং @AutoConfigureMockMvc এর ব্যবহার বিস্তারিতভাবে আলোচনা করা হবে।
১. Spring Boot Integration Testing Overview
Integration testing এমন একটি প্রক্রিয়া যেখানে ডাটাবেস, REST APIs, সার্ভিস, রিপোজিটরি ইত্যাদি একসাথে কাজ করে কিনা তা পরীক্ষা করা হয়। Spring Boot এর মধ্যে JUnit ব্যবহারের মাধ্যমে আমরা সহজেই এ ধরনের পরীক্ষা করতে পারি। Spring Boot এর সাথে JUnit ব্যবহার করার মূল সুবিধা হলো:
- End-to-End Testing: ডাটাবেস, সার্ভিস এবং অন্যান্য মডিউল একসাথে পরীক্ষা করা।
- Test Real Components: প্রকৃত সার্ভিস, রিপোজিটরি এবং ডাটাবেসের সাথে পরীক্ষা করা।
- Simplicity: Spring Boot টেস্টিং এর জন্য সহজ কনফিগারেশন।
২. Spring Boot Integration Test এর জন্য কনফিগারেশন
Spring Boot অ্যাপ্লিকেশনে ইন্টিগ্রেশন টেস্ট করার জন্য আপনাকে @SpringBootTest অ্যানোটেশন ব্যবহার করতে হবে, যা Spring Boot কনটেক্সট লোড করতে সহায়তা করে।
২.১ pom.xml ডিপেনডেন্সি (Maven)
প্রথমে, pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে।
<dependencies>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
এখানে, spring-boot-starter-test ডিপেনডেন্সি সমস্ত প্রয়োজনীয় টেস্টিং ফ্রেমওয়ার্ক যেমন JUnit, Mockito, Spring Test ইত্যাদি অন্তর্ভুক্ত করে।
২.২ build.gradle ডিপেনডেন্সি (Gradle)
যদি আপনি Gradle ব্যবহার করেন, তাহলে build.gradle ফাইলে নিচের ডিপেনডেন্সি যুক্ত করুন:
dependencies {
// Spring Boot Starter Test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
৩. Spring Boot Integration Testing উদাহরণ
ধরা যাক, আমাদের একটি Spring Boot অ্যাপ্লিকেশন রয়েছে যার মধ্যে একটি UserService ক্লাস আছে এবং আমরা এটি টেস্ট করতে চাই।
৩.১ UserService.java (Service Class)
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserById(Long userId) {
return "User" + userId;
}
}
এখানে, UserService একটি সিম্পল সার্ভিস যা userId দিয়ে ইউজারের নাম রিটার্ন করে।
৩.২ UserController.java (Controller Class)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user")
public String getUser(@RequestParam Long userId) {
return userService.getUserById(userId);
}
}
এখানে, UserController একটি REST API প্রদান করছে যেটি ইউজারের তথ্য রিটার্ন করবে।
৪. Integration Test Class
Spring Boot অ্যাপ্লিকেশনে ইন্টিগ্রেশন টেস্ট করতে @SpringBootTest অ্যানোটেশন ব্যবহার করা হয়, যা Spring Boot কনটেক্সট লোড করবে এবং প্রকৃত সার্ভিস এবং রেপোজিটরির সাথে ইন্টিগ্রেশন টেস্টিং করবে।
৪.১ UserControllerIntegrationTest.java (Test Class)
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
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;
@SpringBootTest
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
// Testing the /user API
mockMvc.perform(get("/user?userId=1"))
.andExpect(status().isOk())
.andExpect(content().string("User1"));
}
}
এখানে:
- @SpringBootTest: Spring Boot কনটেক্সট লোড করার জন্য ব্যবহৃত হয়।
- MockMvc: এটি HTTP রিকোয়েস্ট এবং রেসপন্স পরীক্ষা করতে ব্যবহৃত হয়।
- perform(get("/user?userId=1")): এটি
/userAPI কল করে যেখানেuserId=1প্যারামিটার পাঠানো হচ্ছে। - andExpect(status().isOk()): এটি রেসপন্স স্ট্যাটাস চেক করে যা 200 OK হওয়া উচিত।
- andExpect(content().string("User1")): এটি নিশ্চিত করে যে রেসপন্স কনটেন্ট "User1"।
৫. Spring Boot Integration Test Running
ইন্টিগ্রেশন টেস্ট চালানোর জন্য নিচের কমান্ড ব্যবহার করা যাবে:
Maven:
mvn test
Gradle:
gradle test
এই কমান্ডগুলো JUnit টেস্ট রান করবে এবং আপনার UserController API টেস্ট করে দেখবে।
৬. MockMvc এবং WebEnvironment
Spring Boot ইন্টিগ্রেশন টেস্টে MockMvc এবং @WebMvcTest ব্যবহৃত হয়, যা আপনার Controller বা Web Layer পরীক্ষা করতে সহায়তা করে। যদি আপনি সম্পূর্ণ অ্যাপ্লিকেশন কনটেক্সট লোড করতে চান এবং ডাটাবেস সংযুক্ত করতে চান, তাহলে @SpringBootTest ব্যবহৃত হয়।
Example with @WebMvcTest
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/user?userId=1"))
.andExpect(status().isOk())
.andExpect(content().string("User1"));
}
}
এখানে, @WebMvcTest শুধুমাত্র UserController টেস্ট করবে এবং পুরো Spring Boot অ্যাপ্লিকেশন কনটেক্সট লোড করবে না, যা পারফরম্যান্সের জন্য উপকারী হতে পারে।
৭. Conclusion
JUnit এবং Spring Boot এর মাধ্যমে Integration Testing করতে অনেক সহজ। @SpringBootTest অ্যানোটেশন এবং MockMvc ব্যবহার করে আপনি আপনার Controller এবং Web Layer এর সাথে সম্পূর্ণ অ্যাপ্লিকেশন পরীক্ষা করতে পারেন। এই প্রক্রিয়া দিয়ে আপনি ডাটাবেস, সার্ভিস, এবং রেপোজিটরি সংযুক্ত পরীক্ষাও করতে পারবেন।
Integration Testing নিশ্চিত করে যে আপনার Spring Boot অ্যাপ্লিকেশন এর সমস্ত অংশ সঠিকভাবে কাজ করছে এবং এটি end-to-end কাজ করার জন্য প্রস্তুত।
Read more