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
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
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.
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
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 ).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.