Переопределенные модульные тесты Catch
Я тестирую огромный кусок программного обеспечения и хотел бы использовать Catch для этой задачи. Я использую версию "единого включения" 1.9, интегрирую ее в Visual Studio 2012 update 4 и использую стандарт C++04.
Как вы увидите ниже, я использую три файла ".cpp". У каждого из них ссылка:
- включаемый файл, предоставляющий макросы "абстракции" (например,
#define Assert(x) REQUIRE(x)
); - служебный файл, содержащий... утилиты для теста;
- конкретные целевые тестовые файлы включают в себя;
- некоторые операторы "using namespace", все cpp файлы "используют" одно и то же пространство имен;
- фактические тесты, написанные с помощью макросов (например,
Assert(2 == getNumber())
).
Подробнее о содержании файлов ниже.
Эта конфигурация работает, но один из тестовых файлов увеличивается с каждым днем, и я хотел бы разделить его на 3 или больше. Теперь скажите, что я делаю следующее:
- принять участие в содержании теста
test.cpp
и переместить его в новый файлtest2.cpp
; - добавить то же самое включает и определяет, чтобы сделать его компиляцией;
- включить новый файл в моем главном
эта ошибка появляется, когда я запускаю тесты:
=============================
No tests ran
error: TEST_CASE( "test 2" ) already defined.
First seen at c:\tests\catchtest2\catchtest2\test2.cpp(3)
Redefined at c:\tests\catchtest2\catchtest2\test2.cpp(3)
где test2.cpp
это новый файл Если я переместить содержимое обратно в test.cpp
все это работает, но работать с тестами длиной в тысячи строк почти сложнее, чем работать над самим проектом, и размер может еще увеличиться в 3, 4 раза. Есть ли способ разделить тесты на несколько файлов?
-- ЗАМЕТКИ --
Я считаю, что включение Catch в заголовок и использование включающего заголовка вместо catch.cpp
напрямую не очень хорошая идея, но я успешно использовал эту конфигурацию с 3 (ровно 3) включенными .cpp
тестовые файлы, и я не могу использовать это с 4 файлами.
Я помню, как читал, что это было как-то связано со строкой, в которой были определены компоненты, но я также могу переместить код, чтобы тестовые наборы определялись в разных строках и поведение не менялось.
Я также попытался "очистить и перестроить", потому что вполне возможно, что грязные данные хранятся в кеше компилятора / компоновщика, но безрезультатно.
Я не мог создать настоящий MWE прямо сейчас, поэтому я дал вам эскиз тестовой установки настолько точной, насколько я думал, что это может быть необходимо. Я более чем готов предоставить дополнительную информацию или попытаться создать MWE и поделиться им.
Любая идея приветствуется!
Мой "рабочий" код выглядит так:
main.cpp
#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include "test1.cpp"
#include "test2.cpp"
#include "test3.cpp"
int main( int argc, char* argv[] )
{
cleanDir("c:\\temp");
init (argv);
int result = Catch::Session().run( argc, argv );
return ( result < 0xff ? result : 0xff );
}
test1.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 1") {
my_section("does X") {
// tests...
}
}
my_test_case("test 2") {
my_section("does Y") {
// tests...
}
}
unitTestSuite.h
#ifndef UNIT_TEST_SUITE
#define UNIT_TEST_SUITE 1
#include "catch.hpp"
#define my_test_case(x) TEST_CASE("Testing: " x)
... // here is also a namespace with some unit test specific utils
#endif
utils.h
#ifndef _UTILS_
#define _UTILS_
// some global variables declared here and defined in utils.cpp
// template functions defined in the header
// non-template functions defined in utils.cpp
// a test generation namespace with some template functions and some non-template functions defined in utils.cpp
#endif
После "раскола":
test1.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 1") {
my_section("does X") {
// tests...
}
}
test1.2.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 2") {
my_section("does Y") {
// tests...
}
}
main.cpp
#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include "test1.cpp"
#include "test1.2.cpp"
#include "test2.cpp"
#include "test3.cpp"
int main( int argc, char* argv[] )
{
cleanDir("c:\\temp");
init (argv);
int result = Catch::Session().run( argc, argv );
return ( result < 0xff ? result : 0xff );
}
вывод программы:
=============================
No tests ran
error: TEST_CASE( "test 2" ) already defined.
First seen at c:\tests\catchtest2\catchtest2\test1.2.cpp(3)
Redefined at c:\tests\catchtest2\catchtest2\test1.2.cpp(3)
1 ответ
Не включайте файлы cpp, просто добавьте их в проект. Вашему файлу main.cpp нужны только первые две строки (определение и включение).