हमारी इकाई परीक्षणों को व्यवस्थित करने का सबसे अच्छा तरीका क्या है


18

हमने वर्षों में अपने मुख्य कार्यक्रम के लिए पर्याप्त संख्या में यूनिट परीक्षण किए हैं। कई हज़ार। समस्या यह है कि हमारे पास इस बात की स्पष्ट जानकारी नहीं है कि हमारे पास कौन से परीक्षण हैं क्योंकि बहुत सारे हैं। और यह एक समस्या है क्योंकि हम नहीं जानते कि हम परीक्षणों पर कमजोर हैं (या जहाँ हम डुप्लिकेट हैं)।

हमारा ऐप एक रिपोर्टिंग इंजन है। तो आपके पास एक टेम्प्लेट हो सकता है जिसका उपयोग पार्सिंग का परीक्षण करने के लिए किया जाता है (क्या हम सभी तालिका गुणों को पढ़ते हैं), डेटा में विलय (क्या हम सही तालिका गुणों को मर्ज में रखते हैं), अंतिम पृष्ठ को स्वरूपित करते हैं (पृष्ठ पर तालिका को सही तरीके से रखा गया है) ), और / या आउटपुट स्वरूप (बनाया गया DOCX फ़ाइल सही है)।

इसे हमें परीक्षण करने की आवश्यकता है। टेबल सेल के आसपास पैडिंग लें (हम रिपोर्ट डिजाइन के लिए वर्ड, एक्सेल और पावरपॉइंट का उपयोग करते हैं)। हमें पृष्ठ विराम के दौरान पैडिंग का परीक्षण करना होता है, एक कक्ष के अंदर, लंबवत मर्ज की गई कोशिकाओं के लिए, क्षैतिज रूप से मर्ज की गई कोशिकाएँ, एक लंबवत और क्षैतिज रूप से मर्ज की गई सेल जिसमें आंतरिक तालिका में एक लंबवत और क्षैतिज रूप से मर्ज की गई कक्ष होते हैं, जहाँ वह तालिका होती है। एक पृष्ठ पर टूट जाता है।

तो वह परीक्षण किस श्रेणी में आता है? टेबल पैडिंग, पेज ब्रेक, नेस्टेड सेल, वर्टिकल मर्ज किए गए सेल, हॉरिज़ॉन्टल मर्ज किए गए सेल या कुछ और?

और हम इन श्रेणियों का दस्तावेज कैसे बनाते हैं, इकाई परीक्षणों का नाम, आदि।

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

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


1
ऐसा लगता है कि आपका प्रश्न वास्तव में है, हमें कैसे पता चलेगा कि हमने किसी विशेष परिदृश्य का परीक्षण किया है?
एंडी विसेंडांगर 18

हाँ! और यह भी कि किसी भी अनजाने परिदृश्य के लिए परीक्षण कहाँ हैं। और इससे हमें # 2 की आवश्यकता होती है - जो कवर किया गया है उसे पढ़ने से हमें यह पता लगाने में मदद मिलती है कि हमने क्या याद किया।
डेविड थिएलेन

जवाबों:


13

आम तौर पर, मैं अपनी इकाई परीक्षणों के लिए स्रोत पेड़ को दर्पण करता हूं। इसलिए, अगर मेरे पास src / lib / fubar था, तो मेरे पास एक परीक्षण / lib / fubar होगा जिसमें fubar के लिए यूनिट परीक्षण शामिल होंगे।

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


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

जो इस सवाल की ओर जाता है कि हम परीक्षणों की तालिका कहाँ संग्रहीत करते हैं? मैं मूल स्रोत निर्देशिका में एक स्प्रेडशीट सोच रहा हूँ ???
डेविड थिएलेन

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

7

सबसे आम संरचना मिरर srcऔर testडायरेक्टरी मिरर लगती है ।

src/module/class
test/module/class_test

हालांकि, एक वैकल्पिक संरचना है जिसे मैंने देखा है जिसे मैं अब बेहतर मानता हूं।

src/module/class
src/module/class_test

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


2
पूर्व दृष्टिकोण से एक दोष यह है कि हर बार जब आप परियोजना की फ़ाइल संरचना को बदलने का निर्णय लेते हैं, तो आपको परीक्षण संरचना के लिए भी ऐसा ही करना होगा। यह समस्या मौजूद नहीं है अगर परीक्षण हैं जहां कोड है।
विजेता 1

