Forum: Mikrocontroller und Digitale Elektronik Unit Test für C Code


von Markus (Gast)


Lesenswert?

Hallo Forum,

ich habe mich in der letzten Zeit mit Unit Tests beschäftigt und nutze 
nun Unity für das Testen von C Code. Als Compiler wird der gcc verwendet 
und ich teste auf dem PC. Die Software ist allerdings für ein 
Steuergerät und in Zukunft möchte ich auch mal versuchen, die Tests auf 
der Zielhardware laufen zu lassen.
Soweit bin ich auch recht zufrieden mit Unity, da es sich recht 
problemlos einbinden lies. Nur habe ich nun Probleme mit CMock um Stubs 
und Mocks zu generieren. Dort habe ich Probleme mit den Ruby Skripten 
und ich das Einbinden finde ich nicht als so ganz intuitiv.

Daher mal die Frage in die Runde: Welche Tools nutzt ihr den für Unit 
Test von C Code?

Gruß Markus

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo Markus,

ich nutze C nur sehr selten. Aber eigentlich müsstest Du doch alle 
Werkzeuge nutzen können, die man auch unter C++ verwenden kann. Den zu 
testenden Code, entweder mit einem C Compiler übersetzen und die zu 
testenden Funktionen dann in einem Header exportieren, der "C++ aware" 
ist, oder auch den C Code mit einem C++ Compiler übersetzen.

Ich verwende da Boost.Test und Catch.

mfg Torsten

von Michael B. (laberkopp)


Lesenswert?

Markus schrieb:
> Unity

Unity ist doch speziell für embnedded

http://www.throwtheswitch.org/unity/

Aber ich halte von diesen Sammlungen wenig. Unit für für mich kein 
Hauptprogramm, sondern eine C-Datei ohne main. Ich schreibe in diese 
C-Datei trotzdem ein main zwischen #ifdef TEST das Testfälle aufbaut und 
ablaufen lässt. Kompiliert man die Unit (diese Quelltextdatei mit ihren 
Abhängigkeiten) mit -D TEST, wird ein Hauptprogramm draus, daß über 
stderr (oder welchen Fehlerkanal auch immer) eventuelles Gemecker 
ausgibt und einen fail/pass return-code. Diese Testprogramme werden im 
automatischen build (Batch, Jenkins, woauchimmer) gebaut und laufen 
gelassen.

von Markus (Gast)


Lesenswert?

Torsten R. schrieb:
> Ich verwende da Boost.Test und Catch.

Danke, werde ich mir mal anschauen.

Michael B. schrieb:
> Aber ich halte von diesen Sammlungen wenig. Unit für für mich kein
> Hauptprogramm, sondern eine C-Datei ohne main.

Von der Sache her machen solche Frameworks ja nichts anderes, so 
verstehe ich das bisher.
Ich hab meine main, die auf der Zielahardware läuft und eine zweite 
main, die beim Unit Test läuft. Umgeschaltet wird halt per 
Compileswitch.
Ich dachte mir auch schon was eigenes für Unit Tests zu schreiben, aber 
da es ja schon einige Tools gibt, wollte ich mir diese Arbeit sparen.

Michael B. schrieb:
> Diese Testprogramme werden im
> automatischen build (Batch, Jenkins, woauchimmer) gebaut und laufen
> gelassen.

Da ist auch mein Ziel. Ich will den aktuellen Softwarestand in die 
Versionsverwaltung laden und dann werden automatisch die Tests 
ausgeführt und wenn alle erfolgreich sind, dann wird das Release für die 
Zielhardware erstellt. Zwar dauert der Buildprozess nur gute 25 
Sekunden, aber so habe ich einen automatisierten Ablauf

von Markus (Gast)


Lesenswert?

Hallo,

ich habe mir mal Boost und auch andere C++ Unit Tests angeschaut. Die 
bringen ja alle sehr viel Ballast an Funktionen mit, die ich für meinen 
C Code gar nicht nutzen kann. Daher fand ich Unity prima, da es speziell 
für C bzw sogar für Tests auf der Zielhardwate gedacht ist.
Der Vorteil von Boost und anderen ist, dass sie durch Jenkins 
unterstützt werden ( xUnit Plugin ).

von Jack (Gast)


Lesenswert?

Markus schrieb:
> Nur habe ich nun Probleme mit CMock um Stubs
> und Mocks zu generieren. Dort habe ich Probleme mit den Ruby Skripten
> und ich das Einbinden finde ich nicht als so ganz intuitiv.

Die Einbindung von Generatoren, ob für Stubs oder anderweitig, erfolgt 
bei mir selbstverständlich im Makefile.

Der Generator-Output ist ein Target im Makefile, der zu testende Code 
ein oder mehrere Prerequisites. Das Testprogramm selber hat den 
Generator-Output als Prerequisite. Dazu die üblichen make-Dekorationen 
wie clean:, depend:, etc.

> Daher mal die Frage in die Runde: Welche Tools nutzt ihr den für Unit
> Test von C Code?

Ein Framework für Unit-Testing und make.

Im einfachsten Fall, wenn es wirklich eng wird auf dem Zielsystem, 
beginne ich mit minunit.h - dem kleinsten Unit-Testing Framework das ich 
kenne. Hier ist der komplette Sourcecode:

http://www.jera.com/techinfo/jtns/jtn002.html:
1
/* file: minunit.h */
2
#define mu_assert(message, test) do { if (!(test)) return message; } \
3
                                while (0)
4
#define mu_run_test(test) do { char *message = test(); tests_run++; \
5
                                if (message) return message; } while (0)
6
extern int tests_run;
Da das natürlich nicht reicht werden, je nach aktuellem Bedarf, 
schrittweise  weitere Macros eingeführt. Soweit es eben auf dem 
Zielsystem geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.