Wie kann Arduino-Quellcode automatisch getestet werden (kontinuierliche Integration)?

16

Ich möchte meinen Arduino-Quellcode (Projekte und Bibliotheken) unter Versionskontrolle mit kontinuierlichen Tests verwalten. Wie kann ich den Code mit Continuous Integration Tools automatisch kompilieren, um sicherzustellen, dass jede Version sauber kompiliert wird? Im besten Fall sollte es möglich sein, Builds für mehrere Prozessoren zu konfigurieren, optional Komponententests durchzuführen und die maximale Binärgröße zu ermitteln.

Jakob
quelle
Anders als durch Ino und avr-size?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Ich habe nichts dagegen, welche Tools ich verwenden soll, aber es sollte automatisch auf einem Cloud-Hosting- oder Continuous-Integration-Service ausgeführt werden.
Jakob
1
Binäre Größe zu kompilieren ist nicht so schwierig, aber um Unit-Tests durchzuführen, müsste der Code so strukturiert werden, dass er Unit-testbar ist. Dies ist schwierig genug, wenn Sie die Größe klein halten möchten. Außerdem müssen Sie diese Tests auf einem Chip oder in einem Emulator ausführen, um einen Test zu erhalten, der mehr oder weniger zuverlässig ist.
GolezTrol
Ich habe github.com/kyab/travis-test-arduino gefunden, aber es ist experimentell und eine umfassende Antwort / Anleitung als Antwort wäre besser.
Jakob
3
Das Problem dabei ist, dass es dem ursprünglichen Zweck der kontinuierlichen Integration zuwiderläuft: Es soll Änderungen vorantreiben und diese dann innerhalb von Minuten automatisch erstellen und bereitstellen. Auf diese Weise können Ihre Kunden die neuesten Funktionen und Fehlerbehebungen erhalten, anstatt alle zwei Monate. Für Arduino ist es nur "Cloud, die sicherstellt, dass sie erstellt". Für Unit-Tests müssen Sie möglicherweise die Arduino-Bibliotheken umgehen, um Funktionen zu erstellen und Beispieldaten über die "Pins" zu senden.
Anonym Pinguin

Antworten:

6

Die neueste Version von Arduino ide verfügt über eine Befehlszeilenschnittstelle zum Erstellen und Hochladen von Code. Aber Sie können es natürlich durch makefile und avrdude tun. Jetzt haben Sie Ihren Code kompiliert, aber Sie müssen testen. Da Simulatoren komplex, unvollständig, umfangreich und ... sind. Nur eine Simulation, und da die Chips relativ billig sind, macht der Bau einer Platine die HW-Interaktion UND die Überprüfung der Ergebnisse zum schnellsten und einfachsten Weg. Auf dieses "spezielle" Board können Sie so etwas wie einen Interpreter hochladen, der einen Test vom PC ausführt, ähnlich wie firmata für Arduino. Zumindest würde ich es so bauen. Und soweit ich weiß, gibt es keine bekannten Umsetzungen dafür, auch wenn ich mir ziemlich sicher bin, dass viele Branchen das sollten und wahrscheinlich auch tun.

Lesto
quelle
4

Als Schöpfer von PlatformIO würde ich Ihnen empfehlen, sich damit zu befassen. Es ist ein plattformübergreifender Code Builder und ein fehlender Bibliotheksmanager. Es kann den gleichen Code für die vielen gängigen Embedded-Entwicklungsplattformen und -Boards erstellen.

PlatformIO kann mit vielen gängigen Continuous Integration (CI) -Systemen (oder Ihren eigenen) integriert werden. Siehe Dokumentation mit Beispielen .

Schauen wir uns die .travis.ymlKonfiguration / Vorlage für Travis CI an:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=path/to/source/file.c
    - PLATFORMIO_CI_SRC=path/to/source/file.ino
    - PLATFORMIO_CI_SRC=path/to/source/directory

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

script:
    - platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N

Beispiel

Integration für das USB_Host_Shield_2.0Projekt. Die .travis.ymlKonfigurationsdatei:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=examples/acm/acm_terminal
    - PLATFORMIO_CI_SRC=examples/Bluetooth/WiiIRCamera PLATFORMIO_BUILD_FLAGS="-DWIICAMERA"
    - PLATFORMIO_CI_SRC=examples/ftdi/USBFTDILoopback
    - PLATFORMIO_CI_SRC=examples/Xbox/XBOXUSB
    # - ...

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

    # Libraries from PlatformIO Library Registry
    # http://platformio.org/#!/lib/show/416/TinyGPS
    # http://platformio.org/#!/lib/show/417/SPI4Teensy3
    - platformio lib install 416 417

