2008-09-29 16 views
18

Wie führen Sie Unit-Test wie Tests in C durch? Welches Framework oder machen Sie andere Tests als Unit-Tests auf Codeebene?So testen Sie C-Code

+1

http://stackoverflow.com/questions/65820/unit-testing-c-code – mmcdole

Antwort

11

Check ist eine gute Test-Framework für C

2

XCode auf Mac etwas hat sie CPTest Art eingebauter gerufen. Ich habe eine portable Version, die ich hier gepostet

http://www.loufranco.com/blog/files/AppleCppUnitPort.html

ich gcc unter Windows wurde Targeting, aber ich glaube, es würde an anderer Stelle arbeiten, und es ist ein sehr einfaches Framework, wenn Sie sehen wollen, wie so etwas zu implementieren .

0

Sie können einen Blick auf cfix werfen - es ist ein Unit-Test-Framework für Win32-Plattformen und NT-Kernel-Modus spezialisiert. Unterstützt sowohl C als auch C++.

0

Wenn Sie Windows als Entwicklungsumgebung verwenden, CUnitWin32 könnte Ihr Zweck

16

Persönlich mag ich die Google Test framework dienen.

Die eigentliche Schwierigkeit beim Testen von C-Code besteht darin, die Abhängigkeiten von externen Modulen zu trennen, sodass Sie Code in Einheiten isolieren können. Dies kann besonders problematisch sein, wenn Sie versuchen, Tests mit altem Code durchzuführen. In diesem Fall benutze ich häufig den Linker, um Stubs-Funktionen in Tests zu verwenden.

Darauf beziehen sich die Leute, wenn sie über "Nähte" sprechen. In C ist Ihre einzige Option wirklich, den Pre-Prozessor oder den Linker zu verwenden, um Ihre Abhängigkeiten zu verspotten.

Eine typische Test-Suite in eines meiner C-Projekten könnte wie folgt aussehen:

#include "myimplementationfile.c" 
#include <gtest/gtest.h> 

// Mock out external dependency on mylogger.o 
void Logger_log(...){} 

TEST(FactorialTest, Zero) { 
    EXPECT_EQ(1, Factorial(0)); 
} 

Beachten Sie, dass Sie tatsächlich mit der C-Datei und nicht die Header-Datei. Dies bietet den Vorteil des Zugriffs auf alle statischen Datenelemente. Hier verspotte ich meine Logger (die in logger.o sein könnte und eine leere Implementierung geben. Dies bedeutet, dass die Testdatei unabhängig von dem Rest der Codebasis kompiliert und verlinkt und isoliert ausgeführt wird.

kompilieren des codes, damit das funktioniert, braucht man gute einrichtungen auf dem target. ich habe das mit googeltest cross kompiliert nach linux auf einer PowerPC architecture gemacht, das ist sinnvoll, weil man dort eine vollständige shell und os hat um die ergebnisse zu sammeln Rich-Umgebungen (die ich als alles ohne ein volles Betriebssystem klassifiziere) sollten Sie nur auf dem Host erstellen und ausführen. Sie sollten dies trotzdem tun, damit Sie die Tests automatisch als Teil des Builds ausführen können.

Ich finde C++ - Testcode ist in der Regel viel einfacher aufgrund der Tatsache, dass OO-Code in ist Allgemein viel weniger gekoppelt als prozedural (das hängt natürlich sehr vom Programmierstil ab). Auch in C++ können Sie Tricks wie Dependency Injection und Method Overriding verwenden, um Nähte in Code zu bekommen, der ansonsten gekapselt ist.

Michael Feathers hat eine excellent book about testing legacy code. In einem Kapitel behandelt er Techniken zum Umgang mit Nicht-OO-Code, die ich sehr empfehle.

bearbeiten: Ich habe eine blog post über Unit-Tests prozeduralen Code, mit source available on GitHub geschrieben.