सबसे अच्छा अभ्यास जब एम्बेडेड विकास के लिए इकाई परीक्षण


45

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

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

अपडेट करें

मुझे एक सी टेस्टिंग फ्रेमवर्क आया, जो एम्बेडेड प्रोजेक्ट्स के परीक्षण में काफी सफल प्रतीत होता है। यह मॉकिंग हार्डवेयर के विचारों का उपयोग करता है। की जाँच करें एकता , CMock , और संभवतः Ceedling

अपडेट 06Jul2016

Cmocka भर में आया था - लगता है और अधिक सक्रिय रूप से काम किया है।


1
ऐसी ही परिस्थितियों में, हम
बजे

जवाबों:


28

मैं जल्द से जल्द संभव कदम पर हार्डवेयर निर्भरता से दूर हो जाएगा, और सॉफ्टवेयर इम्यूलेशन / टेस्ट हार्नेस पर प्रणाली का निर्माण करूँगा, जिससे सभी प्रकार के परीक्षण ढांचे को सक्षम किया जा सकेगा। अक्सर मेरे डिवेलपमेंट पीसी का उपयोग 95% या अधिक पूर्ण सिस्टम के रूप में परीक्षण करने के लिए किया जाता था। अतिरिक्त ओवरहेड (अमूर्त की एक और परत) की लागत आसानी से उस अमूर्त के परिणामस्वरूप उत्पन्न क्लीनर कोड द्वारा वापस जीत ली गई थी।

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

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


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

3
हमारे द्वारा किए गए हर एक उत्पाद में टार्गेट प्लेटफॉर्म और पीसी के लिए ड्राइवरों के कार्यान्वयन के साथ हार्डवेयर एब्स्ट्रेक्शन लेयर है। इससे हम यूनिट टेस्ट आसानी से चला सकते हैं। अन्य फायदे: हम फास्ट सिस्टम टेस्ट भी चला सकते हैं और अधिकांश सॉफ्टवेयर बिना किसी हार्डवेयर के विकसित कर सकते हैं (जैसा कि यह बाद में उपलब्ध है)।
MaR

15

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

मैं आपके प्रश्न के इस भाग से पूरी तरह असहमत हूं: "स्वचालन महान लेकिन कठिन और महंगा होगा।"

एक सीरियल पोर्ट सिग्नल इंजेक्टर के रूप में TeraTerm का उपयोग करना, और कुछ TeraTerm मैक्रोज़ (लगभग 20 मिनट लगते हैं) लिखना, स्वचालित परीक्षणों का एक विशाल सूट है जो कि एम्बेडेड सिस्टम के किसी भी हिस्से के खिलाफ चलाया जा सकता है - चाहे ड्राइवर परत, ओ / एस, परत 4-5, आदि। TeraTerm: http://en.sourceforge.jp/projects/ttssh2/

