单元测试DLL中的非导出类

时间:2011-03-31 08:11:36

标签: c++ visual-studio unit-testing boost-test

我们使用Visual Studio 2008开发C ++应用程序,并使用Boost.Test进行单元测试。目前,我们有一个单独的解决方案,其中包含我们的单元测试。

核心解决方案中的许多项目都会产生DLL。我们的测试覆盖范围有限,因为我们无法测试非导出类。

我有两个关于如何测试它们的想法:

  1. 导出所有内容
  2. 将测试放在DLL中(相同的项目和解决方案)并使用Boost.Test的外部跑步者
  3. 我不完全确定会有什么缺点。上面的数字1打破了模块级封装,数字2可能导致更大的DLL,除非它可能只包含某些配置中的测试代码。

    那么,上述方法是否存在严重缺陷,或者您能想到其他解决方案吗?

4 个答案:

答案 0 :(得分:14)

扩展Tom Quarendon对this question的回答,我使用了Simon Steele的回应的轻微变体:

  • 创建一个测试项目(使用您喜欢的任何测试框架,我使用CppUnit)。
  • 在test_case.cpp中,#include <header/in/source/project.h>
  • 在测试项目属性中:
    • 在链接器 - &gt;常规中,将源项目的$(IntDir)添加到其他库目录。
    • 在Linker-&gt;输入中,将.obj个文件添加到附加依赖项。
  • 将测试项目中的依赖项添加到Project-&gt; Project Dependencies中的源项目。

同样,唯一的维护开销是单元测试的标准开销 - 创建对要测试的单元的依赖。

答案 1 :(得分:4)

我使用的解决方案是将相同的非导出代码构建到我的测试DLL中。这确实增加了构建时间并意味着将所有内容添加到两个项目中,但节省了导出所有内容或将测试放在主要产品代码中。

另一个可能性是将未导出的代码编译到lib中,该DLL由导出的DLL和单元测试项目使用。

答案 2 :(得分:2)

也在搜索解决方案,也许以下内容更容易维护。

添加新的构建配置,例如&#34;单元测试Debug&#34;到DLL项目并将配置类型更改为&#34;静态库.lib&#34; (&#34;一般&#34; - &gt;&#34;配置类型&#34;)。

然后只需在这个项目中添加单元测试的依赖关系,现在当你使用新的构建配置和#34;单元测试Debug&#34;时,所有内容应该链接在一起。 如果您正在使用发布版本进行单元测试,那么您需要添加另一个带有版本优化的配置。

所以这个解决方案的好处是:

  • 低维护成本
  • 单个DLL /静态库项目
  • 不必手动链接到.obj文件

缺点:

  • 额外的配置文件需要在构建环境(CI)中进行一些更改
  • 更长的编译时间

更新: 实际上我们最终采用了不同的方法。

我们添加了新的&#34;测试调试&#34; /&#34;测试版本&#39;我们拥有的每个现有项目的配置。

对于.exe / .dll项目,我们禁用原始的main.cpp进行编译,并将其替换为实例化测试框架的那个(例如gtest)并运行所有测试,测试是在单独的.cpp文件中进行的。也被排除在常规配置(发布/调试)中的编译之外,并且仅在测试配置中启用。

对于.lib项目,我们还有新的&#34;测试调试&#34; /&#34;测试版本&#34;配置,我们将静态库转换为.exe文件,并提供一个main.cpp,它实例化测试框架并运行测试和测试。在发布/调试配置上的编译中排除了测试相关文件。

答案 3 :(得分:0)

尝试在某处定义如下所示的所有文件:

#define EXPORTTESTING __declspec(dllexport)

并使用它代替dllexport,如下所示:

class EXPORTTESTING Foo 
{
 ...
};

然后,您将能够关闭用于构建版本DLL的标志,但是为可单元测试的DLL保留它。