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

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。

4

1 回答 1

0

我试图以与您描述的方式相同的方式使用 UnitTest++,但遇到了同样的问题。我在另一个论坛上遇到了一个似乎适用于我的 unittest 可执行文件(即 ProjectC)的建议。

对于 ProjectC:项目设置 > 通用属性 >(选择 ProjectB)> 使用库依赖输入:True

这对我有用。我认为这样做可以有效地将任何对象文件从 ProjectB 链接到 ProjectC(而不是链接库)。

于 2013-04-12T04:18:28.793 回答