我们使用Visual Studio 2008开发C ++应用程序,并使用Boost.Test进行单元测试。目前,我们有一个单独的解决方案,其中包含我们的单元测试。
核心解决方案中的许多项目都会产生DLL。我们的测试覆盖范围有限,因为我们无法测试非导出类。
我有两个关于如何测试它们的想法:
我不完全确定会有什么缺点。上面的数字1打破了模块级封装,数字2可能导致更大的DLL,除非它可能只包含某些配置中的测试代码。
那么,上述方法是否存在严重缺陷,或者您能想到其他解决方案吗?
答案 0 :(得分:14)
扩展Tom Quarendon对this question的回答,我使用了Simon Steele的回应的轻微变体:
#include <header/in/source/project.h>
。$(IntDir)
添加到其他库目录。.obj
个文件添加到附加依赖项。同样,唯一的维护开销是单元测试的标准开销 - 创建对要测试的单元的依赖。
答案 1 :(得分:4)
我使用的解决方案是将相同的非导出代码构建到我的测试DLL中。这确实增加了构建时间并意味着将所有内容添加到两个项目中,但节省了导出所有内容或将测试放在主要产品代码中。
另一个可能性是将未导出的代码编译到lib中,该DLL由导出的DLL和单元测试项目使用。
答案 2 :(得分:2)
也在搜索解决方案,也许以下内容更容易维护。
添加新的构建配置,例如&#34;单元测试Debug&#34;到DLL项目并将配置类型更改为&#34;静态库.lib&#34; (&#34;一般&#34; - &gt;&#34;配置类型&#34;)。
然后只需在这个项目中添加单元测试的依赖关系,现在当你使用新的构建配置和#34;单元测试Debug&#34;时,所有内容应该链接在一起。 如果您正在使用发布版本进行单元测试,那么您需要添加另一个带有版本优化的配置。
所以这个解决方案的好处是:
缺点:
更新: 实际上我们最终采用了不同的方法。
我们添加了新的&#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保留它。