यदि सीरियल पोर्ट एम्बेडेड सिस्टम पर उपलब्ध नहीं है, तो USB / सीरियल पोर्ट डेटा को डिजिटल सिग्नल (यह भी सस्ती और आसानी से प्राप्त करने के लिए) में बदलने के लिए एक हार्डवेयर टूल का उपयोग करें। जब आप इसे पढ़ते हैं, तो मैं उत्पादन के लिए एक एम्बेडेड प्रणाली का परीक्षण करने के लिए एक $ 30 माइक्रोकंट्रोलर बोर्ड (UBW: http://www.schmalzhaus.com/UBW32/ ) का उपयोग कर रहा हूं, TeraTerm मैक्रोज़ के माध्यम से उत्तेजना को इंजेक्ट करके जो USB / सीरियल के लिए भेजा जाता है माइक्रोकंट्रोलर, जो संशोधित फर्मवेयर चला रहा है जो डिजिटल इनपुट का अभ्यास करता है और लक्ष्य एम्बेडेड सिस्टम के डिजिटल आउटपुट को मॉनिटर करता है। इसके साथ संयोजन के रूप में, हमने डेटा इंजेक्शन और डेटा सत्यापन को स्वचालित करने के लिए एक पायथन स्क्रिप्ट (pyserial और pexpect का उपयोग करता है) विकसित किया। इसमें से कोई भी मुश्किल नहीं है और इसमें से कोई भी महंगा नहीं है। मेरे अनुभव में, प्रबंधक बड़ी रकम (जैसे $ 30,000 परीक्षण उपकरण) खर्च करते हैं जब परीक्षण टीम अनुभवहीन होती है और इन आसान समाधानों के बारे में सोच नहीं पाती है - दुर्भाग्य से, सामान्य प्रयोजन के बड़े-लोहे के उपकरण अक्सर परीक्षण मामलों को शामिल नहीं करते हैं जो लक्ष्य प्रणाली की सबसे खराब स्थिति / समय को पकड़ते हैं। इसलिए सस्ती कवरेज परीक्षण कवरेज के लिए बेहतर है। मनो या न मनो।


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

2
बस मुझे LabView पर शुरू न करें .. यह आमतौर पर भयानक सामान है।
जोनाथन क्लाइन IEEE

1
हमारे परीक्षण इंजीनियरों को LabView से प्यार है, मैं इसे खुद नहीं समझता।
तेहनीत

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

5

यह बहुत कठिन समस्या है।

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

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


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

@tehnyit - हाँ, यही कारण था कि हमने स्वचालन प्रणाली विकसित करने का निर्णय लिया। कभी-कभी चीजों को मैन्युअल रूप से नहीं किया जा सकता है, फिर भी इकाई परीक्षण को व्यापक और कवर करने के लिए समय की आवश्यकता होती है। तो फिर आप ज्यादा विकल्प नहीं है, लेकिन इस स्तर पर स्वचालन है करने के लिए एक बहुत महंगा बात।
21

4

संपादित करें: मेरा उत्तर मैट्नज़ के करीब है, मुझे लगता है ...


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

एकल बाह्य ऑपरेशन का परीक्षण

आप प्रत्येक ऑपरेशन का शारीरिक परीक्षण करना चाहते हैं। जाँच करें कि सिस्टम क्लॉक सही समय देता है, एक फ़ाइल की जाँच करें जो वास्तव में लिखा गया है, याद रखें कि एक डिवाइस एक एकल ऑपरेशन प्राप्त करता है ...

ये परीक्षण:

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

तर्क (कोड, एल्गोरिदम) का परीक्षण करना जो बाहरी संचालन को एक साथ जोड़ता है

वास्तविक बाह्य संचालनों को बनाने के लिए कोड की एक परत होने से, उन्हें एक ऐसे इंटरफ़ेस से छिपाकर, जिसे आप आसानी से मॉक कर सकते हैं, आपका तर्क अब वास्तविक भौतिक उपकरणों पर निर्भर नहीं है ...

आप बस परीक्षण कर सकते हैं, किसी भी नियमित परियोजना के रूप में, आप अब एक एम्बेडेड मुश्किल-से-परीक्षण कोड में नहीं हैं


3

एंबेडेड सीपीयू सिमुलेटर आमतौर पर हार्डवेयर का अनुकरण करने के लिए प्रोग्राम किया जा सकता है। एक्सएमएल के अलावा सभी वर्चुअलाइजेशन तकनीकें ऐसा करती हैं। लेकिन आपको ऐसे कोड लिखने की आवश्यकता है जो कुछ भौतिक पते पर या x86 पर, I / O बस पर एक पते पर कुछ रजिस्टर करने का दिखावा करते हैं, और फिर आपको इन पते पर पढ़ने और लिखने की आवश्यकता है जैसे कि आपका सॉफ़्टवेयर भौतिक था चिप जिसका नियंत्रण और स्थिति रजिस्टर एक्सेस किया जा रहा था।

यदि आप ऐसा करना चाहते हैं, तो मैं QEMU को संशोधित करने का सुझाव दूंगा। लेकिन यह आसान नहीं होगा। इस तरह की बात आमतौर पर केवल तब की जाती है जब आप अपने आई / ओ के लिए एक माइक्रोकंट्रोलर और कुछ अन्य कोर के साथ एक कस्टम चिप डिजाइन कर रहे होते हैं।

एआरएम होल्डिंग्स द्वारा बेची गई विकास प्रणाली इसके लिए प्रदान करती है और QEMU पर हैकिंग की तुलना में काम करना आसान है, लेकिन बहुत महंगा है।

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

आप C या C ++ में एक साधारण यूनिट टेस्ट हार्नेस लिख सकते हैं, टेस्ट के तहत क्लास या सबरूटीन को लिंक कर सकते हैं, फिर इसे सिम्युलेटर में चला सकते हैं।

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

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


3

गैर-एम्बेडेड TDD के साथ, नकली वस्तुएं निश्चित रूप से आपकी मित्र हैं।

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

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

इन्हें (शुरू में) केवल उन बिट्स का परीक्षण करने की आवश्यकता होती है जिन्हें ऑफ़लाइन परीक्षण नहीं किया जा सकता है। निश्चित रूप से, यह TDD नहीं है (क्योंकि आप पहले से परीक्षण बना रहे हैं) लेकिन आपके ऑफ़लाइन TDD विकास से आपको यह पता लगना चाहिए कि आपके हार्डवेयर इंटरफ़ेस को कैसा दिखना है और इस प्रकार आपको कौन से ऑनलाइन परीक्षण करने की आवश्यकता है।

इसके अलावा, यदि ऑनलाइन विकास में ऑफ़लाइन विकास की तुलना में बहुत अधिक खर्च होता है (जैसा कि मैं जहां काम करता हूं) तो यह ऑनलाइन आपको बहुत समय बचा सकता है, जिसमें परीक्षण के माध्यम से अच्छी तरह से समझा जा सकता है।


+1 प्लेट पर नकली वस्तुएं लाने के लिए, @ चिह्न। एक समस्या यह है कि नकली वस्तुओं की सटीकता सुनिश्चित करना, जिसका अर्थ यह है कि वस्तु को नकली माना जाना काफी गहरा होना चाहिए। यह अच्छा है क्योंकि यह डेवलपर को उन बाहरी वस्तुओं के व्यवहार को समझने के लिए मजबूर करता है जो इसमें हस्तक्षेप कर रही है।
तेहनीत

1

एम्बेडेड विकास में आप अक्सर पूरे एप्लिकेशन (हार्डवेयर सहित) कार्यों को सत्यापित करने के लिए सीमा स्कैन करते हैं । सिस्टम डीबगिंग के लिए JTAG भी देखें ।

हार्डवेयर के लिंक के बिना शुद्ध सॉफ्टवेयर रूटीन का परीक्षण एक मानक सी यूनिट टेस्ट फ्रेमवर्क जैसे चेक द्वारा किया जा सकता है । लेकिन स्मृति सीमाओं (विशेष रूप से छोटे उपकरणों पर स्टैकस्पेस आदि) से सावधान रहें। अपने अनुबंधों को जानें! आप एक बड़ा परीक्षण-कवरेज हासिल करने के लिए हार्डवेयर से सॉफ़्टवेयर रूट को अमूर्त करने की कोशिश कर सकते हैं, लेकिन यह आमतौर पर छोटे PIC या AVR जैसे एम्बेडेड उपकरणों पर प्रदर्शन के मामले में महंगा है। हालांकि, आप एक बड़ा कवरेज प्राप्त करने के लिए हार्डवेयर पोर्ट का मजाक उड़ा सकते हैं (और निश्चित रूप से आप उस नकली का परीक्षण भी कर सकते हैं)।

आप चिप या सर्किट सिमुलेटर के लिए एमुलेटर का उपयोग करने का भी प्रयास कर सकते हैं, लेकिन इस तरह के उपकरण महंगे हैं (विशेषकर संयोजन में) और जटिल।


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