Проверка модульного тестирования в C: лучший способ проверить статические методы - PullRequest
0 голосов
/ 05 ноября 2018

Я использую Check Framework для модульного тестирования моего C-кода, и я не смог найти правильный способ тестирования статических методов.

Моя работа совсем не идеальна, и хотелось бы, чтобы кто-нибудь указал мне правильное направление, как это сделать правильно. Моя работа заключается в добавлении макроса #ifdef, который изменяет статические методы на extern, если я передаю -D DEBUG во время компиляции.

В исходном файле

#ifdef DEBUG
unsigned ds_roundup_to_prime (const unsigned bsize) {
#else
static inline unsigned ds_roundup_to_prime (const unsigned bsize) {
#endif

И в заголовочном файле я делаю

#ifdef DEBUG
unsigned ds_roundup_to_prime (const unsigned bsize);
#endif

В идеале исходный код не должен меняться для обслуживания модульных тестов. Фреймворк для юнит-тестирования должен быть способен тестировать исходный код так, как он будет выглядеть в рабочей среде.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Это спорный вопрос, должен ли быть протестирован static функции, так как они не являются частью общественного API.

Я проверяю static функции, добавляя тестируемый модуль, а не связываясь с ним:

foo.c (тестируемая единица)

static int foo(int x)
{
    return x;
}

/* ... */

test_foo.c

#include "foo.c"

void test_foo(void)
{
    assert( foo(42) == 42 );
}

int main(void)
{
    test_foo();
}

Скомпилируйте только этот тест:

$ gcc -Wall -Werror -o test_foo test_foo.c
$ ./test_foo
0 голосов
/ 05 ноября 2018

Я проверяю static функции следующим образом.

У меня есть заголовочный файл с именем utility.h. Имеет следующее определение:

#ifdef UNIT_TEST
  #define UTILITY_STATIC(DECLARATION) extern DECLARATION; DECLARATION
#else
  #define UTILITY_STATIC(DECLARATION) static DECLARATION
#endif

Каждый исходный файл, имеющий функции, которые должны быть протестированы, объявляется так:

#include "utility.h"
UTILITY_STATIC(void function(void));
UTILITY_STATIC(void function(void))
{
}

У меня есть дополнительный файл заголовка (например, test_helper.h), используемый в исполняемом модульном тесте, который имеет строку:

extern void function(void);

Таким образом, у тестов есть доступ к function, тогда как у исходных файлов, которые не define UNIT_TEST, нет.

Примечание

Это можно использовать и для static переменных.

...