我有一个这样组织的 Visual Studio 解决方案:
ProjectA // A static library I'm working on
ProjectB // A static library containing UnitTest++ test suites for ProjectA
ProjectC // An executable test runner which links to ProjectA and ProjectB
ProjectB 包含两个文件,如下所示:
// RunTests.h
#ifndef RUNTESTS_H
#define RUNTESTS_H
#include "UnitTest++.h"
int runAllTests();
#endif
和这个:
// RunTests.cpp
#include "RunTests.h"
int runAllTests()
{
return UnitTest::RunAllTests();
}
以及包含测试套件的几个文件,例如:
// FooTests.cpp
#include "RunTests.h" //
#include "Foo.h" // From ProjectA
TEST(SomeTest)
{
CHECK(true);
}
ProjectC 由一个文件组成:
// main.cpp
#include "RunTests.h" // from ProjectB
int main()
{
return runAllTests();
}
我将测试和测试运行程序分开的原因是我有另一个项目,它使用相同的测试来分析代码覆盖率,我需要保持分开,因为它不是跨平台的,而测试运行程序是。
问题是,当我编译和运行 ProjectC 时,实际上没有运行任何测试(UnitTest++ 运行,但测试为零)。这是因为 ProjectC 不引用与来自 ProjectB 的测试相关的任何符号,因此链接器不会链接来自 ProjectB.lib 的目标文件。
我的理解是,如果 ProjectB 是可执行文件,我不会遇到这个问题(大概是因为链接器会链接所有目标文件),根据文档:
一般的想法是保留一个带有调用 RunAllTests() 的入口点的 Main.cpp 文件。
然后,您可以随意编译和链接新的 .cpp 文件,通常每个测试套件一个。
每个 Test*.cpp 文件都将包含一个或多个带有相关测试代码的 TEST 宏指令。Main.cpp 和 Test*.cpp 之间没有源代码级别的依赖关系,因为 TEST 宏处理 RunAllTests() 所需的注册和设置,以查找编译到同一最终可执行文件中的所有测试。
我怎样才能解决这个问题,而不必在 ProjectC 可以看到的头文件中声明所有测试(这会扼杀 UnitTest++ 的易用性)?我在 Visual Studio 中注意到的一种可能性是:
项目设置 > 配置属性 > 链接器 > 输入 > 强制符号引用
然而,每次我编写一个新的单元测试时,都必须添加每个符号是相当乏味的。有什么方法可以强制它包含 ProjectB.lib 的全部内容?或者也许是一些基于代码的解决方案?
编辑:我正在寻找的是这样的东西,但对于 Visual Studio。