मैं Arduino कोड का परीक्षण कैसे कर सकता हूं?


185

मैं अपने Arduino कोड का परीक्षण करने में सक्षम होना चाहता हूं। आदर्श रूप से, मैं Arduino पर कोड अपलोड किए बिना कोई भी परीक्षण चलाने में सक्षम होऊंगा। इसके लिए कौन से उपकरण या पुस्तकालय मेरी मदद कर सकते हैं?

विकास में एक Arduino एमुलेटर है जो उपयोगी हो सकता है, लेकिन यह अभी तक उपयोग के लिए तैयार नहीं लगता है।

Atmel के AVR स्टूडियो में एक चिप सिम्युलेटर होता है जो उपयोगी हो सकता है, लेकिन मैं यह नहीं देख सकता कि मैं इसे Arduino IDE के साथ कैसे उपयोग करूंगा।


2011 से इस सवाल पर एक और सूत्र है arduino.cc/forum/index.php?action=printpage=topic=54356.0
Jakob

धन्यवाद @ जाकोब एक Arduino सिम्युलेटर को उस धागे में संदर्भित किया गया है (पृष्ठ के निचले भाग में अन्य संभावित उपयोगी लिंक के साथ): arduino.com.au/Simulator-for-Arduino.html
मैथ्यू मर्डोक

5
दुर्भाग्य से इसकी केवल विंडोज के लिए, मैं बिना किसी बंद स्रोत या पासवर्ड की क्षमता के कमांड लाइन से केवल Arduino कोड को संकलित करने और चलाने का एक तरीका देखना चाहूंगा।
जैकब

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

महत्वपूर्ण परियोजनाओं के लिए, एक हार्डवेयर परीक्षक पर विचार करें; समय और परीक्षण बटन / स्विच प्रतिक्रियाओं, बूट समय, अस्थायी, वी / मा उपयोग, अजीब विकल्प क्रमपरिवर्तन, आदि की तुलना में एक और MCU, हाँ, यह बनाने के लिए अधिक हार्डवेयर है, लेकिन यह संशोधन बनाने पर एक सुरक्षा परत जोड़ सकता है। बहुत सारे प्रो डिवाइस jtag et al का उपयोग करते हैं।
डंडाविस

जवाबों:


136

Arduino डिवाइस या एमुलेटर पर यूनिट टेस्ट न चलाएं

माइक्रोकंट्रोलर डिवाइस / एमुलेटर / सिम-आधारित परीक्षणों के खिलाफ मामला

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

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

इसके बारे में इस तरह से सोचें: यहां तक ​​कि अगर आप Arduino लाइब्रेरी की कार्यक्षमता, माइक्रोकंट्रोलर हार्डवेयर, या एक एमुलेटर का परीक्षण करने के लिए थे, तो ऐसे परीक्षण परिणामों के लिए आपको अपने स्वयं के काम की गुणवत्ता के बारे में कुछ भी बताना बिल्कुल असंभव है । इसलिए, यूनिट परीक्षणों को लिखने के लिए यह अधिक मूल्यवान और कुशल है जो लक्ष्य डिवाइस (या एमुलेटर) पर नहीं चलते हैं।

आपके लक्ष्य हार्डवेयर पर बार-बार परीक्षण करने से दर्द का धीमा चक्र होता है:

  1. अपने कोड को ट्वीक करें
  2. संकलन और Arduino डिवाइस पर अपलोड करें
  3. व्यवहार का निरीक्षण करें और अनुमान लगाएं कि आपका कोड वह कर रहा है जो आप अपेक्षा करते हैं
  4. दोहराना

चरण 3 विशेष रूप से बुरा है यदि आप सीरियल पोर्ट के माध्यम से नैदानिक ​​संदेश प्राप्त करने की उम्मीद करते हैं, लेकिन आपकी परियोजना को अपने Arduino के एकमात्र हार्डवेयर पोर्ट का उपयोग करने की आवश्यकता है। यदि आप सोच रहे थे कि SoftwareSerial पुस्तकालय मदद कर सकता है, तो आपको पता होना चाहिए कि ऐसा करने से किसी भी कार्यक्षमता को बाधित करने की संभावना है जो एक ही समय में अन्य संकेतों को उत्पन्न करने जैसे सटीक समय की आवश्यकता होती है। यह समस्या मुझे हुई है।

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

यदि यह उपकरण या एमुलेटर पर परीक्षण करने के लिए मूर्खतापूर्ण है, तो मुझे क्या करना चाहिए ?

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

याद रखें, Arduino लाइब्रेरी और माइक्रोकंट्रोलर के व्यवहार को सही माना जाना चाहिए या कम से कम लगातार गलत होना चाहिए ।

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

अपने पीसी पर टेस्ट कैसे बनाएं और चलाएं

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

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

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

जो कुछ भी शेष है वह वास्तविक परीक्षण लिखना है और फिर अपने पसंदीदा सी ++ कंपाइलर का उपयोग करके इसे संकलित करना है! यह शायद एक वास्तविक दुनिया उदाहरण के साथ सबसे अच्छा सचित्र है।

एक वास्तविक कामकाजी उदाहरण

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

Mock_arduino.cpp का स्रोत, जिसमें कोड है जो Arduino लाइब्रेरी द्वारा प्रदान की गई कुछ समर्थन कार्यक्षमता को डुप्लिकेट करता है:

#include <sys/timeb.h>
#include "mock_arduino.h"

timeb t_start;
unsigned long millis() {
  timeb t_now;
  ftime(&t_now);
  return (t_now.time  - t_start.time) * 1000 + (t_now.millitm - t_start.millitm);
}

void delay( unsigned long ms ) {
  unsigned long start = millis();
  while(millis() - start < ms){}
}

void initialize_mock_arduino() {
  ftime(&t_start);
}

जब मेरा कोड हार्डवेयर सीरियल डिवाइस पर बाइनरी डेटा लिखता है, तो मैं पठनीय आउटपुट का उत्पादन करने के लिए निम्नलिखित मॉक-अप का उपयोग करता हूं।

fake_serial.h

#include <iostream>

class FakeSerial {
public:
  void begin(unsigned long);
  void end();
  size_t write(const unsigned char*, size_t);
};

extern FakeSerial Serial;

fake_serial.cpp

#include <cstring>
#include <iostream>
#include <iomanip>

#include "fake_serial.h"

void FakeSerial::begin(unsigned long speed) {
  return;
}

void FakeSerial::end() {
  return;
}

size_t FakeSerial::write( const unsigned char buf[], size_t size ) {
  using namespace std;
  ios_base::fmtflags oldFlags = cout.flags();
  streamsize oldPrec = cout.precision();
  char oldFill = cout.fill();

  cout << "Serial::write: ";
  cout << internal << setfill('0');

  for( unsigned int i = 0; i < size; i++ ){
    cout << setw(2) << hex << (unsigned int)buf[i] << " ";
  }
  cout << endl;

  cout.flags(oldFlags);
  cout.precision(oldPrec);
  cout.fill(oldFill);

  return size;
}

FakeSerial Serial;

और अंत में, वास्तविक परीक्षण कार्यक्रम:

#include "mock_arduino.h"

using namespace std;

void millis_test() {
  unsigned long start = millis();
  cout << "millis() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    sleep(1);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void delay_test() {
  unsigned long start = millis();
  cout << "delay() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    delay(250);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void run_tests() {
  millis_test();
  delay_test();
}

int main(int argc, char **argv){
  initialize_mock_arduino();
  run_tests();
}

यह पोस्ट काफी लंबी है, इसलिए कृपया कार्रवाई में कुछ और परीक्षण मामलों को देखने के लिए GitHub पर अपनी परियोजना देखें। मैं अपनी कार्य-प्रगति को गुरु के अलावा अन्य शाखाओं में रखता हूँ, इसलिए अतिरिक्त परीक्षणों के लिए उन शाखाओं की जाँच करें।

मैंने अपनी खुद की हल्की-फुल्की परीक्षाओं को लिखने के लिए चुना, लेकिन CppUnit जैसी अधिक मजबूत इकाई-परीक्षण रूपरेखाएँ भी उपलब्ध हैं।


1
यह एक महान जवाब है! धन्यवाद!
जोनाथन आर्केल

