स्कालास्ट और स्काला स्पेक्स यूनिट टेस्ट फ्रेमवर्क में क्या अंतर है?


121

दोनों बीडीडी (बिहेवियर ड्रिवेन डेवलपमेंट) स्कैला में लिखे गए स्कैला के लिए सक्षम इकाई परीक्षण रूपरेखा हैं। और चश्मा बनाया गया है ScalaTest ढांचे को भी शामिल कर सकते हैं । लेकिन Specs क्या ScalaTest की पेशकश नहीं करता है? क्या अंतर हैं?


1
मुझे विश्वास नहीं है कि यह कहना सही है कि Specs ScalaTest पर बनाए गए हैं। ध्यान दें कि पोम में निर्भरता वैकल्पिक है। चश्मा में स्कैलेस्ट सूट के रूप में चलने के लिए विशिष्टताओं को रखने की क्षमता है।
ज्यॉफ कॉमेडी

स्केलेस्टेस्ट कई लिबास के लिए विशिष्ट समर्थन के साथ स्केलेस्टप्लस प्रदान करता है। यह दिलचस्प हो सकता है। उदाहरण के लिए, उनके पास प्ले फ्रेमवर्क के लिए
स्कैल्पेस्टप्लस है

जवाबों:


172

चश्मा और स्केलेस्ट दोनों खुश उपयोगकर्ताओं के साथ अच्छे उपकरण हैं, लेकिन वे कई मायनों में भिन्न हैं। आप शायद स्काला में अपने मुख्य परीक्षण उपकरण के रूप में एक चुनना चाहेंगे, लेकिन दूसरे को छोड़ने की ज़रूरत नहीं है क्योंकि आप दोनों के टुकड़ों का उपयोग कर सकते हैं। यदि आप स्केलेस्ट के FeatureSpecसिंटैक्स को पसंद करते हैं और उदाहरण के लिए ' मॉकिटो सिंटैक्स' को निर्दिष्ट करते हैं, तो आप दोनों जार फ़ाइलों को अपने क्लासपाथ में रख सकते हैं और एक ही समय में दोनों का उपयोग कर सकते हैं। यहाँ मैं कोशिश करूँगा और मुख्य डिज़ाइन दर्शन अंतर पर कब्जा कर सकता हूँ जो मैंने ऐनक और स्कैलेस्ट के बीच देखा है।

संभवतः उपकरणों के बीच मुख्य दार्शनिक अंतर यह है कि चश्मा व्यवहार-प्रेरित विकास (BDD) के लिए डिज़ाइन किया गया है, जबकि ScalaTest अधिक सामान्य है। ScalaTest ऐसे लक्षण प्रदान करता है जिन्हें आप BDD सहित अपनी परीक्षण कक्षाओं में पसंद किए गए व्यवहार को प्राप्त करने के लिए एक साथ मिला सकते हैं, और यदि आप कुछ अलग चाहते हैं तो आप आसानी से अपने स्वयं के व्यवहार को भी परिभाषित कर सकते हैं।

के माध्यम से ScalaTest का समर्थन करता है BDD इसके Spec, FeatureSpec, WordSpec, FlatSpec, और GivenWhenThenलक्षण, और भी लक्षण है कि आप में मिश्रण एक अच्छा मिलान वाक्य रचना पाने के लिए कर सकते हैं। यदि आपको "चाहिए", तो आप कंधे मेचर्स में मिलाएं। यदि आपको "मस्ट" पसंद है, तो आप मिश्रण करते हैं MustMatchers। लेकिन अगर आप BDD को पसंद करते हैं, लेकिन माचिस के सिंटैक्स को पसंद नहीं करते हैं, तो आप स्केलेस्ट के विशिष्ट लक्षणों में से एक का उपयोग बिना माचिस के निशान में मिलाए कर सकते हैं। Specs में एक Specification Class होता है जिसे आप बढ़ाते हैं, और आपको अपने मिलान शब्दों में "must" शब्द का उपयोग करना चाहिए। एक बड़ा दार्शनिक अंतर जो यहां स्पष्ट है कि स्कालास्ट आपको बहुत अधिक विकल्प देता है। चुनाव के इस स्थान को नेविगेट करने में आसान बनाने के लिए, मैं यहां एक निर्णय वृक्ष प्रदान करता हूं:

