Начиная с простого модульного теста в c - PullRequest
3 голосов
/ 30 июня 2010

Мой босс сказал мне написать модульные тесты для небольшого файла c (foo.c), который я написал. Я много читал об истории модульного тестирования в Интернете, например о тестировании только одной функции и создании полностью автоматизированных тестов, но я не нашел учебника о том, как реализовать настоящий модульный тест. Я попробовал следующий подход, но не получилось.

    /*foo.c*/
    #include foo.h
    #if UNIT_TESTING
    #define main example_main
    #endif

    int foo1(...){...}
    int foo2(...){...}

    int main(int argc,char **argv) {
        foo1(...);
        foo2(...);
    }



    /*test_foo.c*/
    #include "foo.h"

    void main(int argc,char **argv) {

        int i = example_main(argc,argv);
        return;
    }



    /*foo.h*/
    int example_main(int argc,char **argv);

В качестве cmd я использую:

gcc -Wall -pedantic foo.c test_foo.c -DUNIT_TEST=1 -o test_foo.out

Я получаю следующие ошибки:

test_foo.c: warning: return type of ‘main’ is not ‘int’
test_foo.c: In function ‘main’:
test_foo.c warning: unused variable ‘i’
/tmp/ccbnW95J.o: In function `main':
test_foo.c: multiple definition of `main'
/tmp/ccIeuSor.o:foo.c:(.text+0x538b): first defined here
/tmp/ccbnW95J.o: In function `main':
test_foo.c:(.text+0x17): undefined reference to `example_main'
collect2: ld returned 1 exit status

Что я сделал не так? Или вы бы порекомендовали другой подход к модульному тестированию.

Спасибо!

[обновление] исправил опечатки в моем коде и разместил обновленные сообщения об ошибках

[обновление / уточнение] Я должен использовать cmockery, поэтому я попробовал пример «calculator.c» с веб-сайта cmockery, но не смог запустить его. В моем чтении у меня сложилось впечатление, что модульные тесты не зависят от фреймворка. Поэтому я хотел начать с очень простого примера, чтобы поиграть. "#if UNIT_TESTING #define main example_main" взято из cmockry 'manual'.

Ответы [ 5 ]

8 голосов
/ 30 июня 2010

Модульное тестирование - это не только написание и запуск тестовых примеров, но и создание отчетов.Я настоятельно рекомендую вам использовать такие фреймворки, как cunit .Кроме того, модульные тесты лучше всего запускать после сборки в процессе непрерывной интеграции , чтобы как можно раньше получить предупреждение о критических изменениях в процессе разработки.С помощью cunit вы можете создавать XML-отчеты, которые можно анализировать и отображать на веб-сервере (большую часть времени с помощью XSLT).Выполнение собственных прихотей будет работать, но по мере того, как вы будете добавлять все больше и больше функциональности для своих тестов, вы будете заново изобретать колесо, если не будете использовать какую-то установленную среду.

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

3 голосов
/ 30 июня 2010

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

1 голос
/ 30 июня 2010

Я думаю, что вы хотите точку с запятой здесь ...

/*foo.h*/
int example_main(int argc,char **argv);
1 голос
/ 30 июня 2010

Может быть, дело в пропущенном ';' в последней строке функции main ():

int main(int argc,char **argv) {
        foo1(...);
        foo2(...)
    }
0 голосов
/ 02 июля 2010

Похоже, что этот вопрос действительно касается построения тестового кода вместе с существующей библиотекой.

Был ли пример, которому вы следовали, пытался протестировать программу с основной функцией?Почему в этом примере нет ошибки «множественное определение« main »»?

Одно из решений состоит в том, чтобы отделить основную функцию в тестируемом программном обеспечении (SUT) от остальной части программы, и не 't включить основную функцию SUT в сборку тестового проекта.(Конечно, это означает, что исходная функция main больше не является частью SUT, то есть вы не тестируете исходную функцию main.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...