यूनिट टेस्ट कोडिंग मानकों


22

आमतौर पर जब कोडिंग मानकों के बारे में बात की जाती है, तो हम कार्यक्रम के कोड का उल्लेख करते हैं, लेकिन यूनिट परीक्षणों के बारे में क्या? क्या कुछ कोडिंग मानक दिशानिर्देश हैं जो यूनिट परीक्षणों के लिए अद्वितीय हैं? वे क्या हैं?

जवाबों:


12

मेरे सिर के ऊपर से, मैं परीक्षण कोड के लिए कोडिंग शैली में तीन अंतरों के बारे में सोच सकता हूं।

नामकरण परीक्षण विधियों में, मैं के पैटर्न का पालन करता हूं shouldDoSomethingWhenSomeConditionHolds

परीक्षण के अंदर, निम्नलिखित रिक्ति पैटर्न का पालन करना प्रथागत है:

@Test
shouldReturnAccountBalenceWhenGetBalenceIsCalled() {
    // Some lines 
    // of setup code
    // go here.

    // The action being tested happens after a blank line.

    // An assertion follows another blank line.
}

कुछ प्रति परीक्षण केवल एक जोर देते हैं, लेकिन यह सार्वभौमिक से बहुत दूर है।

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


बेशक, विभिन्न प्रकार के पैटर्न हैं, यही वजह है कि आपको एक उत्तर भी प्रदान करना चाहिए।
एरिक विल्सन

10
वह है अरेंज, एक्ट, एसर पैटर्न।
स्टुपरयूजर

अभी भी महत्वपूर्ण है DRY यदि आपको कई परीक्षणों में समान कार्य करने की आवश्यकता है, तो सामान्य फ़ंक्शन बनाएं और सभी परीक्षणों में इसे कॉल करें।
MiFreidgeim SO-stop बुराई होने

@MichaelFreidgeim शायद हम सिर्फ डिग्री के बारे में बात कर रहे हैं, लेकिन मेरे पास टेस्ट कोड में पुनरावृत्ति के लिए काफी उच्च सहिष्णुता है। मुझे बहुत कम पुनरावृत्ति के साथ परीक्षण सूट बनाने के कई अनुभव हुए हैं, और पाया कि जब आवश्यकताएं बदल जाती हैं तो परीक्षणों को संशोधित करना और समझना कठिन हो जाता है। फिर मैंने परीक्षणों में DRY के बारे में चिंता करना बंद कर दिया, और मेरे परीक्षण सूट का उपयोग करना आसान हो गया है। <श्रग>
एरिक विल्सन

16

रॉय ओशेरोव ने अपने परीक्षणों के नामकरण के लिए निम्नलिखित पैटर्न की सिफारिश की है:

NameOfMethodUnderTest_StateUnderTest_ExpectedBehavior() 

Http://weblogs.asp.net/rosherove/archive/2005/04/03/TestNamingStandards.aspx देखें


मैं रॉय से सहमत हूं। यह पठनीयता में सुधार करता है, NameOfMethodUnderTestStateUnderTestExpectedBehavior()
आखिरकार रेस्परर

जब यह विधि अतिभारित हो जाती है, तो यह काम कैसे करें, इसलिए एक ही नाम के साथ कई तरीके हो सकते हैं?
नरेंद्र पथाई

6

मुख्य बात यह याद रखना है कि इकाई परीक्षण अनिवार्य रूप से मिनी-विनिर्देश हैं। इसका मतलब यह है कि जोर हमेशा पठनीयता पर होना चाहिए।

सबसे पहले, इसका मतलब है कि नामों को स्पष्ट रूप से संवाद करना चाहिए कि परीक्षण के तहत क्या है और क्या जोर दिया जा रहा है।

दूसरी बात, जो कभी-कभी भुला दी जाती है, वह यह है कि विशिष्टताओं के रूप में उन्हें ऐसा करना चाहिए - व्यवहार को निर्दिष्ट करना। यही है, यूनिट परीक्षणों में तर्क नहीं होना चाहिए - या संभावित रूप से वे परीक्षण के बजाय कार्यक्रम की कार्यक्षमता को दोहराने के जाल में पड़ जाते हैं।

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

मैं बस कुछ किताबों की सिफारिशों के साथ राउंड ऑफ करूंगा:

xUnit टेस्ट पैटर्न: रिफैक्टिंग टेस्ट कोड: उत्कृष्ट पुस्तक, कुछ का कहना है कि यह थोड़ा सूखा है, लेकिन मुझे ऐसा नहीं लगता। परीक्षणों के आयोजन के विभिन्न तरीकों और उन्हें बनाए रखने के तरीके के बारे में बहुत विस्तार से जाना जाता है। यदि आप NUnit आदि जैसे कुछ का उपयोग कर रहे हैं, तो प्रासंगिक

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

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


