Welches Unit-Test-Framework kann ich für ein AC-basiertes MCU-Projekt verwenden?

15

Ich überlege, wie ich Unit-Tests in meinem mcu-Projekt verwenden kann und welche Frameworks ich verwenden kann, um es zu vereinfachen.

Heute benutze ich einen stm32 mit OpenOCD-jtag von einem Linux-PC, wo alles von einem klassischen Makefile aus gesteuert und mit gcc crosscompiliert wird.

Ich könnte etwas selbst erstellen, aber wenn es einen Rahmen gibt, den ich verwenden kann, wäre es schön. (Es ist ein Bonus, wenn das Framework das Ergebnis in einem Format ausgeben kann, das Jenkins / Hudson lesen kann.)

Gibt es eine Möglichkeit, ein Unit-Test-Framework mit einem stm32 zu verwenden?

Johan
quelle
3
Ich habe keine Zeit, eine vollständige Antwort zu schreiben, aber ich habe viele der Tools und Techniken verwendet, die in diesen Artikeln und in dieser Blogserie zu finden sind . Mit einem Wort: CMock!
Kevin Vermeer

Antworten:

4

Schauen Sie sich CppUTest und James Grennings ausgezeichnete http://pragprog.com/book/jgade/test-driven-development-for-embedded-c an

CppUTest unterstützt C und C ++, und es hat einen schönen Satz von Makefile-Vorlagen, mit denen ich ziemlich schnell angefangen habe.

Blalor
quelle
Kaufte eine ePub-Version, mal sehen, ob es gut ist :)
Johan
Das Buch ist gut, aber ich denke, dass die Einheit (der andere Rahmen in diesem Buch) meinem Bedürfnis besser entsprechen wird.
Johan
Akzeptiert, da das Buch mich in die richtige Richtung gelenkt hat.
Johan
5

Es gibt viele Variablen, die das beste Unit-Testing-Framework für Ihre Situation bestimmen. Einige Punkte, die Ihre Wahl beeinflussen können, sind:

  • Die Zielsprache.
  • Welche Bibliotheksunterstützung ist verfügbar? zB libc oder eine gekürzte Version davon.
  • Das Betriebssystem des Ziels. zB None, FreeRTOS, custom.

Die meisten xUnit-Frameworks bieten eine Basisfunktionalität, die nützlich sein kann. Ich habe Cunit in der Vergangenheit mit einigem Erfolg verwendet. (libcunit1-dev-Paket unter Ubuntu / Debian). Für die meisten Frameworks muss libc verfügbar sein, für einige ist zusätzliche Unterstützung für das Betriebssystem erforderlich.

Eine weitere Alternative, die nur 3 Zeilen lang ist, ist Minunit .

Ich habe festgestellt, dass Unit-Tests mit dem Mikrocontroller als Ziel ziemlich umständlich sind, da Sie in der Lage sein müssen, eine Umgebung zu präsentieren, in der Sie Tests herunterladen, ausführen und dann die Ergebnisse zurückholen können. Es ist schon eine große Aufgabe, die Plattform zu installieren, mit der Sie dies tun können.

Ein weiterer Ansatz, den ich gewählt habe, ist das Testen von Einheiten auf dem Host, wobei eine Abstraktionsschicht zwischen den Treibern und dem Anwendungscode implementiert wird. Da Sie gcc als Ziel verwenden, sollte der Code auch auf dem Host kompiliert werden.

Das Testen auf dem Compile-Host ist im Allgemeinen so viel einfacher, da Sie die vollständige Unterstützung des Host-Betriebssystems und aller seiner Tools haben. Wenn ich zum Beispiel auf dem Host teste, habe ich eine verspottete Version meines drahtlosen Treibers mit der gleichen Schnittstelle wie der echte Treiber, der auf dem Ziel ausgeführt wird. Die Host-Version verwendet UDP-Pakete, um die drahtlose Paketübertragung zu simulieren. Der Mock-Treiber unterstützt die Möglichkeit, Pakete zu verwerfen, damit ich meine Protokolle testen kann.

In dem Produkt, an dem ich gearbeitet habe, wurde ein Betriebssystem mit Threads verwendet, sodass die Abstraktionsebene zum Testen auf dem Host-Betriebssystem stattdessen Pthreads verwendete.

Obwohl dies nicht perfekt ist, ist es umso wahrscheinlicher, dass Sie mehr Testfälle implementieren, je einfacher Sie Tests schreiben und ausführen. Ein weiterer Vorteil der Ausführung des Codes auf verschiedenen Plattformen besteht darin, dass getestet wird, ob der Code portabel ist. Sie werden Endian-Fehler schnell erkennen, wenn sich Ziel- und Host-Architektur unterscheiden.

Ich bin jetzt ein bisschen vom Thema abwesend, aber ich bin der Meinung, dass diese Ideen bei der Auswahl des Testgerüsts und der Testmethoden hilfreich sein können.

Austin Phillips
quelle
Ich habe gelöst, wie ich Code auf das Ziel bekomme und ich kann gdb im Skriptmodus verwenden, um an verschiedenen Haltepunkten wie test_ok oder test_fail ( fun-tech.se/stm32/TestSuite/index.php ) anzuhalten . Ich bin also auf halbem Weg. Dies ist eher eine Frage, wie man die verschiedenen "Tests" erstellt. Meine heutigen Ideen sind ein bisschen zu unflexibel, deshalb habe ich angefangen, nach einem Rahmen zu suchen.
Johan
1

Überprüfen Sie embUnit http://embunit.sourceforge.net/embunit/index.html . Es ist ein eingebettetes C-Unit-Test-Framework mit geringem Platzbedarf.

Wir haben es erfolgreich in einigen Embedded-Mikrocontroller-Projekten eingesetzt. Erwarten Sie nicht die Optionen und Funktionen, die Sie mit einem Desktop-Unit-Test-Framework erhalten. Aber es ist definitiv mächtig genug.

Es wurden viele Asserts für Sie definiert, sodass Sie nicht viel Zeit verlieren müssen, benutzerdefinierte Asserts wie mit minUnit zu schreiben.

sillevl
quelle
1

Vor einiger Zeit habe ich ein ausführliches Tutorial zum Thema geschrieben: Unit-Testing (eingebettete) C-Anwendungen mit Ceedling ; Ich verwende diese Techniken in einer Reihe von Projekten und bin bis jetzt ziemlich glücklich.

Dmitry Frank
quelle
2
Dies ist eine Nur-Link-Antwort und wird als solche wertlos, wenn sich die URL ändert oder der Link ausfällt. Sie sollten die relevanten Informationen in der Antwort erläutern , dann können Sie den Link als Referenz hinzufügen.
Pipe
2
@pipe Ja, aber die Frage (Produktempfehlung im Wesentlichen) bittet um Antworten wie diese.
Dmitry Grigoryev
-1

Versuchen Sie es mit Lint, aber ich glaube nicht, dass es für Unit-Tests oder zur Code-Analyse gedacht ist.

LEMUEL ADANE
quelle
2
Die statische Code-Analyse kann nicht dazu beitragen, den Code auszuführen und zu testen, so dass er nicht wirklich hilfreich ist.
Johan
1
Vielleicht nicht hilfreich im Zusammenhang mit Unit-Tests, aber jeder sollte eine Art statisches Analysewerkzeug verwenden.
Tim