2008-09-29 2 views
18

Как вы выполняете модульное тестирование, например, тесты на C? Какая структура или вы проводите другие тесты в качестве модульных тестов на уровне кода?Как проверить код C

+1

http://stackoverflow.com/questions/65820/unit-testing-c-code – mmcdole 2009-02-12 21:56:59

ответ

2

XCode на Mac есть что-то они назвали CPTest вида встроенными. Я сделал портативную версию, которую я отправил здесь

http://www.loufranco.com/blog/files/AppleCppUnitPort.html

Я целился GCC на Windows, но я думаю, что это будет работать в другом месте, и это очень простые рамки, если вы хотите увидеть, как реализовать такую ​​вещь ,

0

Информацию о ряде испытательных каркасов C-блока можно найти по адресу www.xprogramming.com, в частности по ссылке software.

0

Возможно, вы захотите взглянуть на cfix - это единая платформа тестирования, предназначенная для платформ Win32 и режима ядра NT. Поддерживает как C, так и C++.

0

Если вы используете Windows, в качестве среды DEV, CUnitWin32 может служить ваша цель

16

Лично мне нравится Google Test framework.

Настоящая трудность при тестировании кода C ломает зависимости от внешних модулей, поэтому вы можете изолировать код в единицах. Это может быть особенно проблематично, когда вы пытаетесь получить тесты по устаревшему коду. В этом случае я часто использую компоновщик для использования функций заглушек в тестах.

Это то, о чем люди говорят, когда говорят «швов». В C ваш единственный вариант - использовать предварительный процессор или компоновщик для извлечения зависимостей.

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

#include "myimplementationfile.c" 
#include <gtest/gtest.h> 

// Mock out external dependency on mylogger.o 
void Logger_log(...){} 

TEST(FactorialTest, Zero) { 
    EXPECT_EQ(1, Factorial(0)); 
} 

Обратите внимание, что вы на самом деле в том числе файл C, а не файл заголовка. Это дает преимущество доступа ко всем статическим элементам данных. Здесь я издеваюсь над своим регистратором (который может быть в logger.o и дает пустую реализацию.Это означает, что тестовый файл компилируется и связывается независимо от остальной части базы кода и выполняется изолированно.

Что касается кросс- компиляция кода, для этого вам нужны хорошие объекты на целевом компьютере. Я сделал это с помощью googletest cross, скомпилированного в Linux на архитектуре PowerPC. Это имеет смысл, потому что у вас есть полная оболочка и os для сбора ваших результатов. (которые я классифицирую как что-либо без полной ОС), вы должны просто создавать и запускать на хосте. Вы должны сделать это в любом случае, чтобы вы могли автоматически запускать тесты как часть сборки.

Я нахожу тестирование кода на C++ как правило, намного проще из-за того, что код OO находится в в общем, гораздо меньше, чем процедурный (конечно, это сильно зависит от стиля кодирования). Также в C++ вы можете использовать трюки, такие как инъекция зависимостей и метод переопределения, чтобы получить швы в код, который иначе инкапсулирован.

Michael Feathers имеет excellent book about testing legacy code. В одной главе он описывает методы работы с кодом, отличным от OO, который я очень рекомендую.

Edit: Я написал blog post о модульном тестировании процессуального кодекса, с source available on GitHub.

Смежные вопросы