5
@WarrenMacEvoy फिर से, मुझे लगता है कि आपने मेरी सलाह ली है और इसे कुछ ऐसा बनाया है जो यह नहीं है। आपको अपने कोड को उसके वास्तविक वातावरण में कुछ बिंदुओं पर परीक्षण करना चाहिए। मेरा तर्क है कि आपको हर दिन ऐसा नहीं करना चाहिए और आपको निश्चित रूप से इसे इकाई परीक्षण नहीं कहना चाहिए।
लोहे का उद्धारकर्ता

1
@toasted_flakes मुझे यकीन नहीं है कि आपको वह बोली कहाँ मिली है, लेकिन यह कुछ ऐसा नहीं है जो मैंने कहा है। डिवाइस पर चल रहे यूनिट परीक्षणों में बहुत सारी समस्याएं हैं - बहुत धीमी प्रतिक्रिया लूप, आपके पास अपने लक्षित डिवाइस पर स्पेयर करने के लिए कोई सीरियल पोर्ट या आईओ का कोई अन्य साधन नहीं हो सकता है, और उनके पास बहुत सीमित क्षमता है जो स्कोप को प्रभावित कर सकती है आपका परीक्षण सूट।
लौह रक्षक

1
@ChristianHujer आपको निश्चित रूप से वास्तविक हार्डवेयर पर परीक्षण करना चाहिए - कोई भी यह नहीं कह रहा है कि आपको लक्ष्य हार्डवेयर पर कभी भी परीक्षण नहीं करना चाहिए। मेरी पोस्ट आपके विकास मशीन पर इकाई परीक्षण द्वारा आपके दैनिक विकास प्रतिक्रिया चक्र को कसने के बारे में है। आपका परीक्षण ओवरहेड इस तरह से कम से कम किया जाता है क्योंकि आप केवल अपने लक्ष्य हार्डवेयर पर परीक्षण करेंगे जब यह आवश्यक हो।
लौह रक्षक

1
@Benjohn Arduino स्केच स्रोत फ़ाइलों में C ++ होते हुए भी "pde" एक्सटेंशन हुआ करता था। arduino.cc/en/Guide/Environment#toc1
लौह रक्षक

63

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

#include <ArduinoUnit.h>

// Create test suite
TestSuite suite;

void setup() {
    Serial.begin(9600);    
}

// Create a test called 'addition' in the test suite
test(addition) {
    assertEquals(3, 1 + 2);
}

void loop() {
    // Run test suite, printing results to the serial port
    suite.run();
}

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

1
आप सही हे। एक पीसी पर इन को चलाने में सक्षम होने के लिए, इसके अलावा, एक Arduino या AVR एमुलेटर की आवश्यकता होती है। Arduino पुस्तकालयों (फिलहाल) और AVR एमुलेटर में कोई वास्तविक हार्डवेयर अमूर्त परत नहीं है जब मैंने देखा कि सभी अभी भी विकास में थे। अगर चीजें अभी आगे बढ़ी हैं तो सिद्धांत रूप में यह किया जा सकता है।
मैथ्यू मर्डोक

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

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

2
@Iron Savior एक इकाई परीक्षण आपके कोड का परीक्षण करता है, लेकिन आपका कोड कहीं चलता है। यदि वह प्रसंग Arduino संदर्भ है या उसका अनुकरण करता है; तब ArdunoUnit आपको यूनिट टेस्ट लिखने में मदद करेगा। यदि आप ArduinoUnit प्रोजेक्ट को देखते हैं, तो रूपरेखा का मेटा-परीक्षण स्वचालित रूप से क्रॉस-प्लेटफ़ॉर्म लक्ष्य पर परीक्षण के परिणामों को लोड करता है, चलाता है, और सत्यापित करता है। जैसे आप अन्य क्रॉस-प्लेटफ़ॉर्म लक्ष्यों पर होंगे। आपका दृष्टिकोण एक एम्बेडेड वातावरण में कोड का परीक्षण नहीं करने के लिए एक बहाना है जहां शुद्धता अधिक मायने रखती है, अगर अक्सर अधिक नहीं, अन्य संदर्भों की तुलना में।
वारेन मैकएवॉय

21

मेरे पास हार्डवेयर के उपयोग को समाप्त करने और इसे मेरे परीक्षणों में मॉक करने से मेरे पीएस कोड का परीक्षण करने में काफी सफलता है।

उदाहरण के लिए, मैं PORTA का सार करता हूं

#define SetPortA(v) {PORTA = v;}

तब सेटपॉर्टा को पीआईसी संस्करण में ओवरहेड कोड को जोड़े बिना आसानी से मजाक किया जा सकता है।

एक बार हार्डवेयर एब्स्ट्रैक्शन का परीक्षण किया गया है, जबकि मुझे जल्द ही पता चलता है कि आमतौर पर कोड टेस्ट रिग से लेकर PIC तक जाता है और पहली बार काम करता है।

अपडेट करें:

मैं इकाई कोड के लिए एक # सींकल सीम का उपयोग करता हूं, परीक्षण रिग के लिए C ++ फ़ाइल में यूनिट कोड और लक्ष्य कोड के लिए एक सी फ़ाइल #including।

एक उदाहरण के रूप में मैं चार 7 सेगमेंट डिस्प्ले को मल्टीप्लेक्स करना चाहता हूं, एक सेगमेंट को चलाने वाला पोर्ट और दूसरा डिस्प्ले का चयन। डिस्प्ले कोड के माध्यम से SetSegmentData(char)और के साथ प्रदर्शित करता है SetDisplay(char)। मैं अपने C ++ टेस्ट रिग में इनका मजाक उड़ा सकता हूं और जांच सकता हूं कि मुझे वह डेटा मिल रहा है जिसकी मुझे उम्मीद है। मैं जिस लक्ष्य का उपयोग #defineकरता हूं, उसके लिए मुझे फंक्शन कॉल के ओवरहेड के बिना एक सीधा काम मिलता है

#define SetSegmentData(x) {PORTA = x;}

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

अद्यतन के लिए धन्यवाद। क्या आप PIC या अपने पीसी पर यूनिट परीक्षणों को निष्पादित करते हैं?
मैथ्यू मर्डोक

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

Arduino वातावरण avr-gcc संकलक का उपयोग करता है जिसमें कुछ idiosyncrasies होते हैं जिसका अर्थ है कि gcc (या अन्य C ++ संकलक) के साथ संकलन करना और PC पर चलाने का अर्थ यह नहीं हो सकता है कि कोड avr-gcc पर भी संकलित होगा।
मैथ्यू मर्डोक 10

आप किस तरह के अंतर की बात कर रहे हैं? क्या वे चीजें हैं जो कुछ पूर्वप्रक्रमक निर्देशों के साथ नहीं निभाई जा सकती हैं?
जोसेफ लिसे


12

simavr avr-gcc का उपयोग करके एक AVR सिम्युलेटर है

यह पहले से ही कुछ ATTiny और ATMega माइक्रोकंट्रोलर्स का समर्थन करता है, और - लेखक के अनुसार - इसमें कुछ और जोड़ना आसान है।

उदाहरण में, एक Arduino एमुलेटर simduino है। यह Arduino बूटलोडर चल समर्थन करता है और के माध्यम से avrdude साथ प्रोग्राम किया जा सकता Socat (एक संशोधित Netcat )।


9

आप मेरी परियोजना, PySimAVR के साथ अजगर में परीक्षण कर सकते हैं । Arscons का उपयोग भवन निर्माण और सिमुलेशन के लिए simavr के लिए किया जाता है ।

उदाहरण:

from pysimavr.sim import ArduinoSim    
def test_atmega88():
    mcu = 'atmega88'
    snippet = 'Serial.print("hello");'

    output = ArduinoSim(snippet=snippet, mcu=mcu, timespan=0.01).get_serial()
    assert output == 'hello'

परीक्षण शुरू करें:

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok

6

मुझे ऐसे किसी भी प्लेटफ़ॉर्म के बारे में जानकारी नहीं है जो Arduino कोड का परीक्षण कर सकता है।

हालाँकि, फ्रिट्ज़िंग प्लेटफ़ॉर्म है, जिसका उपयोग आप हार्डवेयर के मॉडल और बाद में एक्सपोर्ट पीसीबी डायग्राम और सामान पर कर सकते हैं।

जांच करने लायक।


6

हम एक बड़े वैज्ञानिक प्रयोग में डेटा अधिग्रहण के लिए Arduino बोर्डों का उपयोग कर रहे हैं। इसके बाद, हमें अलग-अलग कार्यान्वयन के साथ कई Arduino बोर्डों का समर्थन करना होगा। यूनिट परीक्षण के दौरान मैंने Arduino hex छवियों को गतिशील रूप से लोड करने के लिए पायथन उपयोगिताओं को लिखा। नीचे दिए गए लिंक पर पाया गया कोड एक कॉन्फ़िगरेशन फ़ाइल के माध्यम से विंडोज और मैक ओएस एक्स का समर्थन करता है। यह पता लगाने के लिए कि आपकी हेक्स छवियां Arduino IDE द्वारा कहां रखी गई हैं, बिल्ड (प्ले) बटन को हिट करने से पहले शिफ्ट की को हिट करें। अपलोड को मारते हुए शिफ्ट की को हिट करें जहां यह पता लगाने के लिए कि आपका एवरड्यूड (कमांड लाइन अपलोड उपयोगिता) आपके सिस्टम / Arduino के संस्करण पर स्थित है या नहीं। वैकल्पिक रूप से, आप शामिल कॉन्फ़िगरेशन फ़ाइलों को देख सकते हैं और अपने इंस्टॉल स्थान (वर्तमान में Arduino 0020 पर) का उपयोग कर सकते हैं।

http://github.com/toddstavish/Python-Arduino-Unit-Testing


+1 महान सामान! क्या आपको इस बात की कोई जानकारी है कि चित्र अपलोड होने के बाद आपने अपनी इकाई का परीक्षण कैसे किया?
मैथ्यू मर्डोक

हमने अजगर इकाई को अपनी इकाई परीक्षणों को चलाने के लिए उपयोग किया। प्रत्येक परीक्षण के लिए सेटअप उस परीक्षण के लिए सही हेक्स छवि को लोड करता है। हम छोटे शुरू करते हैं और फिर अधिक व्यापक परीक्षण में काम करते हैं। सुनिश्चित करें कि धारावाहिक संचार काम कर रहा है, सुनिश्चित करें कि UI के लिए सीरियल एकीकरण काम कर रहा है, सीरियल को DB एकीकरण के लिए जांचें, आदि analog_read_speed pde और py इस की मूल बातें दिखाते हैं (ऊपर github लिंक देखें)। आखिरकार, हम पूरी परियोजना का स्रोत खोलेंगे, इसलिए कृपया बने रहें। :)
२१

6

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

Arduino फोरम: http://arduino.cc/forum/index.php?topic=140027.0

GitHub प्रोजेक्ट पेज: http://jeroendoggen.github.com/Arduino-TestSuite

पायथन पैकेज इंडेक्स में पेज: http://pypi.python.org/pypi/arduino_testsite

इकाई परीक्षण "अरुडिनो यूनिट टेस्टिंग लाइब्रेरी" के साथ लिखे गए हैं: http://code.google.com/p/arduinounit

इकाई परीक्षणों के प्रत्येक सेट के लिए निम्नलिखित कदम उठाए गए हैं:

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

5

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

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



5

मैं Arduino कोड लिखते समय Searduino का उपयोग कर रहा हूं । Searduino एक Arduino सिम्युलेटर और एक विकास वातावरण (Makefiles, C code ...) है जो आपके पसंदीदा संपादक का उपयोग करके C / C ++ में हैक करना आसान बनाता है। आप Arduino रेखाचित्र आयात कर सकते हैं और उन्हें सिम्युलेटर में चला सकते हैं।

Searduino का स्क्रीनशॉट 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 जारी किया जाएगा और एक वीडियो रिकॉर्ड किया जाएगा जैसे ही आखिरी परीक्षण किया जाता है .... एक या दो दिन में।

सिम्युलेटर पर परीक्षण वास्तविक परीक्षणों के रूप में नहीं माना जाता है, लेकिन इसने निश्चित रूप से मुझे बेवकूफ / तार्किक गलतियों को खोजने में मदद की है (करने के लिए भूल जाना pinMode(xx, OUTPUT), आदि)।

BTW: मैं Searduino विकसित करने वाले लोगों में से एक हूं।


5

मैंने arduino_ciइस उद्देश्य के लिए बनाया था । हालाँकि यह अरुडिनो लाइब्रेरीज़ (और स्टैंडअलोन स्केच) के परीक्षण तक सीमित है, यह इकाई परीक्षणों को स्थानीय स्तर पर या एक CI सिस्टम (जैसे ट्रैविस सीआई या ऐपवायर) पर चलाने में सक्षम बनाता है।

अपने Arduino पुस्तकालय निर्देशिका में एक बहुत ही सरल पुस्तकालय पर विचार करें कहा जाता है, DoSomethingके साथ, do-something.cpp:

#include <Arduino.h>
#include "do-something.h"

int doSomething(void) {
  return 4;
};

आप इसे निम्नानुसार परीक्षण करेंगे (एक परीक्षण फ़ाइल जिसे test/is_four.cppइस तरह कहा जाता है या कुछ के साथ):

#include <ArduinoUnitTests.h>
#include "../do-something.h"

unittest(library_does_something)
{
  assertEqual(4, doSomething());
}

unittest_main()  // this is a macro for main().  just go with it.

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

यूनिट परीक्षण I / O पिन, घड़ी, सीरियल पोर्ट आदि के बारे में अधिक जानकारी के लिए Reference.md देखें ।

ये यूनिट परीक्षण संकलित किए गए हैं और एक रूबी रत्न में निहित स्क्रिप्ट का उपयोग करके चलाए जाते हैं। इसे कैसे सेट किया जाए, इसके उदाहरणों के लिए, README.md देखें या इनमें से किसी एक उदाहरण से कॉपी करें:


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

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

3

एक प्रोजेक्ट है, जिसे ncore कहा जाता है , जो Arduino के लिए मूल कोर प्रदान करता है। और आपको Arduino कोड के लिए परीक्षण लिखने की अनुमति देता है।

परियोजना विवरण से

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

इसके अलावा "मुझे इसका उपयोग करने की क्या आवश्यकता है" अनुभाग पर

यदि आप परीक्षण का निर्माण करना चाहते हैं, तो आपको http://cxxtest.tigris.org से cxxtest की आवश्यकता होगी । NCORE को cxxtest 3.10.1 के साथ परीक्षण किया गया है।


यह एक दिलचस्प परियोजना है। दुर्भाग्य से, ऐसा लगता है कि यह अब मर चुका है, क्योंकि इसकी 6 साल तक कोई प्रगति नहीं हुई थी।
सेरिन

2

यदि आप MCU (डेस्कटॉप पर) के बाहर इकाई-परीक्षण कोड चाहते हैं, तो libcheck देखें: https://libcheck.github.io/check/

मैंने इसका उपयोग अपने स्वयं के एम्बेडेड कोड को कुछ बार परीक्षण करने के लिए किया। यह बहुत मजबूत ढांचा है।


केवल नकारात्मक पक्ष यह है कि यह g ++ का समर्थन नहीं करता है, जो कि C ++ सुविधाओं का उपयोग करने वाले अधिकांश Arduino पुस्तकालयों के परीक्षण के लिए बेकार बनाता है।
सेरिन

1

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


1

अपने कोड को डीबग करने के लिए या परीक्षण करने के लिए एक Arduino लाइब्रेरी के साथ Proteus VSM का उपयोग करें।

अपने कोड को ऑनबोर्ड करने से पहले यह एक सर्वोत्तम अभ्यास है, लेकिन समय के साथ सुनिश्चित करें क्योंकि बोर्ड पर चलने के दौरान अनुकार वास्तविक समय पर नहीं चलता है।


1

ऑटोडेस्क सर्किट सिम्युलेटर आज़माएं । यह कई अन्य हार्डवेयर घटकों के साथ Arduino कोड और सर्किट का परीक्षण करने की अनुमति देता है।


0