http://www.scalatest.org/quick_start

स्केलेस्ट और स्पेक्स के बीच मैचर सिंटैक्स भी अलग होता है। ScalaTest में मैंने यह देखने की कोशिश की कि मैं संचालक संकेतन के साथ कितनी दूर जा सकता हूं, और शब्दों के बीच रिक्त स्थान के साथ अंग्रेजी वाक्यों को पढ़ने वाले मैच्योर भावों के साथ समाप्त हुआ। स्पेक्टर मैचर सिंटैक्स शब्दों को ऊंट के मामले के साथ अधिक चलाता है।

स्पेक्स में स्कैलेस्ट की तुलना में अधिक मैचर्स हैं, और मुझे लगता है कि डिजाइन दृष्टिकोण में अंतर को दर्शाता है। मैंने वास्तव में मेरे द्वारा बनाए गए मैचियर सिंटैक्स के 2/3 हिस्से को काट दिया और रिलीज़ के लिए विचार किया। मैं भविष्य के रिलीज में और अधिक मिलान जोड़ूंगा, लेकिन यह सुनिश्चित करना चाहता था कि मुझे पता था कि उपयोगकर्ताओं को वास्तव में कुछ चाहिए था इससे पहले कि मैंने इसे जोड़ा। हालाँकि ScalaTest के मेलर्स में एक डायनेमिक प्रॉपर्टी मैचर सिंटैक्स शामिल है जो उस स्लैक में से कुछ को लेता है। उदाहरण के लिए चश्मा में आप एक पर लिख सकते हैं java.io.File:

file must beDirectory

यह आह्वान करेगा isDirectoryऔर सुनिश्चित करेगा कि यह सच है। ScalaTest के पास java.io.Filesवर्तमान में कोई विशेष मिलानकर्ता नहीं है , लेकिन ScalaTest में, आप इस तरह से एक गतिशील जाँच का उपयोग कर सकते हैं:

file must be a ('directory)

जब भी आप किसी प्रतीक को पास करते हैं be, तो यह प्रतिबिंब का उपयोग करेगा (इस मामले में) नाम directoryया विधि नाम की एक विधि या क्षेत्र isDirectory। इसको स्थिर करने का एक तरीका भी है, एक BePropertyMatcher(जिसे आमतौर पर कोड की केवल 2 या 3 लाइनों की आवश्यकता होती है) को परिभाषित करके । इसलिए मूल रूप से स्कैलेस्ट में मैं कम एपीआई के साथ अधिक कार्यक्षमता प्रदान करने का प्रयास करता हूं।

ऐनक और स्केलेस्ट के बीच एक अन्य सामान्य डिजाइन दृष्टिकोण अंतर में निहित रूपांतरण शामिल हैं। डिफ़ॉल्ट रूप से आपको ScalaTest का उपयोग करने पर केवल एक अंतर्निहित रूपांतरण मिलता है, जो कि वह है जो ===ऑपरेटर को हर चीज पर डालता है । (यदि आपको आवश्यकता है, तो आप कोड के एक लाइन के साथ इस अंतर्निहित रूपांतरण को "बंद" कर सकते हैं। एकमात्र कारण आपको ऐसा करने की आवश्यकता होगी, यदि आप किसी ऐसे चीज़ का परीक्षण करने की कोशिश कर रहे हैं जिसका अपना ===ऑपरेटर है, और आपको एक संघर्ष मिलता है। ) स्केलेस्ट कई अन्य निहित रूपांतरणों को परिभाषित करता है, लेकिन उनका उपयोग करने के लिए आपको स्पष्ट रूप से एक कोड में या आयात करके उन्हें अपने कोड में "आमंत्रित" करने की आवश्यकता है। जब आप कक्षा का विस्तार करते हैंSpecificationऐनक में, मुझे लगता है कि आप डिफ़ॉल्ट रूप से दर्जनों अंतर्निहित रूपांतरण प्राप्त करते हैं। मुझे यकीन नहीं है कि यह व्यवहार में कितना मायने रखेगा, लेकिन मुझे लगता है कि लोग ऐसे कोड का परीक्षण करना चाहते हैं जो अपने स्वयं के निहितार्थों का उपयोग करते हैं, और कभी-कभी परीक्षण ढांचे के प्रत्यारोपण और उत्पादन कोड के बीच संघर्ष हो सकता है। जब ऐसा होता है तो मुझे लगता है कि स्कैलेस्ट में समस्या के आस-पास काम करना आसान हो सकता है।

डिज़ाइन के रवैये में एक और अंतर जो मैंने देखा है, ऑपरेटरों के साथ आराम है। मेरा एक लक्ष्य यह था कि कोई भी प्रोग्रामर किसी और के टेस्ट कोड को देख रहा हो जो स्कैलेस्ट का उपयोग करता है, यह अनुमान लगाने में सक्षम होगा कि स्केलेस्ट प्रलेखन में कुछ भी देखे बिना अर्थ क्या था। मैं स्कैटलस्ट क्लाइंट कोड को मृत स्पष्ट छोड़ना चाहता था। एक रास्ता यह है कि लक्ष्य स्वयं प्रकट होता है कि स्कालास्ट ऑपरेटरों के बारे में बहुत रूढ़िवादी है। मैं केवल स्काटलैस्ट में पांच ऑपरेटरों को परिभाषित करता हूं:

  • ===, जिसका अर्थ है बराबरी
  • >, जिसका अर्थ है इससे अधिक
  • <, से कम
  • >=, से बड़ा या बराबर
  • <=, इससे कम या इसके बराबर।

बस। तो ये चीजें बहुत ज्यादा दिखती हैं जैसे कि क्या मतलब है। यदि आप किसी और के कोड में देखते हैं:

result should be <= 7

मेरी आशा है कि <=इसका मतलब क्या है यह अनुमान लगाने के लिए आपको एपीआई दस्तावेज को चलाने की आवश्यकता नहीं होगी । इसके विपरीत, ऑपरेटरों के साथ चश्मा बहुत स्वतंत्र है। इसमें कुछ भी गलत नहीं है, लेकिन यह एक अंतर है। ऑपरेटर्स कोड अधिक संक्षिप्त कर सकते हैं, लेकिन दुविधा यह आप प्रलेखन के लिए चलाने के लिए जब आप की तरह चीजों को खोजने के लिए हो सकता है है ->-, >>,| , |>, !, या ^^^अपने सहकर्मी के परीक्षण कोड में (जो सभी चश्मा में विशेष अर्थ है)।

एक अन्य दार्शनिक अंतर यह है कि मैं स्कैलेस्ट में एक कार्यात्मक शैली का उपयोग करने के लिए इसे थोड़ा आसान बनाने की कोशिश करता हूं, जब आपको एक स्थिरता साझा करने की आवश्यकता होती है, जबकि डिफ़ॉल्ट रूप से स्पेक्स जेयूनाइट द्वारा लोकप्रिय setUpऔर tearDownदृष्टिकोण की परंपरा को जारी रखते हैं , जिसमें आप पुन: असाइन करते हैं प्रत्येक परीक्षण से पहले। हालाँकि यदि आप उस तरह से परीक्षण करना चाहते हैं, तो यह स्काटलैस्ट में भी बहुत आसान है। आपको बस BeforeAndAfterविशेषता में मिश्रण करने की आवश्यकता है ।

स्केलेस्ट में अधिक जानकारी के लिए, आप यहां 2009 देवॉक्स कॉन्फ्रेंस में दिए गए "गेट हायर विथ स्कालास्ट" प्रस्तुति देख सकते हैं:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about


6
स्केलेस्टेस्ट की पठनीयता मेरे लिए स्काला स्पेक्स पर एक प्रमुख जीत बिंदु है।
नीमू

49

मुख्य अंतर हैं (ज्यादातर ऐनक के नज़रिए से :-)):

  • ScalaTest चश्मा से अधिक "परीक्षण शैली" प्रदान करता है (आप प्रत्येक शैली के बारे में विस्तृत विचार प्राप्त करने के लिए त्वरित शुरुआत पृष्ठ पर प्रत्येक बुलेट बिंदु पर जा सकते हैं)

  • ScalaTest और स्पेक्स का मैचर्स का एक अलग सेट है। आप उनकी तुलना यहाँ ScalaTest और यहाँ चश्मे के लिए कर सकते हैं । चीजों के उस तरफ, स्पेक्स में बहुत सारी छोटी विशेषताएं होती हैं, जिन्हें आप अपने विनिर्देश लिखते समय पसंद कर सकते हैं: एक्सएमएल मैचर्स, मैचर्स कंपोजीशन (मैचर्स को फिर से बदलने का एक आसान तरीका), सटीक विफलताएं, लंबे स्ट्रिंग्स के लिए विस्तृत अंतर। ।

  • Mockito को स्पेक्स में एक अच्छा BDD सपोर्ट दिया गया है: Mockito

  • चश्मा में डेटाटेबल्स होते हैं जो तालिका के एक प्रकार में बहुत से छोटे उदाहरणों को समूह बनाने की अनुमति देते हैं (यदि आप खड़े हो सकते हैं ऑपरेटरों को टेबल सीमांकक के रूप में इस्तेमाल किया जा सकता है)

  • ऐनक में, आप ऐसे उदाहरणों को परिभाषित कर सकते हैं, जिन्हें लिबिडम के रूप में नेस्टेड किया जाता है और हर स्तर पर स्वचालित रूप से साफ किया जाता है

