unit testing यूनिट टेस्ट नामकरण सर्वोत्तम प्रथाओं




unit-testing naming-conventions (10)

इकाई परीक्षण कक्षाओं और परीक्षण विधियों का नामकरण करने के लिए सर्वोत्तम प्रथाएं क्या हैं?

इससे पहले एसओ पर चर्चा की गई थी, यूनिट टेस्ट के लिए कुछ लोकप्रिय नामकरण सम्मेलन क्या हैं?

मुझे नहीं पता कि यह एक बहुत अच्छा दृष्टिकोण है, लेकिन वर्तमान में मेरी परीक्षण परियोजनाओं में, मेरे पास प्रत्येक उत्पादन वर्ग और एक परीक्षण वर्ग, जैसे Product और Product परीक्षण के बीच एक-एक-एक मैपिंग है।

मेरे परीक्षण वर्गों में मेरे पास विधियों के नाम, अंडरस्कोर, और फिर स्थिति और जो होने की उम्मीद है, उसके नाम के साथ विधियां हैं, उदाहरण के लिए Save_ShouldThrowExceptionWithNullName()


कक्षा फू के लिए टेस्ट केस का नाम FooTestCase या ऐसा कुछ होना चाहिए (FooIntegrationTestCase या FooAcceptanceTestCase) - क्योंकि यह एक परीक्षण केस है। परीक्षण, परीक्षण मामले, परीक्षण स्थिरता, परीक्षण विधि इत्यादि जैसे कुछ मानक नामकरण सम्मेलनों के लिए http://xunitpatterns.com/ देखें।


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


देखें: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html

परीक्षण विधि नामों के लिए, मैं व्यक्तिगत रूप से वर्बोज़ और स्वयं-दस्तावेज नामों का उपयोग बहुत उपयोगी करता हूं (जावाडोक टिप्पणियों के साथ जो आगे बताता है कि परीक्षण क्या कर रहा है)।


हाल ही में मैंने अपने परीक्षणों, उनके वर्गों और परियोजनाओं को नामित करने के लिए निम्नलिखित विवरणों के साथ आया था ताकि उनके वर्णनों को अधिकतम किया जा सके:

आइए कहें कि मैं MyApp.Serialization नामस्थान में किसी प्रोजेक्ट में सेटिंग क्लास का परीक्षण कर रहा हूं।

सबसे पहले मैं MyApp.Serialization.Tests नामस्थान के साथ एक परीक्षण प्रोजेक्ट तैयार करूंगा

इस प्रोजेक्ट के भीतर और निश्चित रूप से नेमस्पेस मैं ifSettings नामक एक क्लास बनाउंगा (ifSettings.cs के रूप में सहेजा गया)।

आइए कहें कि मैं SaveStrings () विधि का परीक्षण कर रहा हूं। -> मैं CanSaveStrings () परीक्षण का नाम दूंगा

जब मैं यह परीक्षण चलाता हूं तो यह निम्नलिखित शीर्षक दिखाएगा:

MyApp.Serialization.Tests.IfSettings.CanSaveStrings

मुझे लगता है कि यह मुझे बहुत अच्छी तरह से बताता है, यह क्या परीक्षण कर रहा है।

बेशक यह उपयोगी है कि अंग्रेजी में "टेस्ट" शब्द क्रिया "परीक्षण" जैसा ही है।

परीक्षणों का नाम देने में आपकी रचनात्मकता की कोई सीमा नहीं है, ताकि हम उनके लिए पूर्ण वाक्य शीर्षलेख प्राप्त कर सकें।

आम तौर पर टेस्टनामों को एक क्रिया के साथ शुरू करना होगा।

उदाहरणों में शामिल:

  • पता लगाता है (जैसे DetectsInvalidUserInput)
  • फेंकता है (उदाहरण के लिए ThrowsOnNotFound)
  • होगा (उदाहरण के लिए WillCloseTheDatabaseAfterTheTransaction)

आदि।

एक और विकल्प "अगर" के बजाय "उस" का उपयोग करना है।

उत्तरार्द्ध मुझे कुंजीस्ट्रोक बचाता है और मैं वास्तव में जो कुछ भी कर रहा हूं उसका वर्णन करता हूं, क्योंकि मुझे नहीं पता कि परीक्षण किया गया व्यवहार मौजूद है, लेकिन अगर यह परीक्षण हो रहा है तो मैं परीक्षण कर रहा हूं।