मूल Arduino में C और C ++ के साथ लिखा जाता है, यहाँ तक कि Arduino के पुस्तकालयों को C और C ++ में लिखा जाता है। इसलिए, सरल शब्दों में, कोड को C और C ++ के रूप में संभालें और इकाई परीक्षण करने का प्रयास करें। यहाँ, शब्द "हैंडल" से मेरा मतलब है कि आप सीरियल के सभी मूल वाक्यविन्यास को बदल दें जैसे कि सीरियल.प्रिंट को sysout, पिनमोड को varibibles, void पाश को जबकि () लूप जो किस्टॉक में या कुछ समय के बाद या तो टूट जाता है।

मुझे पता है कि यह एक लंबी प्रक्रिया है और इतना सीधा आगे नहीं है। मेरा व्यक्तिगत अनुभव है, एक बार जब आप इसे करने के लिए तैयार हो जाते हैं, तो यह अधिक विश्वसनीय हो जाता है।

-Nandha_Frost


0

यदि आप एक INO स्केच चलाने और धारावाहिक आउटपुट को चेकआउट करने में रुचि रखते हैं, तो मेरे पास Arduino NMEA चेकसम प्रोजेक्ट में इसका एक कार्यशील कार्यान्वयन है ।

निम्न स्क्रिप्ट फ़ाइल को ले जाती है और Arduino CLI का उपयोग करके इसे एक HEX फ़ाइल के रूप में संकलित किया जाता है जिसे बाद में SimAVR में लोड किया जाता है जो इसका मूल्यांकन करता है और सीरियल आउटपुट को प्रिंट करता है। चूंकि सभी Arduino प्रोग्राम हमेशा के लिए खुद को मारने का एक विकल्प के बिना हमेशा के लिए चलते हैं ( exit(0)काम नहीं करता है), मैंने स्केच को कुछ सेकंड तक चलने दिया और फिर अपेक्षित आउटपुट के साथ कैप्चर किए गए आउटपुट को अलग कर दिया।

डाउनलोड और निकालें Arduino CLI (इस मामले में संस्करण 0.5.0 - लेखन के समय नवीनतम):

curl -L https://github.com/arduino/arduino-cli/releases/download/0.5.0/arduino-cli_0.5.0_Linux_64bit.tar.gz -o arduino-cli.tar.gz
tar -xvzf arduino-cli.tar.gz

अब आप इंडेक्स को अपडेट कर सकते हैं और उचित कोर इंस्टॉल कर सकते हैं:

./arduino-cli core update-index
./arduino-cli core install arduino:avr

यह मानकर कि आपका स्केच नाम है nmea-checksum.ino, ELF और HEX पाने के लिए, रन करें:

./arduino-cli compile -b arduino:avr:uno nmea-checksum.ino

अगला, HAV (या ELF) चलाने के लिए SimAVR - मैं स्रोत से निर्माण करता हूं क्योंकि नवीनतम रिलीज ने मेरे लिए काम नहीं किया:

sudo apt-get update
sudo apt-get install -y build-essential libelf-dev avr-libc gcc-avr freeglut3-dev libncurses5-dev pkg-config
git clone https://github.com/buserror/simavr.git
cd simavr
make

सफल संकलन आपको देगा simavr/run_avrजो आप स्केच को चलाने के लिए उपयोग कर सकते हैं। जैसा मैंने कहा, timeoutअन्यथा यह कभी समाप्त नहीं होगा:

cd simavr
timeout 10 ./run_avr -m atmega168 -f 16000000 ../../nmea-checksum.ino.arduino.avr.uno.elf &> nmea-checksum.ino.clog || true

जेनरेट की गई फ़ाइल में सीरियल आउटपुट को लपेटने वाले ANSI कलर कोड कंट्रोल कैरेक्टर होंगे, जिनसे छुटकारा पाने के लिए:

cat nmea-checksum.ino.clog | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > nmea-checksum.ino.log
cat nmea-checksum.ino.log

अब आपको बस इतना करना है कि इस फाइल की तुलना एक जानी पहचानी फाइल से की जाए:

diff nmea-checksum.ino.log ../../nmea-checksum.ino.test

यदि कोई अंतर नहीं है, diffतो कोड 0 के साथ बाहर निकल जाएगा, अन्यथा स्क्रिप्ट विफल हो जाएगी।

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