C Language
Frameworks testen
Suche…
Einführung
Viele Entwickler verwenden Komponententests, um zu überprüfen, ob ihre Software wie erwartet funktioniert. Unit-Tests prüfen kleine Einheiten von größeren Software-Einheiten und stellen sicher, dass die Ausgaben den Erwartungen entsprechen. Test-Frameworks erleichtern das Testen von Einheiten, indem sie Auf- / Abbau-Services anbieten und die Tests koordinieren.
Für C stehen viele Unit-Test-Frameworks zur Verfügung. Beispielsweise ist Unity ein reines C-Framework. Häufig verwenden Leute C ++ - Testframeworks, um C-Code zu testen. Es gibt auch viele C ++ - Testframeworks.
Bemerkungen
Test Harness:
TDD - Test Driven Development:
Doppelmechanismen in C testen:
- Link-Time-Substitution
- Funktionszeigerersetzung
- Preprozessor-Ersetzung
- Kombinierte Linkzeit- und Funktionszeigerersetzung
Hinweis zu C ++ - Testframeworks, die in C verwendet werden: Die Verwendung von C ++ - Frameworks zum Testen eines C-Programms ist üblich, wie hier erläutert.
CppUTest
CppUTest ist ein xUnit -Style-Framework für Unit-Tests von C und C ++. Es ist in C ++ geschrieben und zielt auf Portabilität und Einfachheit beim Design ab. Es unterstützt die Erkennung von Speicherlecks, das Erstellen von Mocks und das Ausführen seiner Tests zusammen mit dem Google-Test. Kommt mit Hilfsskripten und Beispielprojekten für Visual Studio und Eclipse CDT.
#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>
TEST_GROUP(Foo_Group) {}
TEST(Foo_Group, Foo_TestOne) {}
/* Test runner may be provided options, such
as to enable colored output, to run only a
specific test or a group of tests, etc. This
will return the number of failed tests. */
int main(int argc, char ** argv)
{
RUN_ALL_TESTS(argc, argv);
}
Eine Testgruppe kann eine setup()
und eine teardown()
-Methode haben. Die setup
Methode wird vor jedem Test und die teardown()
-Methode danach aufgerufen. Beide sind optional und können unabhängig voneinander weggelassen werden. Andere Methoden und Variablen können auch innerhalb einer Gruppe deklariert werden und stehen allen Tests dieser Gruppe zur Verfügung.
TEST_GROUP(Foo_Group)
{
size_t data_bytes = 128;
void * data;
void setup()
{
data = malloc(data_bytes);
}
void teardown()
{
free(data);
}
void clear()
{
memset(data, 0, data_bytes);
}
}
Unity Test Framework
Unity ist ein xUnit- Test-Framework für Komponententests C. Es ist vollständig in C geschrieben und ist portabel, schnell, einfach, ausdrucksstark und erweiterbar. Es ist so konzipiert, dass es sich insbesondere für Unit-Tests für eingebettete Systeme eignet.
Ein einfacher Testfall, der den Rückgabewert einer Funktion überprüft, könnte folgendermaßen aussehen
void test_FunctionUnderTest_should_ReturnFive(void)
{
TEST_ASSERT_EQUAL_INT( 5, FunctionUnderTest() );
}
Eine vollständige Testdatei könnte folgendermaßen aussehen:
#include "unity.h"
#include "UnitUnderTest.h" /* The unit to be tested. */
void setUp (void) {} /* Is run before every test, put unit init calls here. */
void tearDown (void) {} /* Is run after every test, put unit clean-up calls here. */
void test_TheFirst(void)
{
TEST_IGNORE_MESSAGE("Hello world!"); /* Ignore this test but print a message. */
}
int main (void)
{
UNITY_BEGIN();
RUN_TEST(test_TheFirst); /* Run the test. */
return UNITY_END();
}
Unity enthält einige Beispielprojekte, Makefiles und einige Ruby-Rake-Skripts, die das Erstellen längerer Testdateien erleichtern.
CMocka
CMocka ist ein elegantes Komponententest- Framework für C mit Unterstützung für Scheinobjekte . Es benötigt nur die Standard-C-Bibliothek, arbeitet mit einer Reihe von Computerplattformen (einschließlich Embedded) und mit verschiedenen Compilern. Es enthält ein Tutorial zum Testen mit Mocks, API-Dokumentation und eine Vielzahl von Beispielen .
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
void null_test_success (void ** state) {}
void null_test_fail (void ** state)
{
assert_true (0);
}
/* These functions will be used to initialize
and clean resources up after each test run */
int setup (void ** state)
{
return 0;
}
int teardown (void ** state)
{
return 0;
}
int main (void)
{
const struct CMUnitTest tests [] =
{
cmocka_unit_test (null_test_success),
cmocka_unit_test (null_test_fail),
};
/* If setup and teardown functions are not
needed, then NULL may be passed instead */
int count_fail_tests =
cmocka_run_group_tests (tests, setup, teardown);
return count_fail_tests;
}