script:
    - platformio ci --board=uno --board=teensy31 --board=due --lib="."
ikravets
quelle
3
Wenn Sie mit PlatformIO verbunden oder verbunden sind, sollten Sie dies in Ihrer Antwort offenlegen, da dies sonst als Spam gekennzeichnet und entfernt werden kann. Vielen Dank!
Nick Gammon
3

Ein Beispiel für die Einrichtung von Jenkins Continuous Integration für das Arduino-Projekt finden Sie hier: Continuous Integration für eingebettete Systeme

Das Beispiel zeigt, wie Sie ein Image erstellen und auf Arduino hochladen und Selenium-Web-Tests ausführen (das zu testende System ist ein Arduino-basierter Web-Server).

Jperala
quelle
schön, weil es eine vorhandene Software verwendet, die reich an Funktionen ist. aber es scheint nur Web-Tests zu machen; Kannst du bitte die Antwort erweitern? auch linkbasierte antworten sind schlecht.
Lesto
3

Ich habe diesen Test unittest Framework für Arduino geschrieben, da ich kein passendes existierendes finden konnte. Obwohl ich es nicht für CI geschrieben habe, wäre es gut für CI-Jobs geeignet, da es keine Hardware erfordert, aber auf dem PC ausgeführt werden kann.

Das Ausführen der CI-Jobs ohne Hardware hat gute und schlechte Seiten, gute Seiten sind das auch

  • Kein Flashen, keine Hardware erforderlich -> kann parallel ausgeführt werden -> schnell, um beispielsweise bei jedem Commit zu prüfen
  • Keine Hardwareprobleme, die die Tests beeinflussen -> Keine Sorge, dieser Test ist fehlgeschlagen, da meine XYZ-Hardwarekomponente nicht stabil ist

Auf der anderen Seite gibt es:

  • Der eigentliche Zielcode wird nicht getestet, zum Beispiel ist Ihr 'int' 32 Bit in Ihrem PC und 16 Bit in AVR.
susundberg
quelle
" Ihr 'int' ist 64 Bit in Ihrem PC ": Sie meinen wahrscheinlich "32 Bit", oder Sie verwenden ein exotisches Betriebssystem.
Edgar Bonet
Sie haben natürlich Recht, danke. Ich habe meine Antwort bearbeitet, um das zu korrigieren.
susundberg
Beachten Sie, dass Sie einen In-Home-CI-Server mit einem billigen PC wie einer Himbeere einrichten können, der an eine HW-Platine angeschlossen ist, sodass ein Teil der CI-Infrastruktur auf echter HW ausgeführt wird (wobei möglicherweise das Standard-Cloud-CI für alle Software beibehalten wird )
Lesto
3

Ich habe gerade eine anständige Beschreibung als Antwort auf diese verwandte Frage zu einem Arduino CI / Unit-Test-Framework zusammengestellt, das ich geschrieben habe und das endlich ausgereift genug ist, um öffentlich darüber zu sprechen.

Der arduino_ciRuby Gem unterstützt sowohl lokale Tests als auch die Travis CI-Integration (z. B. diesen Build-Job für die Adafruit FONA-Bibliothek ).

Einige Beispiele für die Integration:

Ich habe ein Problem für das Melden der Skizzengröße erstellt, aber es wurden noch keine Arbeiten daran durchgeführt. Es ist auch möglich, dass ich die Builds eines Tages parallelisieren könnte, aber im Moment bin ich mir nicht genau sicher, wie ich das machen würde. Derzeit ist das Herunterladen der Arduino IDE der zeitaufwändigste Schritt bei der Erstellung von Travis CI ... Paralleltests wirken sich kaum negativ aus, wenn jeder Job diesen Schritt ausführen muss.

Ian
quelle
1

Ich würde empfehlen, das arduino Eclipse-Plugin namens sloeber sloeber.io zu verwenden, dessen Projektleiter ich bin.
Es lässt sich in die Versionskontrolle integrieren und auf mehreren Plattformen aufbauen, da es mehrere Konfigurationen unterstützt.
Obwohl es noch nicht idiotensicher ist, habe ich mit Unit-Tests von Arduino-Code auf dem lokalen PC mit dem Google Test Framework dokumentiert und demonstriert.
Hier ist ein Link zu einem Blog mit einer Präsentation, wie Sie dies tun können. http://blog.baeyens.it/#post25

jantje
quelle