重新定义 Catch 单元测试

Redefined Catch unit tests

我正在测试一个庞大的软件并且想使用 Catch 来完成这个任务。 我正在使用 "single include" 版本 1.9,将其集成到 Visual Studio 2012 update 4 中并使用 C++04 标准。

正如您将在下面看到的,我使用了三个“.cpp”文件。各自参考:

有关以下文件内容的更多详细信息。

此配置有效,但其中一个测试文件一天比一天大,我想将其分成 3 个或更多。现在,假设我执行以下操作:

当我运行测试时弹出这个错误:

=============================
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 倍。 有没有办法将测试拆分为多个文件?

-- 注释 --

我认为在 header 中包含 Catch 并直接使用包含 header 而不是 catch.cpp 不是一个好主意,但我成功地将此配置与 3(恰好 3 ) 包括 .cpp 个测试文件,我无法将其与 4 个文件一起使用。

我记得读过它与定义组件的有某种关系,但我也可以移动代码以便在不同的行定义测试用例而且行为没有改变。

我也试过"clean and rebuild",因为脏数据很可能保存在编译器/链接器的缓存中,但无济于事。

我现在不能创建一个实际的 MWE,所以我给了你一个测试设置的草图,尽可能准确,因为我认为它可能是需要的。我非常愿意提供更多详细信息或尝试构建一个实际的 MWE 并分享它。

如有任何想法,我们将不胜感激!


我的 "working" 代码如下所示:

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

"split"之后:

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)

不要包含 cpp 文件,只需将它们添加到项目中即可。 您的 main.cpp 文件只需要前两行(定义和包含)。