Frage

Ich möchte meinen Arduino-Code einem Unit-Test unterziehen können.Im Idealfall könnte ich alle Tests durchführen, ohne den Code auf den Arduino hochladen zu müssen.Welche Tools oder Bibliotheken können mir dabei helfen?

Da ist ein Arduino-Emulator in Entwicklung Das könnte nützlich sein, aber es scheint noch nicht einsatzbereit zu sein.

AVR Studio von Atmel enthält einen Chip-Simulator, der nützlich sein könnte, aber ich kann mir nicht vorstellen, wie ich ihn in Verbindung mit der Arduino IDE verwenden würde.

War es hilfreich?

Lösung 2

In Ermangelung eines bereits bestehenden Unit-Test-Frameworks für Arduino, habe ich erstellt ArduinoUnit . Hier ist eine einfache Arduino Skizze seine Verwendung demonstriert:

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

Andere Tipps

Sie nicht Unit-Tests auf dem Gerät Arduino laufen oder Emulator

Der Fall gegen Mikrocontroller Gerät / Emulator / Sim-basierte Tests

  

Es gibt viele Diskussionen über das, was Unit-Test Mittel und ich bin nicht   wirklich versucht, ein Argument, das hier zu machen. Dieser Beitrag ist nicht   sagen Sie alle Praxistest auf Ihre ultimative Ziel zu vermeiden   Hardware. Ich versuche, einen Punkt zu machen über die Optimierung Ihrer   Entwicklung Feedback-Zyklus, indem Sie Ihre Zielhardware Beseitigung von   Ihre banalsten und häufige Tests. Die Prüflingen werden angenommen   viel kleiner als das gesamte Projekt sein.

Der Zweck der Unit-Tests ist es, die Qualität Ihres eigenen Code zu testen. Unit-Tests sollten in der Regel nie die Funktionalität von Faktoren testen außerhalb Ihrer Kontrolle.

Sie es so denken: Auch wenn Sie Funktionalität der Arduino Bibliothek testen waren, die Mikrocontroller-Hardware oder einem Emulator ist es absolut unmöglich für solche Testergebnisse, Ihnen zu sagen, etwas über die Qualität der eigenen Arbeit. Daher ist es viel wertvolles und effizientes Unit-Tests zu schreiben, die auf dem Zielgerät (oder Emulator) nicht ausgeführt werden.

Häufiges Testen auf Ihrer Ziel-Hardware einen quälend langsam Zyklus:

  1. Tweak Code
  2. Übersetzen und laden Gerät Arduino
  3. Beachten Sie Verhalten und erraten, ob Ihre Code tut, was Sie erwarten
  4. Wiederholen

Schritt 3 ist besonders böse, wenn Sie Diagnosemeldungen über die serielle Schnittstelle erhalten erwarten aber Ihr Projekt muss sich Ihre Arduino nur Hardware serielle Schnittstelle verwenden. Wenn Sie dachten, dass die SoftwareSerial Bibliothek könnte helfen, sollten Sie wissen, dass dies wahrscheinlich jede Funktionalität stören, die sich wie zu erzeugen andere Signale zur gleichen Zeit ein genaues Timing erfordert. Dieses Problem ist mir passiert ist.

Auch wenn Sie sind die Skizze zu testen, einen Emulator und Ihre zeitkritischen Routinen liefen perfekt, bis Sie auf den tatsächlichen Arduino hochgeladen, dann ist die einzige Lektion, die Sie lernen werden, ist, dass der Emulator fehlerhaft ist - und dies zu wissen, noch offenbart nichts über die Qualität von Ihre eigenen Arbeit.

Wenn es dumm ist auf dem Gerät oder Emulator zu testen, was sollte ich tun?

Sie verwenden wahrscheinlich einen Computer auf dem Arduino-Projekt zu arbeiten. Dieser Computer ist um Größenordnungen schneller als der Mikrocontroller. Schreiben Sie die Tests zu bauen und laufen auf Ihrem Computer .

Denken Sie daran, soll das Verhalten der Arduino Bibliothek und Mikrocontroller angenommen entweder richtig oder zumindest konsequent falsch sein.

Wenn Sie Ihre Tests Ausgang entgegen Ihren Erwartungen erzeugen, dann haben Sie wahrscheinlich einen Fehler im Code, die getestet wurde. Wenn Ihr Testausgang Ihren Vorstellungen entspricht, aber das Programm verhält sich nicht korrekt, wenn Sie es mit dem Arduino laden, dann wissen Sie, dass Ihre Tests auf falschen Annahmen beruhten, und Sie haben wahrscheinlich eine fehlerhafte Prüfung. In jedem Fall haben Sie echte Einsichten auf, was die nächsten Code-Änderungen gegeben worden sein sollten. Die Qualität des Feedback wird von einem verbesserten " etwas ist gebrochen" auf "this spezifischen Code ist gebrochen" .

Wie Erstellen und Ausführen Tests auf Ihrem PC

Das erste, was Sie tun müssen, ist identifizieren Ihre Testziele . Denken Sie darüber nach, welche Teile von Ihre eigenen Code Sie wollen testen, und dann stellen Sie sicher, dass Ihr Programm so konstruieren, die Sie isolieren einzelne Teile für den Test.

Wenn die Teile, die Sie Arduino Funktionen aufrufen testen möchten, müssen Sie Mock-up Ersatz in Ihrem Testprogramm zur Verfügung zu stellen. Dies ist viel weniger Arbeit als es scheint. Ihre Mock-ups haben nicht wirklich etwas zu tun, aber die Bereitstellung vorhersehbare Ein- und Ausgang für Ihre Tests.

Jede Ihrer eigenen Code, den Sie Bedürfnisse testen möchten. Keine Sorge, wird die Skizze kompiliert noch einmal mit einigen Quellcode außerhalb der Skizze. Wenn Sie wirklich, um es nach unten, etwas mehr als normalen Eintrittspunkt des Programms soll in der Skizze-Datei definiert werden.

Alles, was bleibt, ist die tatsächlichen Tests zu schreiben und kompilieren es dann Ihre Lieblings C ++ Compiler! Dies ist wahrscheinlich am besten mit einem Beispiel aus der Praxis dargestellt.

Ein tatsächliches Arbeits Beispiel

Einer meiner Lieblingsprojekte gefunden hier einige einfache Tests hat, die auf dem PC laufen. Für diese Antwort Unterwerfung, gehe ich nur darüber, wie ich verspottet-up einige Arduino Library-Funktionen und die Tests, die ich diese Attrappen zu testen schrieb. Dies steht nicht im Widerspruch zu dem, was ich vorhin gesagt habe etwa nicht anderer Leute Code zu testen, weil ich derjenige war, der die Attrappen schrieb. Ich wollte sehr sicher sein, dass meine Attrappen korrekt waren.

Quelle von mock_arduino.cpp, die Code enthält, der eine gewisse Unterstützung Funktionalität der Arduino Bibliothek zur Verfügung gestellt Duplikate:

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

Ich benutze die folgenden Mock-up lesbare Ausgabe zu erzeugen, wenn mein Code binäre Daten an das Hardware-Serien Gerät schreibt.

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;

und schließlich das eigentliche Testprogramm:

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

Dieser Beitrag ist lang genug, so finden Sie auf mein Projekt auf GitHub einige weitere Testfälle zu sehen in Aktion. Ich halte meine Werke in progress in Filialen andere als Master, so überprüfen Sie diese Zweige für zusätzliche Tests auch.

Ich entschied ich für meine eigenen leichten Testroutinen zu schreiben, aber robustes Unit-Test-Frameworks wie CppUnit ist ebenfalls erhältlich.

Ich habe beachtliche Erfolg Einheit meinen PIC-Code zu testen, indem Sie den Zugriff auf der Hardware abstrahiert und es in meinen Tests spöttisch.

Zum Beispiel habe ich abstrakt PORTA mit

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

Dann kann SetPortA leicht spotten, ohne Overhead-Code in der PIC-Version hinzugefügt wird.

Sobald der Hardware-Abstraktions hat eine Weile getestet finde ich bald, dass im Allgemeinen Code geht aus dem Prüfstand den PIC und arbeitet erstmals.

Update:

I verwende eine #include Naht für den Einheitencode, den Gerätecode in einem C ++ Datei für den Prüfstand #including und eine C-Datei für den Zielcode.

Als Beispiel möchte ich vier 7-Segment-Anzeigen multiplexen, einen Port der Segmente und eine zweite Auswahl der Anzeigetreiber. Die Anzeigecode-Schnittstellen mit der Displays über SetSegmentData(char) und SetDisplay(char). Ich kann diese in meinem C ++ Prüfstand verspotten und prüfen Sie, dass ich die Daten erhalte ich erwarten. Für das Ziel ich #define so, dass ich eine direkte Zuordnung ohne den Overhead eines Funktionsaufruf erhalte

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

Es scheint, dass emulino würde perfekt die Arbeit machen.

  

Emulino ist ein Emulator für die Arduino-Plattform von Greg Hewgill. ( Quelle )

GitHub-Repository

simavr ist ein AVR Simulator mit avr-gcc.

Es unterstützt bereits einige ATTiny und ATMega Mikrocontroller und - nach Ansicht des Autors - es ist einfach etwas mehr

hinzuzufügen.

In den Beispielen liegt simduino, ein Arduino-Emulator. Es unterstützt den Arduino Bootloader ausgeführt und kann mit avrdude durch Socat programmiert werden (ein modifiziertes Netcat ).

Sie können Komponententest in Python mit meinem Projekt, PySimAVR . Arscons für Gebäude verwendet und simavr für die Simulation.

Beispiel:

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'

Test starten:

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

Ich bin nicht bekannt, dass die Plattform Arduino Code testen können.

Es gibt jedoch die Fritzing -Plattform, die die Hardware verwenden kann, modellieren und später auf den Export PCB Diagramme und so.

Es lohnt.

Wir sind mit Arduino-Boards für die Datenerfassung in einem großen wissenschaftlichen Experiment. Anschließend müssen wir mehr Arduino-Boards mit unterschiedlichen Implementierungen unterstützen. Ich schrieb Python Dienstprogramme dynamisch Arduino hex Bilder während der Unit-Tests zu laden. Der Code auf dem Link gefunden unten unterstützt Windows und Mac OS X über eine Konfigurationsdatei. Um herauszufinden, wo Ihre Hex-Bilder von der Arduino IDE platziert sind, drücken Sie die Shift-Taste, bevor Sie die Build-Taste (Wiedergabe) getroffen. Drücken Sie die Shift-Taste während Upload treffen, um herauszufinden, wo Ihre avrdude (Befehlszeile Upload Utility) auf Ihrem System / Version von Arduino befindet. Alternativ können Sie auf den im Lieferumfang enthaltenen Konfigurationsdateien suchen und verwenden Sie Ihr Installationsverzeichnis (aktuell Arduino 0020).

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

