Поиск…


Вступление

Многие разработчики используют модульные тесты для проверки работоспособности своего программного обеспечения. Единичные тесты проверяют небольшие единицы более крупных программных продуктов и обеспечивают соответствие результатов ожиданиям. Структуры тестирования облегчают модульное тестирование, предоставляя услуги по настройке / разрыву и координируя тесты.

Для C. существует множество модульных модулей тестирования. Например, Unity - это чистая C-структура. Люди довольно часто используют C ++-тестирование для проверки кода C; существует множество тестовых рамок C ++.

замечания

Жгут проводов:

TDD - разработка, управляемая тестированием:

Тестирование двойных механизмов в C:

  1. Замена ссылки
  2. Подстановка указателя функции
  3. Замена препроцессора
  4. Комбинированная замещающая ссылка и функция

Замечание о средах тестирования C ++, используемых в C: Использование фреймворков C ++ для тестирования программы на C - довольно распространенная практика, как описано здесь .

CppUTest

CppUTest - это инфраструктура xUnit для модульного тестирования C и C ++. Он написан на C ++ и нацелен на переносимость и простоту в дизайне. Он поддерживает обнаружение утечки памяти, создает издевательства и выполняет свои тесты вместе с тестом Google. Поставляется со вспомогательными скриптами и примерами проектов для Visual Studio и 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);
}

У тестовой группы может быть метод setup() и teardown() . Метод setup вызывается перед каждым тестом, после чего teardown() метод teardown() . Оба они являются необязательными и могут быть опущены независимо. Другие методы и переменные также могут быть объявлены внутри группы и будут доступны для всех тестов этой группы.

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

Unity - это тестовая платформа xUnit для модульного тестирования C. Она полностью написана на C и является переносной, быстрой, простой, выразительной и расширяемой. Он специально предназначен для модульного тестирования встроенных систем.

Простой тестовый пример, который проверяет возвращаемое значение функции, может выглядеть следующим образом

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

Полный тестовый файл может выглядеть так:

#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 поставляется с примерами проектов, make-файлов и некоторых скриптов Ruby rake, которые упрощают создание более длинных тестовых файлов.

CMocka

CMocka - это элегантная модульная система тестирования для C с поддержкой макетных объектов. Он требует только стандартной библиотеки C, работает на ряде вычислительных платформ (включая встроенные) и с разными компиляторами. В нем есть учебное пособие по тестированию с помощью mocks, документации по API и множеству примеров .

#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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow