C Language
Kaders testen
Zoeken…
Invoering
Veel ontwikkelaars gebruiken unit-tests om te controleren of hun software werkt zoals verwacht. Eenheidstests controleren kleine eenheden van grotere stukken software en zorgen ervoor dat de output overeenkomt met de verwachtingen. Testkaders maken het testen van eenheden eenvoudiger door set-up / afbouwdiensten te bieden en de tests te coördineren.
Er zijn veel frameworks voor het testen van eenheden beschikbaar voor C. Unity is bijvoorbeeld een puur C-framework. Mensen gebruiken heel vaak C ++ testkaders om C-code te testen; er zijn ook veel C ++ test frameworks.
Opmerkingen
Test harnas:
TDD - Testgestuurde ontwikkeling:
Test dubbele mechanismen in C:
- Link-time vervanging
- Functie pointer vervanging
- Vervanging van voorprocessor
- Gecombineerde link-tijd en functie pointer substitutie
Opmerking over C ++ testkaders die in C worden gebruikt: Het gebruik van C ++ kaders voor het testen van een C-programma is een vrij gebruikelijke praktijk, zoals hier wordt uitgelegd.
CppUTest
CppUTest is een xUnit- stijl framework voor unit testing C en C ++. Het is geschreven in C ++ en streeft naar draagbaarheid en eenvoud in ontwerp. Het heeft ondersteuning voor geheugenlekdetectie, het bouwen van mocks en het uitvoeren van zijn tests samen met de Google Test. Wordt geleverd met helperscripts en voorbeeldprojecten voor Visual Studio en 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);
}
Een testgroep kan een methode setup()
en teardown()
. De setup
wordt vóór elke test aangeroepen en de methode teardown()
wordt genoemd. Beide zijn optioneel en kunnen afzonderlijk worden weggelaten. Andere methoden en variabelen kunnen ook binnen een groep worden gedeclareerd en zijn beschikbaar voor alle tests van die groep.
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 is een xUnit- stijl testraamwerk voor unit testing C. Het is volledig in C geschreven en is draagbaar, snel, eenvoudig, expressief en uitbreidbaar. Het is ontworpen om vooral ook nuttig te zijn voor het testen van eenheden voor ingebedde systemen.
Een eenvoudige testcase die de retourwaarde van een functie controleert, kan er als volgt uitzien
void test_FunctionUnderTest_should_ReturnFive(void)
{
TEST_ASSERT_EQUAL_INT( 5, FunctionUnderTest() );
}
Een volledig testbestand kan er als volgt uitzien:
#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 wordt geleverd met enkele voorbeeldprojecten, makefiles en enkele Ruby-rake-scripts die het maken van langere testbestanden een beetje eenvoudiger maken.
CMocka
CMocka is een elegant eenheidstestraamwerk voor C met ondersteuning voor proefobjecten . Het vereist alleen de standaard C-bibliotheek, werkt op verschillende computerplatforms (inclusief ingebed) en met verschillende compilers. Het heeft een tutorial over testen met mocks, API-documentatie en een verscheidenheid aan voorbeelden .
#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;
}