आमतौर पर जब कोडिंग मानकों के बारे में बात की जाती है, तो हम कार्यक्रम के कोड का उल्लेख करते हैं, लेकिन यूनिट परीक्षणों के बारे में क्या? क्या कुछ कोडिंग मानक दिशानिर्देश हैं जो यूनिट परीक्षणों के लिए अद्वितीय हैं? वे क्या हैं?
आमतौर पर जब कोडिंग मानकों के बारे में बात की जाती है, तो हम कार्यक्रम के कोड का उल्लेख करते हैं, लेकिन यूनिट परीक्षणों के बारे में क्या? क्या कुछ कोडिंग मानक दिशानिर्देश हैं जो यूनिट परीक्षणों के लिए अद्वितीय हैं? वे क्या हैं?
जवाबों:
मेरे सिर के ऊपर से, मैं परीक्षण कोड के लिए कोडिंग शैली में तीन अंतरों के बारे में सोच सकता हूं।
नामकरण परीक्षण विधियों में, मैं के पैटर्न का पालन करता हूं 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 (खुद को दोहराएं नहीं) उत्पादन कोड की तुलना में परीक्षण कोड में एक विचार से कम है। जबकि कुछ दोहराए गए कोड को एक सेटअप विधि या एक टेस्टयूटल श्रेणी में रखा जाना चाहिए, परीक्षण कोड में शून्य पुनरावृत्ति के लिए प्रयास करने से कसकर युग्मित और अनम्य परीक्षण होंगे, जो रिफैक्टिंग को हतोत्साहित करता है।
रॉय ओशेरोव ने अपने परीक्षणों के नामकरण के लिए निम्नलिखित पैटर्न की सिफारिश की है:
NameOfMethodUnderTest_StateUnderTest_ExpectedBehavior()
Http://weblogs.asp.net/rosherove/archive/2005/04/03/TestNamingStandards.aspx देखें
NameOfMethodUnderTestStateUnderTestExpectedBehavior()
मुख्य बात यह याद रखना है कि इकाई परीक्षण अनिवार्य रूप से मिनी-विनिर्देश हैं। इसका मतलब यह है कि जोर हमेशा पठनीयता पर होना चाहिए।
सबसे पहले, इसका मतलब है कि नामों को स्पष्ट रूप से संवाद करना चाहिए कि परीक्षण के तहत क्या है और क्या जोर दिया जा रहा है।
दूसरी बात, जो कभी-कभी भुला दी जाती है, वह यह है कि विशिष्टताओं के रूप में उन्हें ऐसा करना चाहिए - व्यवहार को निर्दिष्ट करना। यही है, यूनिट परीक्षणों में तर्क नहीं होना चाहिए - या संभावित रूप से वे परीक्षण के बजाय कार्यक्रम की कार्यक्षमता को दोहराने के जाल में पड़ जाते हैं।
कभी-कभी परीक्षणों में उन वस्तुओं को शामिल किया जाएगा जो सेट अप करने के लिए जटिल हैं, आपको ऑब्जेक्ट मां या परीक्षण डेटा बिल्डर जैसी किसी चीज़ का उपयोग करके इस परीक्षण तर्क को अपने परीक्षणों से अलग रखने का प्रयास करना चाहिए ।
मैं बस कुछ किताबों की सिफारिशों के साथ राउंड ऑफ करूंगा:
xUnit टेस्ट पैटर्न: रिफैक्टिंग टेस्ट कोड: उत्कृष्ट पुस्तक, कुछ का कहना है कि यह थोड़ा सूखा है, लेकिन मुझे ऐसा नहीं लगता। परीक्षणों के आयोजन के विभिन्न तरीकों और उन्हें बनाए रखने के तरीके के बारे में बहुत विस्तार से जाना जाता है। यदि आप NUnit आदि जैसे कुछ का उपयोग कर रहे हैं, तो प्रासंगिक
इकाई परीक्षण की कला: .Net में उदाहरणों के साथ: परीक्षण लिखने और बनाए रखने के लिए निष्ठा से सबसे अच्छी किताब। वास्तव में नया होने के बावजूद मुझे लगता है कि एएए सिंटैक्स के रूप में पहले से ही किए गए मॉकिंग सेक्शन थोड़े बहुत मानक हैं, बजाय इसके कि इसे करने का एक और तरीका है।
बढ़ते ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर, टेस्ट द्वारा निर्देशित : यह पुस्तक सिर्फ आश्चर्यजनक है! अब तक की सर्वश्रेष्ठ इकाई परीक्षण पुस्तक और एकमात्र उन्नत है जो डिजाइन प्रक्रिया में प्रथम श्रेणी के नागरिक के रूप में इकाई परीक्षण करता है। यह पढ़ रहा था जब यह एक सार्वजनिक बीटा था और कब से सिफारिश कर रहा था। उत्कृष्ट वास्तविक दुनिया में काम किया उदाहरण पूरे पुस्तक में इस्तेमाल किया। हालांकि रॉय की किताब को पहले पढ़ने की सलाह देंगे।
अपने यूनिट परीक्षणों में तर्क न रखें। उदाहरण के लिए, मान लें कि आप एक ऐड विधि का परीक्षण कर रहे हैं, आप कुछ इस तरह से हो सकते हैं:
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);
}
लंबी, वर्णनात्मक विधि के नाम। याद रखें, परीक्षण विधियों को कोड से कभी नहीं बुलाया जाता है (उन्हें यूनिट टेस्ट धावक द्वारा बुलाया जाता है जो प्रतिबिंब के माध्यम से पता चलता है और कॉल करता है), इसलिए पागल होने के लिए ठीक है और विधि के नाम 50-80 अक्षर लंबे हैं। विशिष्ट नामकरण सम्मेलन (ऊंट-मामला, अंडरस्कोर, "चाहिए", "चाहिए", "जब", "दिया", आदि) तब तक वास्तव में महत्वपूर्ण नहीं है जब तक कि नाम तीन प्रश्नों का उत्तर नहीं देता है:
टेस्ट के तरीके कम होने चाहिए ।
टेस्ट विधियों में एक सरल, रैखिक संरचना होनी चाहिए । नहीं या पाश निर्माण करता है।
परीक्षण विधियों को "अरेंज-एक्ट-एस्सर" पैटर्न का पालन करना चाहिए ।
प्रत्येक परीक्षण को एक चीज का परीक्षण करना चाहिए । इसका मतलब आमतौर पर प्रति परीक्षण एक जोर होता है। एक परीक्षण की तरह { Do A; Assert B; Assert C; }
दो में refactored किया जाना चाहिए: { Do A; Assert B; }
और{ Do A; Assert C; }
यादृच्छिक डेटा या 'DateTime.Now' जैसी चीजों से बचें
सुनिश्चित करें कि सभी परीक्षण स्थिरता सदस्यों को परीक्षण के अंत में उनके मूल राज्य में लौटा दिया जाता है (उदाहरण के लिए एक अशांति का उपयोग करके )
यहां तक कि अगर आप अपने उत्पादन कोड में नकल को बेरहमी से हटाते हैं, तो परीक्षण जुड़नार में कोड दोहराव एक बहुत छोटी चिंता है।
फार्मबॉय ने पहले से ही जो उल्लेख किया है, उसके समान मेरा तरीका नाम प्रारूप
<MethodName>Should<actionPerformed>When<Condition>
जैसे
GetBalanceShouldReturnAccountBalance() {