Recherche…


Introduction

De nombreux développeurs utilisent des tests unitaires pour vérifier que leur logiciel fonctionne comme prévu. Les tests unitaires vérifient les petites unités de logiciels plus gros et vérifient que les résultats correspondent aux attentes. Les frameworks de test facilitent les tests unitaires en fournissant des services de configuration / déconnexion et en coordonnant les tests.

Il existe de nombreux frameworks de tests unitaires pour C. Par exemple, Unity est un framework C pur. Les gens utilisent assez souvent les frameworks de test C ++ pour tester le code C; Il existe également de nombreux frameworks de test C ++.

Remarques

Harnais de test:

TDD - Développement piloté par les tests:

Tester les mécanismes doubles en C:

  1. Substitution de temps de liaison
  2. Substitution de pointeur de fonction
  3. Substitution de préprocesseur
  4. Combinaison du temps de liaison et du pointeur de fonction

Remarque sur les frameworks de test C ++ utilisés dans C: L'utilisation de frameworks C ++ pour tester un programme C est une pratique assez courante, comme expliqué ici .

CppUTest

CppUTest est un framework de type xUnit pour les tests unitaires C et C ++. Il est écrit en C ++ et vise la portabilité et la simplicité dans la conception. Il prend en charge la détection des fuites de mémoire, la création de simulacres et l'exécution de ses tests avec le test Google. Livré avec des scripts d'aide et des exemples de projets pour Visual Studio et 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);
}

Un groupe de test peut avoir une méthode setup() et une méthode teardown() . La méthode d' setup est appelée avant chaque test et la méthode teardown() est appelée après. Les deux sont facultatifs et l'un ou l'autre peut être omis indépendamment. D'autres méthodes et variables peuvent également être déclarées à l'intérieur d'un groupe et seront disponibles pour tous les tests de ce groupe.

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);
    }
}

Cadre de test d'unité

Unity est un framework de test de style xUnit pour les tests unitaires C. Il est entièrement écrit en C et est portable, rapide, simple, expressif et extensible. Il est spécialement conçu pour les tests unitaires des systèmes embarqués.

Un scénario de test simple qui vérifie la valeur de retour d'une fonction peut se présenter comme suit

void test_FunctionUnderTest_should_ReturnFive(void)
{
    TEST_ASSERT_EQUAL_INT( 5, FunctionUnderTest() );
}

Un fichier de test complet peut ressembler à ceci:

#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 est fourni avec des exemples de projets, des fichiers makefiles et des scripts rake Ruby qui facilitent la création de fichiers de test plus longs.

CMocka

CMocka est un framework de test unitaire élégant pour C avec prise en charge des objets fictifs . Il ne nécessite que la bibliothèque standard C, fonctionne sur une gamme de plates-formes informatiques (y compris embarquées) et avec différents compilateurs. Il comprend un didacticiel sur les tests avec des simulacres, la documentation de l’API et divers exemples .

#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;
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow