tl; डॉ
Pivotal में हमने देवदार लिखा क्योंकि हम अपनी रूबी परियोजनाओं पर Rspec का उपयोग और प्यार करते हैं। देवदार OCUnit के साथ बदलने या प्रतिस्पर्धा करने के लिए नहीं है; यह उद्देश्य सी के लिए BDD- शैली परीक्षण की संभावना लाने के लिए है, जैसे कि Rspec ने रूबी में BDD- शैली परीक्षण का बीड़ा उठाया है, लेकिन टेस्ट :: यूनिट को समाप्त नहीं किया है। एक या दूसरे को चुनना काफी हद तक शैली वरीयताओं का विषय है।
कुछ मामलों में हमने सीडर को हमारे लिए काम करने के तरीके में कुछ कमियों को दूर करने के लिए डिजाइन किया था। विशेष रूप से, हम परीक्षणों में डिबगर का उपयोग करने में सक्षम होना चाहते थे, कमांड लाइन और सीआई बिल्ड से परीक्षण चलाने के लिए, और परीक्षण परिणामों के उपयोगी पाठ आउटपुट प्राप्त करना चाहते थे। ये चीजें आपके लिए कमोबेश उपयोगी हो सकती हैं।
लंबा जवाब
देवदार और OCUnit जैसे दो परीक्षण ढाँचों के बीच निर्णय लेना (उदाहरण के लिए) दो चीजों के लिए नीचे आता है: पसंदीदा शैली, और उपयोग में आसानी। मैं शैली से शुरू करूँगा, क्योंकि यह केवल राय और पसंद की बात है; उपयोग में आसानी से ट्रेडऑफ़ का एक सेट हो जाता है।
शैली के विचार आप किस तकनीक या भाषा का उपयोग करते हैं। XUnit- शैली इकाई परीक्षण बीडीडी-शैली परीक्षण की तुलना में लंबे समय तक रहा है, लेकिन बाद में लोकप्रियता में तेजी से वृद्धि हुई है, मोटे तौर पर Rspec के कारण।
XUnit- शैली परीक्षण का प्राथमिक लाभ इसकी सादगी है, और व्यापक रूप से अपनाने (डेवलपर्स के बीच जो इकाई परीक्षण लिखते हैं); लगभग किसी भी भाषा में आप कोड लिखने पर विचार कर सकते हैं जिसमें एक xUnit- शैली ढांचा उपलब्ध है।
BDD- शैली के ढांचे में दो मुख्य अंतर होते हैं जब xUnit- शैली की तुलना में: आप परीक्षण (या ऐनक) की संरचना कैसे करते हैं, और अपने अभिकथन लिखने के लिए वाक्य रचना। मेरे लिए, संरचनात्मक अंतर मुख्य अंतर है। xUnit परीक्षण एक आयामी हैं, एक दिए गए परीक्षण वर्ग में सभी परीक्षणों के लिए एक सेटअप विधि है। हालांकि, हम जिन कक्षाओं का परीक्षण करते हैं, वे एक आयामी नहीं हैं; हमें अक्सर कई अलग-अलग, संभावित रूप से परस्पर विरोधी, संदर्भों में कार्यों का परीक्षण करने की आवश्यकता होती है। उदाहरण के लिए, एक AddItem: विधि के साथ एक साधारण शॉपिंग कार्ट क्लास पर विचार करें, (इस उत्तर के प्रयोजनों के लिए मैं ऑब्जेक्टिव C वाक्यविन्यास का उपयोग करूँगा)। इस पद्धति का व्यवहार भिन्न हो सकता है जब कार्ट में अन्य वस्तुओं की तुलना में कार्ट खाली हो; यह भिन्न हो सकता है यदि उपयोगकर्ता ने छूट कोड दर्ज किया है; यदि निर्दिष्ट आइटम ' टी चयनित शिपिंग विधि द्वारा भेज दिया जाएगा; आदि के रूप में इन संभावित स्थितियों को एक दूसरे के साथ अन्तर्विभाजित करते हैं जो आप संभावित संदर्भों की ज्यामितीय रूप से बढ़ती संख्या के साथ समाप्त होते हैं; xUnit- शैली के परीक्षण में यह अक्सर कई तरीकों की ओर जाता है, जैसे testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies। बीडीडी-शैली के ढांचे की संरचना आपको इन स्थितियों को व्यक्तिगत रूप से व्यवस्थित करने की अनुमति देती है, जो मुझे लगता है कि यह सुनिश्चित करना आसान बनाता है कि मैं सभी मामलों को कवर करता हूं, साथ ही व्यक्तिगत स्थितियों को खोजने, बदलने या जोड़ने के लिए आसान है। एक उदाहरण के रूप में, देवदार सिंटैक्स का उपयोग करके, ऊपर की विधि इस तरह दिखाई देगी: xUnit- शैली के परीक्षण में यह अक्सर कई तरीकों की ओर जाता है, जैसे testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies। बीडीडी-शैली के ढांचे की संरचना आपको इन स्थितियों को व्यक्तिगत रूप से व्यवस्थित करने की अनुमति देती है, जो मुझे लगता है कि यह सुनिश्चित करना आसान बनाता है कि मैं सभी मामलों को कवर करता हूं, साथ ही व्यक्तिगत स्थितियों को खोजने, बदलने या जोड़ने के लिए आसान है। एक उदाहरण के रूप में, देवदार सिंटैक्स का उपयोग करके, ऊपर की विधि इस तरह दिखाई देगी: xUnit- शैली के परीक्षण में यह अक्सर कई तरीकों की ओर जाता है, जैसे testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies। बीडीडी-शैली के ढांचे की संरचना आपको इन स्थितियों को व्यक्तिगत रूप से व्यवस्थित करने की अनुमति देती है, जो मुझे लगता है कि यह सुनिश्चित करना आसान बनाता है कि मैं सभी मामलों को कवर करता हूं, साथ ही व्यक्तिगत स्थितियों को खोजने, बदलने या जोड़ने के लिए आसान है। एक उदाहरण के रूप में, देवदार सिंटैक्स का उपयोग करके, ऊपर की विधि इस तरह दिखाई देगी:
describe(@"ShoppingCart", ^{
describe(@"addItem:", ^{
describe(@"when the cart is empty", ^{
describe(@"with no discount code", ^{
describe(@"when the shipping method applies to the item", ^{
it(@"should add the item to the cart", ^{
...
});
it(@"should add the full price of the item to the overall price", ^{
...
});
});
describe(@"when the shipping method does not apply to the item", ^{
...
});
});
describe(@"with a discount code", ^{
...
});
});
describe(@"when the cart contains other items, ^{
...
});
});
});
कुछ मामलों में आप पाएंगे कि इसमें संदर्भों के समान सेट हैं, जिन्हें आप साझा उदाहरण संदर्भों का उपयोग करके देख सकते हैं।
BDD- शैली के ढांचे और xUnit- शैली के ढांचे के बीच दूसरा मुख्य अंतर, अभिकथन (या "माचिस") सिंटैक्स, बस ऐनक की शैली को कुछ हद तक अच्छा बनाता है; कुछ लोग वास्तव में इसे पसंद करते हैं, दूसरों को नहीं।
यह उपयोग में आसानी के सवाल की ओर जाता है। इस मामले में, प्रत्येक ढांचे के पास अपने पेशेवरों और विपक्ष हैं:
OCUnit देवदार की तुलना में अधिक लंबा है, और सीधे Xcode में एकीकृत है। इसका मतलब यह है कि एक नया परीक्षण लक्ष्य बनाना आसान है, और, अधिकांश समय, परीक्षण करना और "बस काम करता है" चलाना। दूसरी ओर, हमने पाया कि कुछ मामलों में, जैसे कि आईओएस डिवाइस पर चलना, काम करने के लिए ओसीयूनिट परीक्षण प्राप्त करना बहुत ही असंभव था। सीडर स्पेक्स की स्थापना OCUnit परीक्षणों की तुलना में कुछ अधिक काम करती है, क्योंकि आपको लाइब्रेरी मिल गई है और इसके खिलाफ लिंक खुद (Xcode में कभी कोई तुच्छ कार्य नहीं)। हम सेटअप को आसान बनाने पर काम कर रहे हैं, और किसी भी सुझाव का स्वागत से अधिक है।
OCUnit निर्माण के भाग के रूप में परीक्षण चलाता है। इसका मतलब है कि आपको अपने परीक्षण चलाने के लिए एक निष्पादन योग्य चलाने की आवश्यकता नहीं है; यदि कोई परीक्षण विफल हो जाता है, तो आपका निर्माण विफल हो जाता है। यह परीक्षणों को एक कदम सरल बनाने की प्रक्रिया को आसान बनाता है, और परीक्षण आउटपुट सीधे आपके बिल्ड आउटपुट विंडो में जाता है जो इसे देखना आसान बनाता है। हमने सिडर स्पेक्स को एक निष्पादन योग्य बनाने के लिए चुना है जिसे आप कुछ कारणों से अलग-अलग चलाते हैं:
- हम डिबगर का उपयोग करने में सक्षम होना चाहते थे। आप देवदार के चश्मे को वैसे ही चलाते हैं जैसे आप किसी अन्य निष्पादन योग्य को चलाते हैं, इसलिए आप डिबगर का उसी तरह उपयोग कर सकते हैं।
- हम परीक्षण में आसान कंसोल लॉगिंग चाहते थे। आप NSLog () OCUnit परीक्षणों में उपयोग कर सकते हैं, लेकिन आउटपुट बिल्ड विंडो में जाता है जहां आपको इसे पढ़ने के लिए बिल्ड स्टेप को अनफॉलो करना होगा।
- हम कमांड लाइन और Xcode दोनों पर टेस्ट रिपोर्टिंग को पढ़ना आसान चाहते थे। OCUnit परिणाम Xcode में बिल्ड विंडो में अच्छी तरह से दिखाई देते हैं, लेकिन कमांड लाइन (या एक CI प्रक्रिया के भाग के रूप में) के निर्माण से परीक्षण आउटपुट में बहुत सारे और अन्य बिल्ड आउटपुट के साथ परस्पर क्रिया होती है। अलग-अलग बिल्ड और रन चरणों के साथ देवदार आउटपुट को अलग करता है इसलिए परीक्षण आउटपुट को खोजना आसान है। डिफ़ॉल्ट सीडर परीक्षण धावक मुद्रण की मानक शैली को कॉपी करता है "।" प्रत्येक गुजरती कल्पना के लिए, "एफ" विफल चश्मा आदि के लिए, देवदार में कस्टम रिपोर्टर ऑब्जेक्ट्स का उपयोग करने की क्षमता भी है, इसलिए आप इसे थोड़े प्रयास के साथ किसी भी तरह से आउटपुट परिणाम दे सकते हैं।
OCUnit उद्देश्य C के लिए आधिकारिक इकाई परीक्षण रूपरेखा है, और इसे Apple द्वारा समर्थित किया गया है। Apple के पास मूल रूप से असीम संसाधन हैं, इसलिए यदि वे चाहते हैं कि कुछ किया जाए तो वह पूरा हो जाएगा। और, आखिरकार, यह ऐप्पल का सैंडबॉक्स है जिसमें हम खेल रहे हैं। उस सिक्के का फ्लिप पक्ष, हालांकि, यह है कि एप्पल प्रत्येक दिन एक बिलियन समर्थन अनुरोधों और बग रिपोर्ट के आदेश पर प्राप्त करता है। वे उन सभी को संभालने के बारे में उल्लेखनीय रूप से अच्छे हैं, लेकिन वे उन मुद्दों को संभालने में सक्षम नहीं हो सकते हैं जो आप तुरंत रिपोर्ट करते हैं, या बिल्कुल भी नहीं। देवदार OCUnit की तुलना में बहुत नया और कम बेक किया हुआ है, लेकिन यदि आपके पास कोई प्रश्न या समस्या है या सुझाव है तो आप देवदार मेलिंग सूची (cedar-discuss@googlegroups.com) को संदेश भेजें और हम वही करेंगे जो हम आपकी मदद कर सकते हैं। इसके अलावा, Github (github.com/pivotal/cedar) से कोड कांटा करने के लिए स्वतंत्र महसूस करें और जो भी आपको लगता है वह गायब है।
IOS उपकरणों पर OCUnit परीक्षण चलाना मुश्किल हो सकता है। ईमानदारी से, मैंने इसे कुछ समय के लिए आज़माया नहीं है, इसलिए यह आसान हो सकता है, लेकिन पिछली बार मैंने कोशिश की कि मैं काम करने के लिए किसी भी UIKit कार्यक्षमता के लिए OCUnit परीक्षण प्राप्त नहीं कर सका। जब हमने देवदार लिखा तो हमने यह सुनिश्चित किया कि हम सिम्युलेटर और उपकरणों पर दोनों UIKit पर निर्भर कोड का परीक्षण कर सकते हैं।
अंत में, हमने इकाई परीक्षण के लिए देवदार लिखा, जिसका अर्थ है कि यह वास्तव में UISpec जैसी परियोजनाओं के साथ तुलनीय नहीं है। जब से मैंने UISpec का उपयोग करने की कोशिश की है, तब तक यह काफी समय हो गया है, लेकिन मैंने इसे मुख्य रूप से प्रोग्राम को iOS डिवाइस पर यूआई ड्राइविंग पर ध्यान केंद्रित करने के लिए समझा। हमने विशेष रूप से फैसला किया है कि सीडर को इस प्रकार के चश्मे का समर्थन करने की कोशिश न करें, क्योंकि ऐप्पल उस समय (यूआईए) ने यूआईओएमीकरण की घोषणा करने के बारे में था।