Переопределенные модульные тесты 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 нужны только первые две строки (определение и включение).

Другие вопросы по тегам