как протестировать статические функции C с помощью теста Google

У меня есть файл C, содержащий некоторые статические функции, как использовать тест Google для проверки этих статических функций?

заголовочный файл:

test.h
int accessData();

исходный файл:

test.c
static int value;
static int getData()
{
   return value;
}

int accessData()
{
    if(value != 0)
    {
       return getData();
    }
    return 0;
}

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


person ratzip    schedule 19.08.2015    source источник
comment
#include исходный файл вместо файла заголовка.   -  person Groo    schedule 19.08.2015


Ответы (3)


Один из способов добиться этого — #include вставить исходный файл C в ваш тестовый исходный код. Затем функция static является частью той же единицы трансляции, что и тестовый код, и может быть вызвана из нее:

#include "test.c"

/* here follow the tests of getData() */

Недостатком этого является то, что все в test.c компилируется снова, что заметно влияет на время сборки. Если это становится проблемой, вы можете рассмотреть возможность извлечения статических функций для тестирования в их собственный исходный файл (например, test_p.c, где _p означает частный/внутренний). Затем #include "test_p.c" из test.c и вашего модульного теста.

person Toby Speight    schedule 19.08.2015

Я понимаю, что для проверки функции с помощью google test она должна быть видна тестовому коду. Статическая функция видна только текущей единице компиляции.

Способ обойти это — «удалить» статический атрибут для целей тестирования:

#ifndef GOOGLE_TEST
# define STATIC static
#else
# define STATIC
#endif

STATIC int getData();

Если это приводит к конфликтам, например, из-за того, что во многих исходных файлах есть функции getData(), вы можете создать простые функции-контейнеры:

static int getData(<arglist>);

#ifdef GOOGLE_TEST
int myModule_getData(<arglist>) {return(getData(<arglist>);}
...
#endif
person Paul Ogilvie    schedule 19.08.2015
comment
Конфликты должны быть маловероятными, если ваши тесты используют только один файл реализации для каждого набора тестов. Я бы определенно рекомендовал это как предпочтительный вариант, а функции-оболочки - в крайнем случае. - person Toby Speight; 27.11.2019

Функция static имеет видимость, ограниченную единицей перевода.

Насколько мне известно, для googletest вам нужно вызывать тестируемые функции из отдельного тестового файла, содержащего тестовый код, написанный с помощью TEST(). Если тестируемой функцией является static, просто невозможно проверить это непосредственно из вызова TEST() MACRO.

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

person Sourav Ghosh    schedule 19.08.2015
comment
Учитывая, что в обычных проектах десятки, а то и сотни или тысячи единиц компиляции, комментировать ключевое слово static не очень практично. - person Anticom; 07.09.2017