Dieses Programm ermöglicht automatischen Lauf mehrerer Arduino Unit-Tests. Der Testprozess ist auf dem PC gestartet, aber die Tests auf der tatsächlichen Arduino-Hardware laufen. Ein Satz von Komponententests wird typischerweise verwendet, um eine Arduino Bibliothek zu testen. (This

Arduino Forum: http://arduino.cc/forum/index.php?topic = 140.027,0

GitHub Projekt Seite: http://jeroendoggen.github.com/Arduino-TestSuite

Seite im Python-Package-Index: http://pypi.python.org/pypi/arduino_testsuite

Die Unit-Tests sind mit dem "Arduino Unit Testing Library" geschrieben: http://code.google. com / p / arduinounit

Die folgenden Schritte sind für jeden Satz von Unit-Tests durchgeführt werden:

  • Lesen Sie die Konfigurationsdatei, um herauszufinden, was zu laufen Tests
  • Das Skript erstellt und lädt eine Arduino Skizze, die den Unit-Test-Code enthält.
  • Die Unit-Tests auf der Arduino-Board ausgeführt werden.
  • Die Ergebnisse des Tests werden über die serielle Schnittstelle gedruckt und durch den Python-Skript analysiert.
  • Das Skript startet den nächsten Test, die oben genannten Schritte für alle Test wiederholen, die in der Konfigurationsdatei angefordert werden.
  • Das Skript druckt eine Zusammenfassung einen Überblick über alle ausgefallenen / bestandenen Tests im gesamten Testsuite zeigt.

Halten Sie hardwarespezifischen Code vom Rest getrennt oder abstrahiert, damit Sie diesen größeren „Rest“ auf jeder Plattform testen und debuggen können, für die Sie über gute Tools verfügen und mit der Sie am besten vertraut sind.

Versuchen Sie grundsätzlich, einen möglichst großen Teil des endgültigen Codes aus möglichst vielen funktionierenden Bausteinen zu erstellen.Die restlichen hardwarespezifischen Arbeiten werden dann deutlich einfacher und schneller von der Hand gehen.Sie können es abschließen, indem Sie vorhandene Emulatoren und/oder eigene Emulationsgeräte verwenden.Und dann müssen Sie natürlich das Original irgendwie testen.Abhängig von den Umständen kann dies sehr gut automatisierbar sein oder auch nicht (d. h.Wer oder was drückt Knöpfe und liefert andere Eingaben?Wer oder was wird verschiedene Indikatoren und Ergebnisse beobachten und interpretieren?).

James W. Grenning schreibt große Bücher und dieser ist über Testeinheit C-Code eingebettet Test Driven Development für Embedded C .

Ich bin mit Searduino wenn Arduino Code zu schreiben. Searduino ist ein Arduino-Simulator und eine Entwicklungsumgebung (Makefiles, C-Code ...), die es einfach macht, in C / C ++ hacken Ihre Lieblingseditor. Sie können Arduino Skizzen importieren und sie im Simulator ausgeführt werden.

Bildschirmfoto von Searduino 0,8: http: // searduino. files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9 wird freigegeben und ein Video wird so bald aufgenommen werden, da die Dauer-Tests durchgeführt werden .... in einem oder zwei Tagen.

Test auf dem Simulator nicht als echte Tests in Betracht gezogen werden, aber es hat mir sicherlich geholfen, eine Menge bei der Suche dumm / logische Fehler (zu vergessen pinMode(xx, OUTPUT), etc zu tun.).

BTW: Ich bin einer der Menschen, die Entwicklung Searduino

.

Ich baute arduino_ci für diesen Zweck. Obwohl es zu testen Arduino-Bibliotheken (und nicht die Standalone-Skizzen) begrenzt ist, ermöglicht es Unit-Tests entweder lokal oder auf einem CI-System ausgeführt werden (wie Travis CI oder Appveyor).

Betrachten wir eine sehr einfache Bibliothek in Ihrem Arduino Bibliothek Verzeichnis namens DoSomething, mit do-something.cpp:

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

int doSomething(void) {
  return 4;
};

Sie würden Einheit testen Sie es wie folgt (mit einer Testdatei namens test/is_four.cpp oder so):

#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.

Das ist alles. Wenn das assertEqual Syntax und Teststruktur vertraut aussieht, ist es, weil ich einige Matthew Murdoch ArduinoUnit Bibliothek angenommen  dass er in seine Antwort .

Siehe Reference.md für weitere Informationen über Unit-Tests I / O-Pins, die Uhr, serielle Schnittstellen, etc.

Diese Unit-Tests zusammengestellt und führen Sie ein Skript in einem Rubin Edelstein enthalten. Beispiele, wie das zum Einrichten finden Sie in der README.md oder nur von einem dieser Beispiele kopieren:

Es gibt ein Projekt namens nK , die für Arduino nativen Kern zur Verfügung stellt. Und können Sie Tests für Arduino Code schreiben.

Aus der Projektbeschreibung

  

Der native Kern ermöglicht es Ihnen, Arduino Skizzen auf die kompilieren und ausführen   PC, in der Regel ohne Änderung. Es bietet native Versionen   Arduino Standard-Funktionen und ein Befehlszeilen interepreter zu geben   Eingaben in der Skizze, die von der Hardware normalerweise kommen würde   selbst.

Auch auf der "was muss ich verwenden es“Abschnitt

  

Wenn Sie die Tests aufbauen wollen, müssen Sie CxxTest aus    http://cxxtest.tigris.org . NCORE hat mit CxxTest 3.10.1 getestet.

Wenn Sie Unit-Test-Code außerhalb MCU möchten (auf dem Desktop) Besuche libcheck: https://libcheck.github.io/check/

Ich habe es meine eigenen Embedded-Code paar Male zu testen. Es ist ziemlich robuster Rahmen.

Sie können mit emulare - Sie einen Mikrocontroller auf ein Diagramm ziehen können und Ihr Code in Eclipse ausgeführt werden. Die Dokumentation auf der Website erfahren Sie, wie es eingerichtet werden.

Mit Proteus VSM mit einem Arduino Bibliothek Code zu debuggen oder es zu testen.

Es ist eine bewährte Methode, bevor Sie Ihren Code an Bord bekommen, aber sicher sein, mit Timings, da die Simulation nicht in Echtzeit läuft, wie sie auf dem Brett ausgeführt werden.

Versuchen Sie Autodesk Schaltungssimulator . Es ermöglicht Arduino Code und Schaltungen mit vielen anderen Hardware-Komponenten zu testen.

In dem Grunde Arduino ist mit C und C ++ geschrieben, auch Bibliotheken von Arduino geschrieben in C und C ++. Also, in einfachen Worten behandeln nur den Code wie C und C ++ und versucht, die Unit-Tests zu tun. Hier wird durch das Wort „handle“ Ich meine, Sie alle die grundlegende Syntax wie Serial.println ändern pinMode zu varaibles, Leere Schleife while () Schleife nach SYSOUT, die entweder in keystock oder nach einer Iteration bricht.

Ich weiß, das wenig ein langer Prozess ist und nicht so gerade forward.On meine persönliche Erfahrung, wenn Sie mit ihm zu tun bekommen, diese dann auch zuverlässiger sein.

-Nandha_Frost

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top