writing unit tests with spock framework
स्पॉक फ्रेमवर्क के साथ यूनिट टेस्ट लिखना: टेस्ट फिक्स्चर, अभिकथन और रिपोर्टिंग
इस में Spock पर शुरुआती शुरुआती गाइड , एक संक्षिप्त स्पॉक फ्रेमवर्क और ग्रूवी प्रोग्रामिंग पर परिचय हमारे पिछले ट्यूटोरियल में दिया गया था।
इस ट्यूटोरियल में, हम आरंभ करने के लिए आवश्यक सभी विवरणों / चरणों से गुजरेंगे इकाई का परीक्षण स्पॉक में।
सादगी के लिए, हम एक सरल कैलकुलेटर एप्लिकेशन का परीक्षण करने जा रहे हैं, जिसमें अलग-अलग तरीके हैं जैसे जोड़, घटाव, गुणा, भाग, आदि, जो सभी पूर्णांक मापदंडों को स्वीकार करते हैं और पूर्णांक आउटपुट को वापस करते हैं।
वास्तविक दुनिया में जावा के अनुप्रयोग
आप क्या सीखेंगे:
- स्पॉक वीडियो ट्यूटोरियल के साथ यूनिट परीक्षण
- शुरू करना
- 'डीईएफ़' कीवर्ड
- एक स्पोक विशिष्टता का जीवनचक्र
- कटाक्ष जोर
- रिपोर्टिंग
- निष्कर्ष
- अनुशंसित पाठ
स्पॉक वीडियो ट्यूटोरियल के साथ यूनिट परीक्षण
शुरू करना
किसी अन्य इकाई परीक्षण ढांचे के समान, Spock का उपयोग परीक्षण के तहत एक आवेदन के लिए परिदृश्य / परीक्षण मामलों को लिखने के लिए किया जा सकता है। हम मौजूदा / ज्ञात रूपरेखाओं के साथ स्पॉक फ्रेमवर्क की विभिन्न विशेषताओं की तुलना और इसके विपरीत करने की कोशिश करेंगे JUnit ।
'डीईएफ़' कीवर्ड
आइए हम पहले ग्रूवी के 'डीईएफ' कीवर्ड को संक्षेप में समझने की कोशिश करें। डिफ कीवर्ड का उपयोग टाइप-डिफ को परिभाषित करने के लिए किया जाता है और इसका उपयोग किसी फ़ंक्शन के साथ-साथ फ़ील्ड / चर को घोषित करने के लिए भी किया जा सकता है।
'डीईएफ' का उपयोग आमतौर पर तब किया जाता है जब हम किसी फ़ील्ड के प्रकार या किसी प्रकार के रिटर्न को प्रतिबंधित नहीं करना चाहते हैं। आइए एक ग्रूवी क्लास और उसके सभी मान्य उपयोगों में डीफ़ कीवर्ड के कुछ उदाहरण देखें।
// def as variable types def inputNum = 100 def inputStr = 'hello world!!' def app = new CalculatorApp() // def as return type of function def 'test function'() { // function body here }
एक स्पोक विशिष्टता का जीवनचक्र
निष्पादित की गई स्पेक कल्पना जब परिभाषित सभी परीक्षणों को देखती है और उन्हें एक-एक करके निष्पादित करती है। हालांकि, कुछ अन्य कार्यात्मकताएं / विशेषताएं हैं जो स्पॉक द्वारा परीक्षणों को कम निरर्थक और अधिक पठनीय बनाने के लिए प्रदान की जाती हैं।
नीचे कुछ विशेषताओं पर चर्चा करते हैं:
Spec के एक भाग के रूप में Input / Variables को परिभाषित करना
एक ही इनपुट मानों का उपयोग करके कई परीक्षण करने पर विचार करें। एक तरीका व्यक्तिगत रूप से प्रत्येक परीक्षण में इनपुट मूल्यों को इनिशियलाइज़ करना होगा, अन्यथा हम सीधे स्तर पर फ़ील्ड्स को परिभाषित कर सकते हैं और यह सुनिश्चित कर सकते हैं कि प्रत्येक परीक्षण से पहले, फ़ील्ड्स को इनिशियलाइज़ किया जाएगा और निष्पादित होने वाले परीक्षण के लिए उपलब्ध होगा।
आइए हमारे कैलकुलेटर एप्लिकेशन वर्ग के लिए एक उदाहरण देखें ।
हम अनुमान स्तर पर इनपुट डेटा को परिभाषित करेंगे ताकि यह विनिर्देश में मौजूद सभी परीक्षणों के लिए प्रारंभिक मूल्यों के साथ उपलब्ध होगा।
class CalculatorAppSpec extends Specification { def input1 = 50 def input2 = 10 def result = 0 def app = new CalculatorApp() def 'addition with valid inputs return expected result'() { when: result = app.add(input1, input2) then: result == 60 } def 'multiplication with valid inputs return expected result'() { when: result = app.multiply(input1, input2) then: result == 500 } def 'division with valid inputs return expected result'() { when: result = app.divide(input1, input2) then: result == 5 } def 'subsctraction with valid inputs return expected result'() { when: result = app.substract(input1, input2) then: result == 40 } }
इस कोड नमूने में, आप देख सकते हैं, हमने इनपुट 1, इनपुट 2, परीक्षण के तहत आवेदन और परिणाम के स्तर पर परिभाषित किया है। यह सुनिश्चित करता है कि हर बार एक परीक्षण कल्पना फ़ाइलों से चलाया जाता है, और आरंभीकृत फ़ील्ड को उस परीक्षण में पास किया जाता है। यह वास्तव में इनपुट मूल्यों के साथ हर बार परीक्षण स्थापित करने की आवश्यकता को समाप्त करता है।
टेस्ट फिक्स्चर
अधिकांश यूनिट टेस्टिंग फ्रेमवर्क के समान, स्पॉक भी परीक्षण निष्पादन के विशिष्ट जीवन चक्र की घटनाओं पर विशेष तर्क / कार्यों को निष्पादित करने के लिए सेटअप और सफाई तरीके प्रदान करता है।
setupSpec और cleanupSpec
इन तरीकों को प्रत्येक विशेष निष्पादन के लिए एक बार बुलाया जाता है और क्रमशः परीक्षण निष्पादन से पहले और बाद में बुलाया जाता है। ये @ से तुलनीय हैं कक्षा से पहले तथा @ क्लास के बाद JUnit की टिप्पणियां।
सेटअप और सफाई
इन तरीकों को युक्ति में प्रत्येक परीक्षण के निष्पादन से पहले और बाद में बुलाया जाता है।
ये हुक किसी भी तर्क / संहिता के टुकड़े के लिए सही जगह है जिसे आप परीक्षण निष्पादन से पहले और बाद में निष्पादित करना चाहते हैं। उदाहरण के लिए , सफाई में, आप डेटाबेस कनेक्शन को बंद करने के लिए एक कोड लिख सकते हैं (यदि कोई हो) जो परीक्षण के दौरान उपयोग किया गया था।
इनकी तुलना @ से की जा सकती है सबसे पहले तथा @ बाद में JUnit में एनोटेशन।
आइए हमारे कैलकुलेटर एप्लिकेशन टेस्ट में इन जुड़नार का एक उदाहरण देखें।
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') }
यदि उपरोक्त परीक्षण स्थिरता कोड को 4 परीक्षणों से युक्त एक युक्ति में जोड़ा जाता है, तो आउटपुट निम्नानुसार होगा:
###in setup spec! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! ###in cleanup spec!
कटाक्ष जोर
स्पॉक में अभिप्रायों को पावर एस्सर कहते हैं (और इसे बाद में स्पॉक द्वारा पेश किए जाने के बाद ग्रूवी द्वारा अपनाया गया था)। Spock assertions किसी भी मुखर विफलता के मामले में बहुत से नैदानिक अपवाद प्रदान करते हैं।
कोई आसानी से पता लगा सकता है कि क्रिया के विपरीत विफलता निदान को देखकर क्या गलत हुआ जोर JUnit और अन्य रूपरेखाओं में।
आइए एक उदाहरण के साथ इसे समझने की कोशिश करें और JUnit के साथ इसके विपरीत करें
हम एक साधारण परीक्षण के साथ काम करेंगे जो स्ट्रिंग समानता के लिए जाँच करता है और यह देखता है कि एक विफलता के मामले में निदान क्या उत्पन्न होते हैं।
स्पॉक टेस्ट
def 'check case-insensitive equality of 2 strings'() { given: 'two input strings' String str1 = 'hello' String str2 = 'HELLO world' when: 'strings are lowercased' str1 = str1.toLowerCase() str2 = str2.toLowerCase() then: 'equal strings should return success' str1 == str2 }
JUnit टेस्ट
@Test public void compareStrings_withValidInput_shouldReturnSuccess() { // Arrange String str1 = 'hello'; String str2 = 'HELLO world'; // Act str1 = str1.toLowerCase(); str2 = str2.toLowerCase(); // Assert Assert.assertEquals(str1,str2); }
स्पॉक आउटपुट
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello
JUnit आउटपुट
org.junit.ComparisonFailure: Expected :hello Actual :hello world
जैसा कि आप ऊपर से अनुमान लगा सकते हैं, स्पॉक द्वारा प्रदान की गई नैदानिक जानकारी में बेहतर विस्तार है और JUnit जैसे अन्य फ्रेमवर्क की तुलना में अधिक उपयोगकर्ता के अनुकूल है।
जोरदार टिप्स और ट्रिक्स
एक ही बार में कई तत्वों को शामिल करना - Spock विभिन्न प्रकार के आश्रयों के लिए प्रदान करता है और एक ऐसा '*' अंकन है जो सूची में तत्वों को शामिल करने की अनुमति देता है।
आइए इसे एक उदाहरण से समझते हैं:
सिटीनाम और वर्ग के रूप में शहरनाम और आबादी वाले शहर में विचार करें। हम दिए गए सूची में शामिल शहरों के नामों का पता लगाने के लिए एक स्पॉक टेस्ट लिखेंगे।
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; }
आइए अब परीक्षण देखें:
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') }
जैसा कि ऊपर आशुलिपि आशुलिपि में दिखाया गया है कि आप '*' कीवर्ड की मदद से पूरी सूची को मान्य कर सकते हैं।
आइए यह भी देखें कि विफलता कैसे दिखेगी। मैं ऊपर दिए गए दावे से किसी एक शहर का नाम हटा दूंगा
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7)
आप देख सकते हैं कि मुखर विफलता की नैदानिक जानकारी समृद्ध और समझने में आसान है।
उत्तोलक बंद करने वाला पैरामीटर - हर ()।
आइए देखें, हम सूची या संग्रह के प्रत्येक तत्व के लिए एक दावे को जोड़ने के लिए () हर नाम के क्लोजर पैरामीटर का लाभ कैसे उठा सकते हैं। उसी उदाहरण में, आइए एक दावे को जोड़ने का प्रयास करें जो दिए गए इनपुट> 50 होने पर प्रत्येक शहर की आबादी को मान्य करता है।
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') and: cityList.population.every() { it > 50 } }
थ्रोसन अपवादों को जोड़ना
अपवादों को 'तब' ब्लॉक में फेंकने के लिए कहा जा सकता है (जिसका अर्थ है कि जब ब्लॉक भी आवश्यक हो)। अपवाद विस्तार का निदान किसी क्षेत्र में फेंके गए अपवाद को निर्दिष्ट करके और फेंके गए अपवाद के आवश्यक गुणों का पता लगाकर किया जा सकता है।
आइए एक ही CityInfo वर्ग का उपयोग करें और एक विधि को परिभाषित करें जो एक अपवाद फेंकता है और इसके लिए एक परीक्षण लिखें।
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; public CityInfo() { } public int getCleanlinessScore() { throw new RuntimeException('method not implemented'); } }
आइए अब परीक्षण को देखें:
def 'cleanliness score throws runtime exception with message - method not implemented'() { given: CityInfo app = new CityInfo(); when: app.cleanlinessScore() then: def e = thrown(RuntimeException) e.message == 'method not implemented' }
रिपोर्टिंग
सुंदर और विस्तृत HTML आधारित रिपोर्ट तैयार करने के लिए, ऐसी लाइब्रेरी उपलब्ध हैं जिन्हें बिल्ड फ़ाइल में जोड़ा जा सकता है और अब जब भी निर्माण (या प्रत्यक्ष निष्पादन) के दौरान परीक्षण निष्पादित होते हैं, तो विस्तृत HTML आधारित रिपोर्ट उत्पन्न हो जाएगी। आउटपुट फ़ोल्डर।
परीक्षण रिपोर्ट उत्पन्न करने के लिए, निम्न पुस्तकालयों को build.gradle फ़ाइल में जोड़ें (और इसी तरह Maven pom.xml फ़ाइल के लिए भी)।
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13'
अब प्रोजेक्ट का निर्माण करें और 'परीक्षण' फ़ोल्डर में सभी परीक्षण चलाकर या निष्पादित करके परीक्षणों का निष्पादन करें स्वच्छ टेस्ट ”।
तुमसे खुल सकता है index.html सभी स्पॉक स्पेक्स के लिए एक सारांशित रिपोर्ट प्राप्त करने के लिए फ़ाइल जो निष्पादित करने के लिए उपलब्ध थी।
यदि आप किसी विशिष्ट युक्ति के लिए विस्तृत रिपोर्ट देखना चाहते हैं, तो उपरोक्त सूची से कल्पना पर क्लिक करें और आप असफलताओं की विस्तृत रिपोर्ट के साथ-साथ सफलताओं को भी देख सकते हैं।
निष्कर्ष
इस ट्यूटोरियल में हमने स्पॉक फ्रेमवर्क के साथ यूनिट टेस्टिंग की मूल बातें कवर कीं। हमने अभिकथन लिखने के लिए अलग-अलग तरीके और आशुलिपि देखीं और जोरदार विफलताओं के लिए स्पॉक फ्रेमवर्क द्वारा उत्पन्न समृद्ध निदान जानकारी की तरह।
हमने यह भी देखा कि कैसे हम Spock परीक्षण के लिए शांत सुंदर HTML आधारित रिपोर्ट तैयार कर सकते हैं जिसमें निष्पादित परीक्षणों के लिए समान विस्तृत निदान शामिल हैं।
हमारा आने वाला ट्यूटोरियल आपको विस्तार से Spock के साथ पैरामीटराइज्ड टेस्ट लिखने के बारे में बताएगा !!
PREV ट्यूटोरियल | अगले ट्यूटोरियल
अनुशंसित पाठ
- स्पॉक फ्रेमवर्क के साथ डेटा-संचालित या परिमितित परीक्षण
- उत्तर के साथ स्पॉक साक्षात्कार प्रश्न (सर्वाधिक लोकप्रिय)
- सेलेनियम के साथ एकीकरण और कार्यात्मक परीक्षण के लिए स्पॉक
- मॉकिंग और स्टबिंग (वीडियो ट्यूटोरियल के साथ उदाहरण)
- स्पॉक ट्यूटोरियल: स्पॉक एंड ग्रूवी के साथ परीक्षण
- मॉकिटो ट्यूटोरियल: यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिटो फ्रेमवर्क
- इकाई परीक्षण, एकीकरण परीक्षण और कार्यात्मक परीक्षण के बीच अंतर
- सफल इकाई परीक्षण की कुंजी - डेवलपर्स कैसे अपने कोड का परीक्षण करते हैं?