我正在测试一个巨大的软件,并希望使用 Catch 来完成这项任务。我正在使用“单一包含”版本 1.9,将其集成到 Visual Studio 2012 更新 4 中并使用 C++04 标准。
正如您将在下面看到的,我使用了三个“.cpp”文件。他们每个人都参考:
- 提供“抽象”宏的包含文件(例如
#define Assert(x) REQUIRE(x)
); - 一个实用程序文件,为测试提供...实用程序;
- 具体的测试目标包含文件;
- 一些“使用命名空间”语句,所有 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 并分享它。
任何想法表示赞赏!
我的“工作”代码如下所示:
主文件
#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 );
}
测试1.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...
}
}
单元测试套件.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
实用程序.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
“分裂”之后:
测试1.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...
}
}
主文件
#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)