2013-02-27 45 views
0

我有这样的组织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。

回答

0

我试图使用UnitTest ++,就像你描述的一样,并遇到同样的问题。我在另一个论坛中遇到了一个似乎适用于我的单元测试可执行文件(即ProjectC)的建议。

对于项目C: 项目设置>通用属性>(选择项目B)>使用库的依赖输入:真

这为我工作。我认为这样做有效地将ProjectB中的任何对象文件链接到ProjectC中(而不是链接库)。

+0

谢谢,我会稍后再试。 – JBentley 2013-04-12 09:33:06

相关问题