5

.NET में, मैं "प्रोजेक्ट्स.उन्नत" या "टेस्ट.इंटरग्रेशन" मास्टर नाम स्थान के नीचे, परीक्षण परियोजनाओं में स्रोत कोड के लिए नेमस्पेस संरचना, या कम से कम अनुमानित करता हूं। सभी यूनिट परीक्षण एक परियोजना में जाते हैं, परियोजना के भीतर फ़ोल्डर के रूप में दोहराए गए स्रोत कोड की मूल संरचना के साथ। एकीकरण परीक्षणों के लिए भी। तो, एक परियोजना के लिए एक सरल समाधान इस तरह लग सकता है:

Solution
   MyProduct.Project1 (Project)
      Folder1 (Folder)
         ClassAA (Class def)
         ...
      Folder2
         ClassAB
         ...
      ClassAC
      ...
   MyProduct.Project2
      Folder1
         ClassBA
         ...
      ClassBB
      ...
   ...
   MyProduct.Tests.Unit
      Project1
         Folder1
            ClassAATests
            ClassAATests2 (possibly a different fixture setup)
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests
      ...
   MyProduct.Tests.Integration
      Project1 (a folder named similarly to the project)
         Folder1 (replicate the folders/namespaces for that project beneath)
            ClassAATests
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests

किसी भी एएटी या एईईटी के लिए जो एक इकाई-परीक्षण ढांचे के साथ कोडित हैं, यह थोड़ा बदलता है; आम तौर पर वे परीक्षण कदमों के एक सेट को प्रतिबिंबित करते हैं, जो एक नए उपयोग के मामले या कहानी की कार्यक्षमता का परीक्षण करेंगे। मैं आमतौर पर इन परीक्षणों को एक MyProduct.Tests.Acceptanceपरियोजना में संरचना करता हूं , जैसे कि प्रत्येक कहानी के लिए परीक्षण, संभवत: मील के पत्थर या "महाकाव्य" कहानी द्वारा समूहीकृत किया जाता है, जो कि विकास के अंतर्गत आने वाली कहानी है। हालाँकि, वे वास्तव में सिर्फ uber- एकीकरण परीक्षण हैं, और इसलिए यदि आप कहानी-उन्मुख फैशन के बजाय परीक्षण को अधिक ऑब्जेक्ट-ओरिएंटेड बनाना चाहते हैं, तो आपको एक MyProduct.Tests.Acceptanceया समान प्रोजेक्ट की आवश्यकता नहीं है ; MyProduct.Tests.Integrationपरीक्षण के तहत उच्चतम स्तर की वस्तु के दायरे में उन्हें फेंक दें ।


3

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

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

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

नामकरण के लिए, यूनिट परीक्षणों के नामों पर खर्च करने के लिए कोई विशेष मूल्य नहीं है । आपके परीक्षणों से सभी सुनना चाहते हैं "5235 परीक्षणों में से 5235 पारित"। जब कोई परीक्षा विफल हो जाती है, तो आप जो पढ़ते हैं, वह उसका नाम नहीं होता है, लेकिन संदेश , उदाहरण के लिए स्ट्रिंग assert()उस में आपकी सफलता की पुष्टि करता है। संदेश पर्याप्त जानकारीपूर्ण होना चाहिए कि आपके पास परीक्षण के शरीर को पढ़े बिना क्या गलत है, इसका अंदाजा हो। इसकी तुलना में नाम महत्वहीन है।


आपके द्वारा कहे गए सभी पर 100% सहमत हैं (हमारी निर्माण मशीन एक चेक पर सभी परीक्षणों को चलाती है)। हमारी बड़ी समस्या यह ट्रैक कर रही है कि हम क्या परीक्षण कर रहे हैं। और कोड कवरेज बहुत मदद नहीं है (ऊपर अद्यतन देखें)।
डेविड थिएलेन

1

यह जानने का एक तरीका है कि आप परीक्षणों पर कमजोर हैं या नहीं। आमतौर पर परीक्षणों के लिए, यह कवरेज का रूप लेता है।

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

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