سؤال

أود أن أكون قادرا على اختبار الوحدة رمز Arduino الخاص بي. من الناحية المثالية، سأكون قادرا على تشغيل أي اختبارات دون الحاجة إلى تحميل التعليمات البرمجية إلى Arduino. ما هي الأدوات أو المكتبات التي يمكن أن تساعدني في هذا؟

هناك محاكي اردوينو في التنمية والتي قد تكون مفيدة، لكنها لا يبدو أنها جاهزة للاستخدام.

ستوديو avr من ATMEL يحتوي على محاكي رقاقة يمكن أن يكون مفيدا، لكنني لا أستطيع أن أرى كيف أستخدمها بالتزامن مع Arduino IDE.

هل كانت مفيدة؟

المحلول 2

في غياب أي أطر اختبار الوحدة الموجودة مسبقا لاردوينو، فقد أنشأت اردويونونيت. وبعد إليك رسم 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();
}

نصائح أخرى

لا تدير اختبارات الوحدة على جهاز Arduino أو المحاكي

الحال ضد الاختبارات المسنة للجهاز / المحاكي / المحاكي / سيم

هناك الكثير من المناقشة حول ما اختبار الوحدة يعني ولا أحاول حقا اتخاذ حجة حول ذلك هنا. هذا المنشور هو ليسيخبرك أن تتجنب الكل اختبار عملي على الأجهزة المستهدفة النهائية الخاصة بك. أحاول أن أحصل على نقطة حول تحسين دورة ردود الفعل التنموية عن طريق القضاء على أجهزةك المستهدفة من اختباراتك الأكثر دنيوية ومتكررة. يفترض أن الوحدات قيد الاختبار أصغر بكثير من المشروع بأكمله.

الغرض من اختبار الوحدة هو اختبار جودة التعليمات البرمجية الخاصة بك. يجب ألا تختبر اختبارات الوحدات بشكل عام وظيفة العوامل خارج عنصر تحكم الخاص بك.

فكر في الأمر بهذه الطريقة: حتى لو كنت لاختبار وظيفة مكتبة أردوينو، فإن أجهزة متحكم أو محاكي، هو مستحيل تماما لنتائج الاختبار هذه لإخبارك بأي شيء عن جودة عملك الخاص. وبالتالي، فهو أكبر قيمة وكفاءة لكتابة اختبارات الوحدة التي لا تعمل على الجهاز المستهدف (أو المحاكي).

اختبار متكرر على الأجهزة المستهدفة لديه دورة بطيئة مؤلمة:

  1. قرص الرمز الخاص بك
  2. ترجمة وتحميل إلى جهاز اردوينو
  3. مراقبة السلوك وتخمين ما إذا كان لك الرمز يفعل ما تتوقعه
  4. يكرر

الخطوة 3 سيئة للغاية إذا كنت تتوقع الحصول على رسائل التشخيص عبر المنفذ التسلسلي، لكن مشروعك يحتاج نفسه إلى استخدام منفذ Arduino المسلسل الوحيد للأجهزة. إذا كنت تفكر في أن مكتبة Softwareserial قد تساعد، يجب أن تعرف أن القيام بذلك من المرجح أن تعطيل أي وظيفة تتطلب توقيت دقيق مثل توليد إشارات أخرى في نفس الوقت. حدثت هذه المشكلة لي.

مرة أخرى، إذا كنت تقوم باختبار رسمك باستخدام محاكي وركض الروتينات المهمة في الوقت المناسب تماما حتى يتم تحميله إلى Arduino الفعلي، فإن الدرس الوحيد الذي ستعلمه هو أن المحاكي معيبة - ومعرفة هذا لا يزال يكشف لا شيئ حول جودة بنفسك الشغل.

إذا كان سخيفا لاختبار الجهاز أو المحاكي، فما ينبغي أفعل؟

من المحتمل أنك تستخدم جهاز كمبيوتر يعمل على مشروع Arduino الخاص بك. هذا الكمبيوتر هو أوامر من الأقواس بشكل أسرع من متحكم. اكتب الاختبارات لبناء و تشغيل على جهاز الكمبيوتر الخاص بك.

تذكر، يجب أن يكون سلوك مكتبة أردوينو والكمبيوتر المتحكم يفترض أن يكون صحيحا أو على الأقل باستمرار غير صحيح.

عندما تنتج اختباراتك إخراج خلافا لتوقعاتك، فمن المحتمل أن يكون لديك عيب في التعليمات البرمجية التي تم اختبارها. إذا كان إخراج الاختبار الخاص بك يطابق توقعاتك، ولكن البرنامج لا يتصرف بشكل صحيح عند تحميله على Arduino، فأنت تعلم أن اختباراتك تعتمد على افتراضات غير صحيحة، ومن المحتمل أن يكون لديك اختبار معيب. في كلتا الحالتين، ستحصل على رؤى حقيقية حول ما يجب أن تكون تغييراتك القمادة التالية. تم تحسين جودة ملاحظاتك من "شيئا ما مكسورة "إلى "هذه رمز محدد مكسورة ".

كيفية بناء وتشغيل الاختبارات على جهاز الكمبيوتر الخاص بك

أول شيء تحتاج إلى القيام به هو تحديد أهداف الاختبار الخاصة بك. وبعد فكر في أي أجزاء من الرمز الخاص بك تريد اختبار ثم تأكد من إنشاء برنامجك بطريقة يمكنك ذلك عزل الأجزاء المنفصلة للاختبار.

إذا كانت الأجزاء التي ترغب في اختبارها في استدعاء أي وظائف Arduino، فستحتاج إلى توفير بدائل وهمية في برنامج الاختبار الخاص بك. هذا هو العمل أقل بكثير مما يبدو. لا يتعين على النشك الخاص بك أن تفعل أي شيء فقط ولكن توفير مدخلات وإخراج يمكن التنبؤ بها للاختبارات الخاصة بك.

يحتاج أي من التعليمات البرمجية الخاصة بك التي تنوي اختبارها إلى الوجود في ملفات المصدر بخلاف رسم .pde. لا تقلق، فإن رسمك ستظل حتى مع بعض التعليمات البرمجية المصدر خارج الرسم. عندما تنزل بالفعل، يجب تحديد أكثر من نقطة الدخول العادية في برنامج البرنامج في ملف Sketch.

كل ما يبقى هو كتابة الاختبارات الفعلية ثم ترجمةها باستخدام مترجم C ++ المفضل لديك! من المحتمل أن يتم توضيح هذا مع مثال عالمي حقيقي.

مثال عمل فعلي

وجدت واحدة من مشاريع الحيوانات الأليفة هنا لديه بعض الاختبارات البسيطة التي تعمل على جهاز الكمبيوتر. للحصول على إصدار الإجابة، سأذهب فقط إلى كيفية سخرية بعض وظائف مكتبة اردوينو والاختبارات التي كتبتها لاختبار تلك الناتج. هذا لا يتعارض مع ما قلته قبل عدم اختبار قانون الآخرين لأنني كنت الشخص الذي كتب النموذج. كنت أرغب في أن أكون متأكدا جدا من صحة نهمي.

مصدر mock_arduino.cpp، الذي يحتوي على رمز تكرر بعض وظائف الدعم المقدمة من مكتبة أردوينو:

#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();
}

هذا المنصب طويل بما فيه الكفاية، لذا يرجى الرجوع إلى مشروعي على جيثب لرؤية بعض حالات الاختبار أكثر في العمل. أحتفظ بأعمال أعمالي في الفروع بخلاف سيد، لذلك تحقق من تلك الفروع للاختبارات الإضافية أيضا.

اخترت كتابة إجراءات اختبار الوزن خفيفة الوزن الخاصة بي، لكن أطر أكثر قوة اختبار وحدة مثل CPPunit متاحة أيضا.

لدي وحدة نجاح كبيرة لاختبار رمز الموافقة المسبقة عن علم من خلال تجريد الوصول إلى الأجهزة ويسخر منه في اختباراتي.

على سبيل المثال، أنا مجردة بورتا مع

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

ثم يمكن بسهولة سرد Seeporta، دون إضافة رمز علوي في إصدار الموافقة المسبقة عن علم.

بمجرد اختبار تجريد الأجهزة، فأنا قريبا أن أجد أن التعليمات البرمجية عموما ينتقل من جهاز الاختبار إلى الموافقة المسبقة عن علم ويعمل لأول مرة.

تحديث:

يمكنني استخدام التماس #Include لرمز الوحدة، # لفظي رمز الوحدة في ملف C ++ للحصول على جهاز الاختبار، وملف C للحصول على التعليمات البرمجية الهدف.

كمثال أريد أن تعرض FORILE FOO 7 7، منفذ واحد يقود القطاعات واختيار الشاشة الثانية. واجهات رمز العرض مع الشاشات عبر SetSegmentData(char) و SetDisplay(char). وبعد يمكنني أن أسخر منها في تلاعب اختبار C ++ الخاص بي وتحقق من أن أحصل على البيانات التي أتوقعها. بالنسبة للهدف الذي أستخدمه #define حتى أحصل على مهمة مباشرة دون النفقات العامة للمكالمة

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

يبدو أن امولينو سوف تفعل الوظيفة تماما.

Emulino هو محاكي لمنصة اردوينو بواسطة جريج هايوغل. فيمصدر)

جيثب مستودع

سيمافر هو avr. محاكاة. باستخدام AVR-GCC.

إنه يدعم بالفعل عدد قليل من المتحكمين Attiny و Atmega، و - وفقا للمؤلف - من السهل إضافة بعض أكثر.

في الأمثلة تكمن Simduino، وهو محاكي أردوينو. وهو يدعم تشغيل محمل الإقلاع Arduino ويمكن برمجته مع AVRDUDE من خلال سيارات (تعديل Netcat.).

يمكنك اختبار الوحدة في بيثون مع مشروعي، pysimavr.. arscons. يستخدم للبناء و سيمافر للمحاكاة.

مثال:

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

أنا لست على علم بأي منصة يمكن اختبار رمز اردوينو.

ومع ذلك، هناك فريتز منصة، والتي يمكنك استخدامها لنموذج الأجهزة ثم في وقت لاحق على تصدير مخططات PCB والأشياء.

يستحق التدقيق.

نحن نستخدم لوحات Arduino للحصول على البيانات في تجربة علمية كبيرة. بعد ذلك، علينا أن ندعم العديد من لوحات اردوينو مع تطبيقات مختلفة. كتبت ثياب الثعابين إلى تحميل صور عرافة أردوينو ديناميكيا أثناء اختبار الوحدة. يدعم الكود الموجود على الرابط أدناه Windows و Mac OS X عبر ملف التكوين. لمعرفة المكان الذي يتم فيه وضع صور HEX الخاصة بك من قبل Arduino IDE، اضغط على مفتاح Shift قبل أن تضغط على زر الإنشاء (اللعب). اضغط على مفتاح Shift أثناء ضرب التحميل لمعرفة المكان الذي توجد فيه AVRDUDE STORD UPLAAD UPLOAD (UPRDUDE (UPRDUDE STORD UPLAAD) في نظامك / إصدار Arduino الخاص بك. بدلا من ذلك، يمكنك إلقاء نظرة على ملفات التكوين المضمنة واستخدام موقع التثبيت الخاص بك (حاليا على Arduino 0020).

http://github.com/toddstavish/python-arduino-unit-testing.

يتيح هذا البرنامج تشغيل تلقائي لعدة اختبارات وحدة اردوينو. يتم تشغيل عملية الاختبار على جهاز الكمبيوتر ولكن الاختبارات تعمل على أجهزة Arduino الفعلية. يتم استخدام مجموعة واحدة من اختبارات الوحدة عادة لاختبار مكتبة Arduino واحدة. (هذه

منتدى اردوينو: http://arduino.cc/forum/index.php؟topic=140027.0.

صفحة مشروع GitHub: http://jerenendoggen.github.com/arduino-testsuite.

الصفحة في مؤشر حزمة بيثون: http://pypi.python.org/pypi/arduino_testsuite.

تتم كتابة اختبارات الوحدة باستخدام "مكتبة اختبار وحدة Arduino": http://code.google.com/p/arduinounit.

يتم تنفيذ الخطوات التالية لكل مجموعة من اختبارات الوحدات:

  • اقرأ ملف التكوين لمعرفة الاختبارات التي يجب تشغيلها
  • يجمع البرنامج النصي وتحميل رسم Arduino الذي يحتوي على رمز اختبار الوحدة.
  • يتم تشغيل اختبارات الوحدة على لوحة اردوينو.
  • تتم طباعة نتائج الاختبار عبر المنفذ التسلسلي وتحليلها بواسطة البرنامج النصي Python.
  • يبدأ البرنامج النصي في الاختبار التالي، وكرر الخطوات المذكورة أعلاه لجميع الاختبار المطلوب في ملف التكوين.
  • يطبع البرنامج النصي ملخصا يوضح نظرة عامة على جميع الاختبارات الفاشلة / التي تم تمريرها في TestSuite الكامل.

احتفظ برمجية خاصة بالأجهزة منفصلة أو مستخرجة عن البقية حتى تتمكن من اختبار وتصحيح هذا "الراحة" الأكبر على أي منصة لديك أدوات جيدة ولديها على دراية أكثر.

في الأساس، حاول بناء أكبر قدر ممكن من الكود النهائي من أكبر عدد ممكن من الكتل المبنية المعروفة. سيكون العمل المتبقي الخاص بالأجهزة بعد ذلك أسهل بكثير وأسرع. قد تنتهي من خلال استخدام المحاكيات الموجودة و / أو أجهزة محاكاة بنفسك. ثم، بالطبع، ستحتاج إلى اختبار الشيء الحقيقي بطريقة أو بأخرى. اعتمادا على الظروف التي قد تكون أو لا تكون أو غير ذلك بشكل جيد للغاية (أي من أو ما الذي يضغط على أزرار وتقديم مدخلات أخرى؟ من أو ما الذي سيعلم وتفسير المؤشرات والمخرجات المختلفة؟).

James W. Prenning يكتب كتبا كبيرة وهذا واحد حول اختبار الوحدة كود C Embed C اختبار تنمية مدفوعة للمدمج C.

انا استخدم سردوينو عند كتابة رمز اردوينو. Searduino عبارة عن محاكي اردوينو وبيئة تطوير (Makefiles و C Code ...) التي تجعل من السهل الاختراق في C / C ++ باستخدام المحرر المفضل لديك. يمكنك استيراد رسومات اردوينو وتشغيلها في محاكاة.

لقطة شاشة Searduino 0.8: http://searduino.files.wordpress.com/01/jearduino-0-8.png.

سيتم إصدار Searduino 0.9 وسيتم تسجيل الفيديو بمجرد إجراء الاختبارات الوخارية .... في يوم أو يومين.

لا ينبغي النظر في الاختبارات على المحاكاة اختبارات حقيقية، لكنه بالتأكيد ساعدني كثيرا في العثور على أخطاء غبية / منطقية (نسيان القيام به pinMode(xx, OUTPUT), ، إلخ.).

راجع للشغل: أنا أحد الأشخاص الذين يطورون سردوينو.

لقد بنيت arduino_ci لهذا الغرض. على الرغم من أنه يقتصر على اختبار مكتبات Arduino (وليس الرسومات المسفوقة)، فإنه يتيح تشغيل اختبارات الوحدات إما محليا أو على نظام CI (مثل ترافيس CI أو Appleyor).

النظر في مكتبة بسيطة جدا في دليل مكتبة أردوينو الخاص بك، ودعا 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 بناء الجملة وبنية الاختبار تبدو مألوفة، لأنني اعتمدت بعض مكتبة ماتثيو موردووتشأنه أشار إليه إجابته.

يرى report.md. لمزيد من المعلومات حول اختبار وحدة I / O، الساعة، المنافذ التسلسلية، إلخ.

يتم تجميع اختبارات الوحدة هذه وتشغيلها باستخدام برنامج نصي موجود في جوهرة Ruby. للحصول على أمثلة حول كيفية تعيين ذلك، راجع readme.md. أو مجرد نسخ من إحدى هذه الأمثلة:

هناك مشروع يسمى ncore., التي توفر الأساسية الأصلية لاردوينو. ويسمح لك بكتابة اختبارات للحصول على رمز Arduino.

من وصف المشروع

يسمح لك النواة الأصلية بتجميع وتشغيل Arduino Sketches على جهاز الكمبيوتر، عموما مع عدم وجود تعديل. إنه يوفر إصدارات أصلية من وظائف Arduino القياسية، و Interpreter Intrepreter لسطر الأوامر لإعطاء المدخلات إلى رسمك والتي ستأتي عادة من الأجهزة نفسها.

أيضا في قسم "ما الذي أحتاج إلى استخدامه"

إذا كنت ترغب في بناء الاختبارات، فستحتاج إلى cxxtest من http://cxxtest.org.. وبعد تم اختبار NCORE مع CXXTest 3.10.1.

إذا كنت ترغب في الوصول إلى رمز الاختبار خارج MCU (على سطح المكتب)، تحقق من Libcheck:https://libcheck.github.io/check/

اعتدت عليه لاختبار الرمز المضمن الخاص بي عدة مرات. إنه إطار قوي للغاية.

يمكنك استخدام الحماس - يمكنك سحب وإسقاط ميكروكنترولر على رسم تخطيطي وتشغيل التعليمات البرمجية الخاصة بك في الكسوف. يخبرك الوثائق الموجودة على الموقع بكيفية إعدادها.

استخدم Proteus VSM مع مكتبة Arduino لتصحيح الرمز الخاص بك أو لاختباره.

إنها أفضل الممارسات قبل الحصول على رمزك على متنها، ولكن تأكد من توقيت لأن المحاكاة لا تعمل في الوقت الفعلي أثناء تشغيلها على اللوحة.

محاولة محاكاة حلبة Autodesk. وبعد يسمح باختبار رمز Arduino والدوائر مع العديد من مكونات الأجهزة الأخرى.

في Arduino الأساسية مكتوب مع C و C ++، حتى مكتبة مكتبات Arduino مكتوبة في C و C ++. لذلك، في حالة بسيطة فقط تعامل مع التعليمات البرمجية ك C و C ++ وحاول القيام باختبار الوحدة. هنا، من خلال كلمة "مقبض" أعنيك تغيير كل بناء الجملة الأساسي مثل Serial.Println إلى SYSOUT، PINMODE إلى Varaibles، Loop Void Loop إلى حين () التي تنفصل إما في KeyStock أو بعد بعض التكرار.

أعلم أن هذه هي القليل من العملية الطويلة وليس مستقيما للغاية. في تجربتي الشخصية، بمجرد أن تفعل ذلك، فإن هذا يتحول إلى أن يكون أكثر موثوقية.

-nandha_Frost.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top