IMHO यह तर्क को समाहित करने के लिए इकाई परीक्षणों के लिए ठीक है: यह एक भोली एल्गोरिथ्म का उपयोग करके एल्गोरिथ्म के एक उच्च अनुकूलित, कुशल संस्करण का परीक्षण करने के लिए पूरी तरह से उचित है जो सही व्यवहार को निर्धारित करने के लिए एक ही बात करता है। उदाहरण के लिए, एक रेखीय खोज-आधारित साहचर्य सरणी का निर्माण करके हैश तालिका का परीक्षण करने की कल्पना करें।
dsimcha

2
हां, लेकिन यह परीक्षण डेटा बिल्डरों में परीक्षण के बाहर है (जो स्वयं को इकाई होना चाहिए अगर उनके अंदर तर्क तुच्छ नहीं है)। इसका अपवाद 3 पार्टी पुस्तकालय होंगे जो आम तौर पर सही होने के लिए "विश्वसनीय" होते हैं और बिना परीक्षण के उपयोग किए जा सकते हैं।
फिनकेक

3

अपने यूनिट परीक्षणों में तर्क न रखें। उदाहरण के लिए, मान लें कि आप एक ऐड विधि का परीक्षण कर रहे हैं, आप कुछ इस तरह से हो सकते हैं:

void MyTest_SaysHello()
{
   string name = "Bob";
   string expected = string.Format("Hello, {0}", name);
   IMyObjectType myObject = new MyObjectType();
   string actual = myObject.SayHello(name);
   Assert.AreEqual(expected, actual);
}

इस विशेष मामले में, आप संभवतः वही तर्क दोहरा रहे हैं, जो परीक्षण में है, इसलिए आप अनिवार्य रूप से "1 + 1 == 1 + 1" का परीक्षण कर रहे हैं, बजाय "1 + 1 == 2" के, जो कि है "असली" परीक्षण। तो क्या आप वास्तव में चाहते हैं कि आपका परीक्षा कोड ऐसा हो:

void MyTest_SaysHello()
{
   string expected = "Hello, Bob";
   IMyObjectType myObject = new MyObjectType();
   string actual = myObject.SayHello("Bob");
   Assert.AreEqual(expected, actual);
}

2
छोटा सुधार: मुझे लगता है कि आपका मतलब था 'स्ट्रिंग अपेक्षित = स्ट्रिंग। पोरमैट ("हैलो, बॉब")' स्ट्रिंग '= "हैलो, बॉब" होना चाहिए।
माइक रोसेनब्लम

@MikeRosenblum आप स्पष्ट रूप से सही हैं, और किसी ने इसे सही करने की कोशिश की, लेकिन दो समीक्षकों ने इस संपादन को अस्वीकार कर दिया
कोनराड मोरव्स्की

@ कोनराड: यह अजीब है। यह एक प्रोग्रामिंग फोरम है, है ना?
माइक रोसेनब्लम

मैंने माइक रोसेनब्लम द्वारा सुझाए गए उत्तर को एक बार फिर से संपादित किया है।
bdsl

0

लंबी, वर्णनात्मक विधि के नाम। याद रखें, परीक्षण विधियों को कोड से कभी नहीं बुलाया जाता है (उन्हें यूनिट टेस्ट धावक द्वारा बुलाया जाता है जो प्रतिबिंब के माध्यम से पता चलता है और कॉल करता है), इसलिए पागल होने के लिए ठीक है और विधि के नाम 50-80 अक्षर लंबे हैं। विशिष्ट नामकरण सम्मेलन (ऊंट-मामला, अंडरस्कोर, "चाहिए", "चाहिए", "जब", "दिया", आदि) तब तक वास्तव में महत्वपूर्ण नहीं है जब तक कि नाम तीन प्रश्नों का उत्तर नहीं देता है:

  • परीक्षण के तहत क्या है?
  • क्या स्थिति हैं?
  • परिणाम की क्या उम्मीद है?

टेस्ट के तरीके कम होने चाहिए

टेस्ट विधियों में एक सरल, रैखिक संरचना होनी चाहिए । नहीं या पाश निर्माण करता है।

परीक्षण विधियों को "अरेंज-एक्ट-एस्सर" पैटर्न का पालन करना चाहिए ।

प्रत्येक परीक्षण को एक चीज का परीक्षण करना चाहिए । इसका मतलब आमतौर पर प्रति परीक्षण एक जोर होता है। एक परीक्षण की तरह { Do A; Assert B; Assert C; }दो में refactored किया जाना चाहिए: { Do A; Assert B; }और{ Do A; Assert C; }

यादृच्छिक डेटा या 'DateTime.Now' जैसी चीजों से बचें

सुनिश्चित करें कि सभी परीक्षण स्थिरता सदस्यों को परीक्षण के अंत में उनके मूल राज्य में लौटा दिया जाता है (उदाहरण के लिए एक अशांति का उपयोग करके )

यहां तक ​​कि अगर आप अपने उत्पादन कोड में नकल को बेरहमी से हटाते हैं, तो परीक्षण जुड़नार में कोड दोहराव एक बहुत छोटी चिंता है।


-1

फार्मबॉय ने पहले से ही जो उल्लेख किया है, उसके समान मेरा तरीका नाम प्रारूप

 <MethodName>Should<actionPerformed>When<Condition>

जैसे

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