परिचय: जावा में परीक्षण की आवश्यकता क्यों है?
\nप्रत्येक Java-डेवलपर कम से कम एक बार ऐसी स्थिति का सामना करता है जब कोड की एक पंक्ति बदलने पर पूरा सिस्टम "टूट" जाता है। ऐसी आपदाओं से बचने के लिए, उद्योग ने परीक्षण की एक सुव्यवस्थित प्रणाली विकसित की है। इस लेख में, हम जावा में परीक्षण के तीन स्तरों पर चर्चा करेंगे: unit (मॉड्यूलर), integration (एकीकरण) और e2e (एंड-टू-एंड)। आप जानेंगे कि वे कैसे भिन्न हैं, किन उपकरणों का उपयोग करना है और जावा में सही तरीके से टेस्ट कैसे लिखना है।
\nचाहे आप Spring Boot पर माइक्रोसर्विसेज लिख रहे हों या डेस्कटॉप एप्लिकेशन, परीक्षण पिरामिड को समझना एक अनिवार्य कौशल है। चलिए शुरू करते हैं!
\n\n1. यूनिट-परीक्षण: गुणवत्ता की नींव
\nUnit-टेस्ट (मॉड्यूलर टेस्ट) बाहरी निर्भरताओं से अलग करके अलग-अलग क्लास या विधियों के काम की जाँच करते हैं। यह परीक्षण का सबसे तेज़ और सस्ता स्तर है।
\n\n1.1 मुख्य उपकरण
\n- \n
- JUnit 5 — Java के लिए मानक फ्रेमवर्क (नवीनतम संस्करण — Jupiter)। \n
- Mockito — mock-ऑब्जेक्ट (स्टब) बनाने के लिए लाइब्रेरी। \n
- AssertJ — फ्लूएंट-असर्ट के समृद्ध सेट वाली लाइब्रेरी। \n
1.2 JUnit 5 और Mockito के साथ यूनिट-टेस्ट का उदाहरण
\nमान लीजिए, हमारे पास एक सेवा UserService है जो रिपॉजिटरी UserRepository पर निर्भर करती है:
public class UserService {\n private final UserRepository repository;\n\n public UserService(UserRepository repository) {\n this.repository = repository;\n }\n\n public String getUserName(Long id) {\n User user = repository.findById(id);\n return user != null ? user.getName() : "Unknown";\n }\n}\nहम Mockito के माध्यम से बाहरी निर्भरता को अलग करते हुए एक यूनिट-टेस्ट लिखते हैं:
\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.mockito.Mockito.when;\n\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n @Mock\n private UserRepository userRepository;\n\n @InjectMocks\n private UserService userService;\n\n @Test\n void testGetUserName_WhenUserExists() {\n // Arrange\n User mockUser = new User(1L, "Alice");\n when(userRepository.findById(1L)).thenReturn(mockUser);\n\n // Act\n String result = userService.getUserName(1L);\n\n // Assert\n assertEquals("Alice", result);\n }\n\n @Test\n void testGetUserName_WhenUserNotFound() {\n when(userRepository.findById(99L)).thenReturn(null);\n\n String result = userService.getUserName(99L);\n\n assertEquals("Unknown", result);\n }\n}\nअच्छे अभ्यास का नियम: एक टेस्ट — एक जाँच। समझने योग्य विधि नामों का उपयोग करें (जैसे, testGetUserName_WhenUserExists)।
\n\n2. इंटीग्रेशन-परीक्षण: अंतःक्रियाओं की जाँच
\nइंटीग्रेशन टेस्ट जाँचते हैं कि सिस्टम के घटक एक साथ कैसे काम करते हैं: डेटाबेस, फ़ाइल सिस्टम, बाहरी API। वे यूनिट-टेस्ट से धीमे होते हैं, लेकिन कनेक्शन की सटीकता में अधिक विश्वास देते हैं।
\n\n2.1 जावा इंटीग्रेशन परीक्षण के लिए उपकरण
\n- \n
- Spring Boot Test — एप्लिकेशन कॉन्टेक्स्ट शुरू करने के लिए
@SpringBootTest। \n - Testcontainers — Docker कंटेनरों में वास्तविक DB (PostgreSQL, MySQL) चलाना। \n
- H2 — तेज़ टेस्ट के लिए in-memory डेटाबेस। \n
2.2 Spring Boot और Testcontainers के साथ इंटीग्रेशन टेस्ट का उदाहरण
\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.t