2010-02-08 9 views
109

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

+1

मुझे विश्वास नहीं है कि यह कहने के लिए सटीक है कि चश्मा ScalaTest पर बनाया गया है। ध्यान दें कि पोम में निर्भरता वैकल्पिक है। चश्मे के पास स्केलटेस्ट सूट के रूप में चलाने के लिए इसके विनिर्देशों की क्षमता होने की क्षमता है। –

+0

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

उत्तर

159

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

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

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

http://www.scalatest.org/quick_start

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

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

file must beDirectory 

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

file must be a ('directory) 

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

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

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

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

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

result should be <= 7 

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

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

ScalaTest में और अधिक जानकारी के लिए, आप "ScalaTest साथ उच्चतर जाओ" प्रस्तुति मैं 2009 Devoxx सम्मेलन यहाँ पर दे दी है देख सकते हैं:

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

+6

स्केलटेस्ट की पठनीयता मेरे लिए स्कैला चश्मे पर एक प्रमुख जीतने वाला बिंदु है। – nemoo

4

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

45

मुख्य अंतर हैं (ज्यादातर दृश्य :-) के एक चश्मा बिंदु से):

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

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

  • Mockito चश्मा में एक अच्छा BDD समर्थन दिया गया है: Mockito

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

  • चश्मा में, आप उदाहरणों को परिभाषित कर सकते हैं जो libidum और 01 के रूप में घोंसला हैं हर स्तर

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

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

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

के लिए स्केलटेस्टप्लस है क्या specs2 को कवर करने के लिए इसे अपडेट करना संभव होगा? :) – Joffer

2

आईडीई समर्थन एक अन्य बिंदु

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

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

ScalaTest स्थापना: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse

+0

मुझे अब उस स्कैलाटेस्ट लिंक के लिए 404 मिल गया है। Http://www.scalatest.org/user_guide/using_junit_runner आज़माएं – DNA

0

एक तो निर्णय कारक संकलन समय है, scalatest seems to perform better.

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

0

ScalaTest और Specs2 के बीच मुख्य अंतर हैं:

  • Specs2 में परीक्षण की समग्र संरचना है कि ScalaTest में करने के लिए अलग है।
  • Specs2 में विभिन्न वाक्यविन्यास वाले Matchers का एक अलग सेट है।
  • Specs2 परीक्षण मुख्य रूप से व्यवहार-संचालित विकास (बीडीडी) को समर्पित हैं, जबकि स्कैलाटेस्ट परीक्षण अधिक सामान्य हैं।
  • स्कैलाटेस्ट अधिक विकल्प और बहुमुखी प्रतिभा प्रदान करता है। उदाहरण के लिए, ScalaTest में BDD की तरह Specs2 लिखने के लिए, एक का उपयोग कर सकते हैं युक्ति, FeatureSpec, WordSpec, FlatSpec, और ShouldMatchers या MustMatcher के साथ GivenWhenThen लक्षण। यह डेवलपर को अपनी लेखन शैली की अपनी शैली का पालन करने के लिए अधिक लचीलापन देता है।
  • Specs2 में ScalaTest की तुलना में Matchhers की एक बड़ी संख्या है। उनमें से ज्यादातर एक विशेष आवश्यकता के लिए हैं। उदाहरण के लिए, Specs2 में, आप कह सकते हैं:

    aFile mustBe aDirectory

  • कहाँ Specs2 java.io.Files के लिए व्यक्तिगत matchers है, ScalaTest समान matchers जरूरत नहीं है।

  • स्कैलाटेस्ट और स्पेक के बीच एक और अंतर निहित रूपांतरण है। ScalaTest में केवल एक अंतर्निहित रूपांतरण है, जिसे हम === ऑपरेटर का उपयोग करके प्राप्त करते हैं। हालांकि, कोड की एक पंक्ति का उपयोग करके स्कैलाटेस्ट में इसे बंद कर दिया जा सकता है। ScalaTest में यह एकमात्र अंतर्निहित रूपांतरण मुफ्त में मिलता है। अन्य अंतर्निहित रूपांतरण हैं, जिनका उपयोग मिश्रित अन्य लक्षणों द्वारा किया जा सकता है। इस Specs2 के विपरीत आप विशिष्टता कक्षा को विस्तारित करके केवल दर्जनों अंतर्निहित रूपांतरण प्रदान करते हैं। अभ्यास में, इससे कोई फर्क नहीं पड़ता है। एकमात्र अंतर यह होगा कि परीक्षण कोड स्पष्ट रूपांतरणों के बिना अधिक पठनीय होगा।

  • Specs2 में डेटा टेबल हैं। यह उदाहरणों की संख्या के उपयोग की अनुमति देता है, जो परीक्षण संचालित कर सकते हैं, संपत्ति-संचालित परीक्षणों की तरह।

  • Specs2 परीक्षण ScalaTest से भिन्न होते हैं क्योंकि उन्हें एक अलग थ्रेड में समवर्ती रूप से निष्पादित किया जा सकता है।

संबंधित मुद्दे