यह निश्चित रूप से एक बहुत ही आंशिक और पक्षपाती तुलना है और कई अन्य अंतर मौजूद हैं (और पुस्तकालय अभी भी विकसित हो रहे हैं, ...)।

दिन के अंत में मुझे लगता है कि यह वास्तव में आपके परीक्षण / निर्दिष्ट शैली पर निर्भर करता है। यदि यह सरल (सरल विनिर्देश संरचना, सेटअप, अपेक्षाएं, ...) है, तो दोनों लाइब्रेरी बहुत समान दिखाई देंगी। अन्यथा, दोनों को अपना काम करना चाहिए कि चीजों को कैसे किया जाना चाहिए। इसके अंतिम उदाहरण के रूप में आप टैगिंग पर एक नजर डाल सकते हैं: स्कैलेस्ट में और ऐनक में

आशा है कि ये आपकी मदद करेगा।


क्या स्पेक्स 2 को कवर करने के लिए इसे अपडेट करना संभव होगा? :)
जोफ़र

5

जहां तक ​​मुझे पता है, कुछ अति विशिष्ट विशेषताओं को छोड़कर, यह शैली के अनुसार व्यक्तिगत प्राथमिकता के लिए आता है।


2

आईडीई समर्थन एक और बिंदु हो सकता है

मैं JUnit के माध्यम से ग्रहण के साथ काम करने के लिए चश्मा प्राप्त करने की कोशिश कर रहा हूं, और मुझे आधिकारिक समाधान थोड़ा "हैकिंग" मिला। चश्मा सेटअप: http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse

ScalaTest का एकीकरण (JUnit के माध्यम से भी) थोड़ा कम हैकी लगता है। फिर भी, मुझे उनमें से किसी के साथ-साथ JUnit और Java में काम नहीं मिला है।

स्केलेस्ट सेटअप: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse


मुझे अब उस ScalaTest लिंक के लिए एक 404 मिलता है। Scalatest.org/user_guide/using_junit_runner
DNA

0

यदि एक निर्णय कारक संकलन समय है, स्कैलेस्टेस्ट बेहतर प्रदर्शन करता है।

वर्तमान में हम अपने प्रोजेक्ट में स्पेक्स 2 का उपयोग कर रहे हैं, लेकिन परीक्षणों में धीमे संकलन समय से पीड़ित हैं। मैंने अभी-अभी स्केलेस्ट पर जाने के लिए एक पीओसी समाप्त की और हमारे कुछ स्रोतों में केवल 2 फ्रेमवर्क को स्विच करके लगभग 0.82 के कारक द्वारा संकलित बार ड्रॉप देखा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.