我有这样的组织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
项目B包含两个文件看起来像这样:
// 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);
}
项目C由一个单一的文件:
// main.cpp
#include "RunTests.h" // from ProjectB
int main()
{
return runAllTests();
}
我之所以有测试和测试运行分开,就是我有一个使用相同的测试,分析代码覆盖率,这是我需要保持另一个项目因为它不是跨平台的,而测试跑步者是。
问题是,当我编译和运行ProjectC时,实际上没有运行测试(UnitTest ++运行,但零测试)。这是因为ProjectC没有引用与ProjectB的测试有关的任何符号,所以链接器不会链接来自ProjectB.lib的对象文件。
这是我的理解是,如果项目B是一个可执行文件,我不会有这个问题(大概是因为链接器将连接所有的目标文件),按照文件:
总的想法是,您使用调用RunAllTests()的 入口点保留一个Main.cpp文件。
然后,您可以随意编译和链接新的.cpp文件,通常每个测试套件都有一个 。
每个Test * .cpp文件将包含一个或多个TEST宏咒语以及相关的 测试代码。 Main.cpp和Test * .cpp之间没有源级别的依赖关系,因为TEST宏处理注册和设置 RunAllTests()查找编译到相同的 最终可执行文件中的所有测试。
我怎么能解决这个问题,而不必申报在头文件中的所有测试,项目C可以看到(这会杀了单元测试+ +的易用性)?我在Visual Studio中发现一种可能是:
项目设置>配置属性>链接>输入>强制符号引用
但是这将是相当繁琐不得不添加的每一个符号,每一次我写时间一个新的单元测试。有什么办法可以强制它包含ProjectB.lib的全部内容吗?或者也许一些基于代码的解决方案?
编辑:我正在寻找的是类似this,但对于Visual Studio。
谢谢,我会稍后再试。 – JBentley 2013-04-12 09:33:06