spring-boot
स्प्रिंग बूट में परीक्षण
खोज…
कैसे एक साधारण स्प्रिंग बूट अनुप्रयोग का परीक्षण करें
हमारे पास एक नमूना स्प्रिंग बूट एप्लिकेशन है जो MongoDB में उपयोगकर्ता डेटा संग्रहीत करता है और हम डेटा को पुनः प्राप्त करने के लिए रेस्ट सेवाओं का उपयोग कर रहे हैं
पहले एक डोमेन क्लास यानी POJO है
@Document
public class User{
@Id
private String id;
private String name;
}
स्प्रिंग डेटा MongoDB पर आधारित एक संबंधित रिपॉजिटरी
public interface UserRepository extends MongoRepository<User, String> {
}
तब हमारे उपयोगकर्ता नियंत्रक
@RestController
class UserController {
@Autowired
private UserRepository repository;
@RequestMapping("/users")
List<User> users() {
return repository.findAll();
}
@RequestMapping(value = "/Users/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
void delete(@PathVariable("id") String id) {
repository.delete(id);
}
// more controller methods
}
और अंत में हमारे स्प्रिंग बूट एप्लीकेशन
@SpringBootApplication
public class Application {
public static void main(String args[]){
SpringApplication.run(Application.class, args);
}
}
यदि, मान लें कि जॉन सीना, द रॉक और ट्रिपलएचएचएच डेटाबेस में केवल तीन उपयोगकर्ता थे, तो / उपयोगकर्ताओं को एक अनुरोध निम्नलिखित प्रतिक्रिया देगा:
$ curl localhost:8080/users
[{"name":"John Cena","id":"1"},{"name":"The Rock","id":"2"},{"name":"TripleHHH","id":"3"}]
अब कोड का परीक्षण करने के लिए हम यह सत्यापित करेंगे कि आवेदन कार्य
@RunWith(SpringJUnit4ClassRunner.class) // 1
@SpringApplicationConfiguration(classes = Application.class) // 2
@WebAppConfiguration // 3
@IntegrationTest("server.port:0") // 4
public class UserControllerTest {
@Autowired // 5
UserRepository repository;
User cena;
User rock;
User tripleHHH;
@Value("${local.server.port}") // 6
int port;
@Before
public void setUp() {
// 7
cena = new User("John Cena");
rock = new User("The Rock");
tripleHHH = new User("TripleHH");
// 8
repository.deleteAll();
repository.save(Arrays.asList(cena, rock, tripleHHH));
// 9
RestAssured.port = port;
}
// 10
@Test
public void testFetchCena() {
String cenaId = cena.getId();
when().
get("/Users/{id}", cenaId).
then().
statusCode(HttpStatus.SC_OK).
body("name", Matchers.is("John Cena")).
body("id", Matchers.is(cenaId));
}
@Test
public void testFetchAll() {
when().
get("/users").
then().
statusCode(HttpStatus.SC_OK).
body("name", Matchers.hasItems("John Cena", "The Rock", "TripleHHH"));
}
@Test
public void testDeletetripleHHH() {
String tripleHHHId = tripleHHH.getId();
when()
.delete("/Users/{id}", tripleHHHId).
then().
statusCode(HttpStatus.SC_NO_CONTENT);
}
}
व्याख्या
- किसी भी अन्य स्प्रिंग आधारित टेस्ट की तरह, हमें स्प्रिंगजेनिट 4
SpringJUnit4ClassRunner
आवश्यकता है ताकि एक एप्लिकेशन संदर्भ बनाया जाए। -
@SpringApplicationConfiguration
एनोटेशन@SpringApplicationConfiguration
एनोटेशन के समान है,@ContextConfiguration
उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि परीक्षण में किस एप्लिकेशन संदर्भ (एस) का उपयोग किया जाना चाहिए। इसके अतिरिक्त, यह स्प्रिंग बूट विशिष्ट कॉन्फ़िगरेशन, गुण, और इसी तरह पढ़ने के लिए तर्क को ट्रिगर करेगा। -
@WebAppConfiguration
आदेश स्प्रिंग बताने के लिए है कि एक में मौजूद होना चाहिएWebApplicationContext
परीक्षण के लिए लोड किया जाना चाहिए। यह वेब एप्लिकेशन के रूट को पथ निर्दिष्ट करने के लिए एक विशेषता भी प्रदान करता है। -
@IntegrationTest
का उपयोग स्प्रिंग बूट को बताने के लिए किया जाता है कि एम्बेडेड वेब सर्वर को शुरू किया जाना चाहिए। उपनिवेश-या अलग-अलग नाम-मूल्य युग्म प्रदान करके, किसी भी पर्यावरण चर को ओवरराइड किया जा सकता है। इस उदाहरण में,"server.port:0"
सर्वर की डिफ़ॉल्ट पोर्ट सेटिंग को ओवरराइड करेगा। आम तौर पर, सर्वर निर्दिष्ट पोर्ट नंबर का उपयोग करना शुरू कर देगा, लेकिन मान 0 का एक विशेष अर्थ है। जब इसे 0 के रूप में निर्दिष्ट किया जाता है, तो यह स्प्रिंग बूट को मेजबान पर्यावरण पर बंदरगाहों को स्कैन करने और एक यादृच्छिक, उपलब्ध पोर्ट पर सर्वर को शुरू करने के लिए कहता है। यह उपयोगी है अगर हमारे पास विकास मशीनों और बिल्ड सर्वर पर विभिन्न बंदरगाहों पर कब्जा करने वाली विभिन्न सेवाएं हैं जो संभावित रूप से एप्लिकेशन पोर्ट से टकरा सकती हैं, जिस स्थिति में आवेदन शुरू नहीं होगा। दूसरे, यदि हम विभिन्न एप्लिकेशन संदर्भों के साथ कई एकीकरण परीक्षण बनाते हैं, तो वे भी टकरा सकते हैं यदि परीक्षण समवर्ती रूप से चल रहे हैं। - हमारे पास एप्लिकेशन संदर्भ तक पहुंच है और किसी भी स्प्रिंग बीन को इंजेक्ट करने के लिए ऑटोवेयरिंग का उपयोग कर सकते हैं।
-
@Value("${local.server.port}”)
का उपयोग वास्तविक पोर्ट नंबर के लिए किया जाएगा। - हम कुछ इकाइयाँ बनाते हैं जिनका उपयोग हम सत्यापन के लिए कर सकते हैं।
- MongoDB डेटाबेस को साफ़ किया गया है और प्रत्येक परीक्षण के लिए फिर से शुरू किया गया है ताकि हम हमेशा एक ज्ञात स्थिति के खिलाफ मान्य हों। चूंकि परीक्षणों के क्रम को परिभाषित नहीं किया गया है, इसलिए संभावना है कि TestFetchAll () परीक्षण विफल हो जाता है अगर यह TestDeletetripleHHH () परीक्षण के बाद निष्पादित किया जाता है।
- हम सही पोर्ट का उपयोग करने के लिए रेस्ट एश्योर्ड को निर्देश देते हैं। यह एक ओपन सोर्स प्रोजेक्ट है जो बाकी सेवाओं के परीक्षण के लिए जावा डीएसएल प्रदान करता है
- रेस्ट एश्योर्ड का उपयोग करके टेस्ट लागू किए जाते हैं। हम TestRestTemplate या किसी अन्य http क्लाइंट का उपयोग करके परीक्षणों को लागू कर सकते हैं, लेकिन मैं रेस्ट एश्योर्ड का उपयोग करता हूं क्योंकि हम RestDocs का उपयोग करके संक्षिप्त दस्तावेज़ लिख सकते हैं
अलग yaml [या गुण] फ़ाइल लोड करना या कुछ गुणों को ओवरराइड करना
जब हम @SpringApplicationConfiguration
उपयोग करते हैं, @SpringApplicationConfiguration
यह application.yml
[गुणों] से कॉन्फ़िगरेशन का उपयोग करेगा जो कुछ निश्चित स्थिति में उचित नहीं है। तो गुणों को ओवरराइड करने के लिए हम @TestPropertySource
एनोटेशन का उपयोग कर सकते हैं।
@TestPropertySource(
properties = {
"spring.jpa.hibernate.ddl-auto=create-drop",
"liquibase.enabled=false"
}
)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTest{
// ...
}
हम के गुणों विशेषता का उपयोग कर सकते हैं @TestPropertySource
विशिष्ट गुण हम चाहते हैं ओवरराइड करने के लिए। ऊपर के उदाहरण में हम संपत्ति अधिभावी कर रहे हैं spring.jpa.hibernate.ddl-auto
के लिए create-drop
। और liquibase.enabled
false
करने के लिए सक्षम false
।
अलग yml फ़ाइल लोड हो रहा है
यदि आप परीक्षण के लिए पूरी तरह से अलग yml फ़ाइल लोड करना चाहते हैं तो आप @TestPropertySource
पर स्थान विशेषता का उपयोग कर सकते हैं।
@TestPropertySource(locations="classpath:test.yml")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTest{
// ...
}
वैकल्पिक रूप से विकल्प
विकल्प 1:
तुम भी test > resource
पर एक yml फ़ाइल रखने के विभिन्न yml फ़ाइल लोड कर सकते हैं test > resource
निर्देशिका
विकल्प 2:
@ActiveProfiles
एनोटेशन का उपयोग करना
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ActiveProfiles("somename")
public class MyIntTest{
}
आप देख सकते हैं कि हम @ActiveProfiles
एनोटेशन का उपयोग कर रहे हैं और हम मान के रूप में somename पास कर रहे हैं।
application-somename.yml
नामक एक फ़ाइल बनाएं और परीक्षण इस फ़ाइल को लोड करेगा।