[ संपादित करें ]

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

इसके अतिरिक्त अब मैं केवल अपने परीक्षण वर्गों में विधियों के लिए उपयोग करता हूं क्योंकि इसे कहीं भी सबसे अच्छा अभ्यास नहीं माना जाता है - "_" मेरे परीक्षण विधि नामों में शब्दों को अलग करने के लिए:

  • [टेस्ट] सार्वजनिक शून्य पता लगाने_invalid_User_Input () *

मुझे यह पढ़ने में आसान लगता है।

[ अंत संपादित करें ]

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


मैं दी गई-कब-फिर अवधारणा का उपयोग करता हूं। इस संक्षिप्त लेख पर एक नज़र डालें http://cakebaker.42dh.com/2009/05/28/given-when-then/ । अनुच्छेद बीडीडी के संदर्भ में इस अवधारणा का वर्णन करता है, लेकिन आप इसे किसी भी बदलाव के बिना टीडीडी में भी उपयोग कर सकते हैं।


परीक्षण के तहत इकाई (यानी कक्षा) के बाद परीक्षण स्थिरता नामकरण करते समय मुझे परीक्षण के लिए " मानक " नामकरण मानक का पालन करना पसंद है।

उदाहरण के लिए (सी # और एनयूनीट का उपयोग करके):

[TestFixture]
public class BankAccountTests
{
  [Test]
  public void Should_Increase_Balance_When_Deposit_Is_Made()
  {
     var bankAccount = new BankAccount();
     bankAccount.Deposit(100);
     Assert.That(bankAccount.Balance, Is.EqualTo(100));
  }
}

क्यों "चाहिए" ?

मुझे लगता है कि यह परीक्षण लेखकों को "कुछ राज्यों में होना चाहिए [[बाद / पहले / कब] [कार्रवाई होती है]" के साथ एक वाक्य के साथ परीक्षण का नाम देने के लिए मजबूर करता है।

हां, लिखना "चाहिए" हर जगह थोड़ा दोहराया जाता है, लेकिन जैसा कि मैंने कहा है कि यह लेखकों को सही तरीके से सोचने के लिए मजबूर करता है (इसलिए नौसिखियों के लिए अच्छा हो सकता है)। इसके अलावा यह आम तौर पर एक पठनीय अंग्रेजी परीक्षण नाम में परिणाम देता है।

अपडेट करें :

मैंने देखा है कि जिमी बोगर्ड भी 'चाहिए' का प्रशंसक है और यहां तक ​​कि एक यूनिट टेस्ट लाइब्रेरी भी है जिसे Should कहा जाता है।

अपडेट करें (4 साल बाद ...)

रुचि रखने वालों के लिए, वर्षों से नामकरण परीक्षणों के लिए मेरा दृष्टिकोण विकसित हुआ है। उपरोक्त वर्णित पैटर्न के साथ मुद्दों में से एक यह है कि एक नज़र में यह जानना आसान नहीं है कि कौन सी विधि परीक्षण में है। ओओपी के लिए मुझे लगता है कि परीक्षण के तहत विधि के साथ परीक्षण नाम शुरू करने के लिए और अधिक समझदारी होती है। एक अच्छी तरह से डिज़ाइन किए गए वर्ग के लिए इसका परिणाम पठनीय परीक्षण विधि नामों में होना चाहिए। अब मैं <method>_Should<expected>_When<condition> समान प्रारूप का उपयोग करता हूं। स्पष्ट रूप से संदर्भ के आधार पर आप कुछ और उचित के लिए कंधे / कब क्रियाओं को प्रतिस्थापित करना चाहते हैं। उदाहरण: Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()


मुझे रॉय ओशरोव की नामकरण रणनीति पसंद है , यह निम्नलिखित है:

[UnitOfWork__StateUnderTest__ExpectedBehavior]

इसमें विधि नाम और संरचित तरीके से आवश्यक प्रत्येक जानकारी है।

काम की इकाई एक विधि, एक वर्ग या कई वर्गों के रूप में बड़ी के रूप में छोटी हो सकती है। यह उन सभी चीजों का प्रतिनिधित्व करना चाहिए जिन्हें परीक्षण के मामले में परीक्षण किया जाना चाहिए और नियंत्रण में हैं।

असेंबली के लिए मैं ठेठ का उपयोग करता .Tests अंत में समाप्त होता है, जो मुझे लगता है कि काफी व्यापक है और कक्षाओं के लिए समान है ( Tests साथ समाप्त):

[NameOfTheClassUnderTestTests]

पहले मैंने टेस्ट के बजाय प्रत्यय के रूप में स्थिरता का उपयोग किया था, लेकिन मुझे लगता है कि बाद वाला अधिक आम है, फिर मैंने नामकरण रणनीति बदल दी।


कक्षा के नाम परीक्षण स्थिरता नामों के लिए, मुझे लगता है कि "टेस्ट" कई डोमेन की सर्वव्यापी भाषा में काफी आम है। उदाहरण के लिए, एक इंजीनियरिंग डोमेन में: StressTest , और एक सौंदर्य प्रसाधन डोमेन में: SkinTest । केंट से असहमत होने के लिए खेद है, लेकिन मेरे टेस्ट फिक्स्चर ( StressTestTest ?) में "टेस्ट" का उपयोग करना भ्रमित है।

डोमेन में "यूनिट" का भी बहुत उपयोग किया जाता है। जैसे MeasurementUnit । क्या MeasurementUnitTest नामक एक वर्ग "मापन" या "मापनमेंट यूनिट" का परीक्षण है?

इसलिए मैं अपने सभी टेस्ट क्लास के लिए "क्यूए" उपसर्ग का उपयोग करना चाहता हूं। जैसे QaSkinTest और QaMeasurementUnit । यह डोमेन ऑब्जेक्ट्स के साथ कभी भ्रमित नहीं होता है, और प्रत्यय के बजाए उपसर्ग का उपयोग करने का अर्थ है कि सभी टेस्ट फिक्स्चर एक साथ रहते हैं (उपयोगी है यदि आपके परीक्षण प्रोजेक्ट में नकली या अन्य समर्थन वर्ग हैं)

नामस्थान मैं सी # में काम करता हूं और मैं अपनी टेस्ट क्लास को उसी नामस्थान में रखता हूं, जिस कक्षा में वे परीक्षण कर रहे हैं। अलग परीक्षण नामस्थान होने से यह अधिक सुविधाजनक है। बेशक, टेस्ट क्लास एक अलग परियोजना में हैं।

टेस्ट विधि नाम । मैं अपने तरीकों का नाम देना चाहता हूं जबXXX_ExpectYYY। यह पूर्व शर्त स्पष्ट करता है, और स्वचालित दस्तावेज (एक ला टेस्टडॉक्स) के साथ मदद करता है। यह Google परीक्षण ब्लॉग पर सलाह के समान है, लेकिन पूर्व शर्त और अपेक्षाओं को और अलग करने के साथ। उदाहरण के लिए:

WhenDivisorIsNonZero_ExpectDivisionResult
WhenDivisorIsZero_ExpectError
WhenInventoryIsBelowOrderQty_ExpectBackOrder
WhenInventoryIsAboveOrderQty_ExpectReducedInventory

मुझे यह जोड़ना चाहिए कि आपके परीक्षणों को एक ही पैकेज में रखते हुए, लेकिन स्रोत के परीक्षण के समानांतर निर्देशिका में कोड को छोड़ने के लिए तैयार किए जाने के बाद इसे कोड के ब्लोट को हटा दिया जाता है।

मैं व्यक्तिगत रूप से "जुनीट पॉकेट गाइड" में वर्णित सर्वोत्तम प्रथाओं को पसंद करता हूं ... जुनीट के सह-लेखक द्वारा लिखी गई पुस्तक को हरा करना मुश्किल है!


केंट बेक सुझाव देते हैं:

  • एक 'इकाई' प्रति एक परीक्षण स्थिरता (आपके कार्यक्रम की कक्षा)। टेस्ट फिक्स्चर स्वयं कक्षाएं हैं। परीक्षण स्थिरता नाम होना चाहिए:

    [name of your 'unit']Tests
    
  • टेस्ट केस (टेस्ट फ़िक्स्चर विधियों) के नाम हैं:

    test[feature being tested]
    

उदाहरण के लिए, निम्नलिखित वर्ग रखना:

class Person {
    int calculateAge() { ... }

    // other methods and properties
}

एक परीक्षण स्थिरता होगी:

class PersonTests {

    testAgeCalculationWithNoBirthDate() { ... }

    // or

    testCalculateAge() { ... }
}




naming-conventions