मैं सोच रहा हूं कि क्या जावा के लिए मौजूदा उपकरणों द्वारा सशर्त कोड कवरेज को मापना अप्रचलित नहीं है क्योंकि जावा 8 ऊपर आया था। जावा 8 के साथ Optional
और Stream
हम अक्सर कोड शाखाओं / छोरों से बच सकते हैं, जिससे सभी संभव विभाजन भागों का परीक्षण किए बिना बहुत अधिक सशर्त कवरेज प्राप्त करना आसान हो जाता है। आइए पुराने जावा कोड की जावा 8 कोड से तुलना करें:
जावा 8 से पहले:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
उपरोक्त विधि में 3 संभावित निष्पादन पथ हैं। 100% सशर्त कवरेज प्राप्त करने के लिए हमें 3 यूनिट परीक्षण बनाने की आवश्यकता है।
जावा 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
इस मामले में, शाखाएं छिपी हुई हैं और हमें 100% कवरेज प्राप्त करने के लिए केवल 1 परीक्षण की आवश्यकता है और इससे कोई फर्क नहीं पड़ता कि हम किस मामले में परीक्षण करेंगे। हालांकि अभी भी वही 3 तार्किक शाखाएं हैं जिन्हें कवर किया जाना चाहिए मुझे विश्वास है। मुझे लगता है कि यह इन दिनों सशर्त कवरेज के आंकड़ों को पूरी तरह से अविश्वसनीय बनाता है।
क्या यह जावा 8 कोड के लिए सशर्त कवरेज को मापने के लिए समझ में आता है? क्या कोई अन्य उपकरण कोड किए गए हैं?
getName
? ऐसा लगता है कि यदि user
अशक्त है, तो उसे "अज्ञात" वापस करना चाहिए। यदि user
अशक्त नहीं है और user.getName()
अशक्त है, तो उसे "अज्ञात" लौटना चाहिए। यदि user
अशक्त नहीं है और अशक्त user.getName()
नहीं है, तो उसे वापस आ जाना चाहिए। तो आप उन तीन मामलों को यूनिट-टेस्ट करेंगे क्योंकि यही अनुबंध getName
है। आप इसे पिछड़ा हुआ कर रहे हैं। आप शाखाओं को नहीं देखना चाहते हैं और उन के अनुसार परीक्षण लिखना चाहते हैं, आप अपने अनुबंध के अनुसार अपने परीक्षण लिखना चाहते हैं, और यह सुनिश्चित करें कि अनुबंध भरा हुआ है। जब आपके पास अच्छा कवरेज है।