2009-12-15 104 views
10

也许我没有正确地考虑这个问题。 我正在使用单元测试开始我的第二个项目。我的第一个项目是我自己推出的,对于这个项目我尝试了Boost :: test。单元测试可执行项目

我的问题是,什么是编译为可执行文件的单元测试项目的正确程序?似乎我所看到的所有内容都是针对库和依赖项的。我希望我的EXE项目进行单元测试,但我不希望一堆单元测试功能漂浮在二进制,我也不想做

#ifdef _DEBUG 
    BOOST_AUTO_TEST_CASE(my_func) 
    { 
    } 
#endif 

在我所有的测试。

我想过创建单元测试一个单独的项目,但并没有真正可执行工作..除非我想从我的其他项目到测试项目做一些花哨的预生成操作复制..

任何想法或想法?

+0

你或许应该更新你的问题,以避免误解 - 我似乎没有成为唯一的一个。 – 2009-12-15 05:19:03

回答

6

该项目可以编译为一个库,该库可能静态地链接到两个单独的可执行文件中:将交付的“项目”和单元测试。

现在问题似乎来自您的IDE,它是哪一个?它是否允许为一个项目创建两个二进制文件?

+0

这是一个非常好的主意 – Charles 2009-12-15 14:42:16

+0

我使用这个解决方案,但要确保如果你这样做你的编译器知道链接库中的所有对象。在Visual Studio中,您在链接器选项中设置了使用库依赖项输入,在gcc中我相信这个选项是-z allextract或者什么 – Charles 2009-12-15 17:36:06

2

这个想法是创建一个独立的项目,您可以单独测试单独的单元代码的预期行为,无论是否构建调试或不是(由于代码差异,甚至不会在调试版本中显示某些问题)。
您将它构建为一个二进制文件,然后运行以查看您的更改是否没有破坏任何内容 - 通常甚至将其设置为自动生成后操作。

如果您想从外部测试您的应用程序 - 可能会使用一些测试框架,具体取决于区域/框架等。的应用程序......但Boost.Test和所有其他单元测试框架不适用于测试可执行文件。

+0

感谢您的快速回复。我知道单元测试对库很好,但我想单元测试我的可执行文件,所以我需要真正定义我的main()函数。这是我的单元测试解决方案没有问题,但与Boost :: test有关的一个问题:( – Charles 2009-12-15 04:17:29

+0

提供了一个最小的main,它在单元测试中应该不会太麻烦。 http://www.boost.org/doc/libs/1_41_0/libs/test/doc/html/utf/user-guide/initialization.html#utf.user-guide.initialization.auto-generation – 2009-12-15 04:23:18

+0

如果有帮助,在这里看起来像有用的例子:http://github.com/jsankey/boost.test-examples/ – 2009-12-15 04:33:01

1

单元测试可执行文件可能是一个好主意 - 但意识到它是一个完全不同于单元测试代码的怪物。一旦你有一个可执行文件,就没有更多的C++或Boost。这只是一个程序。你需要能够运行它,并分析/在不同的机构控制您的输入:

输入:

  • 参数
  • stdin
  • 环境变量(也许)
  • 配置文件(也许)

输出:

  • 返回值
  • stdout
  • 输出文件(也许)

它可能会是最容易运行一个外壳内。 bash将在Linux环境中工作(输入/输出文件,在输出上运行sed/awk/grep以分析正确性)。您可以使用Perl或Python以及它们各自的单元测试框架,但需要注意的是,您必须将程序的调用包装在其他函数中:这两种语言都支持来自子流程的管道概念,Python的subprocess模块和Perl与其标准的文件打开机制。

无论你做什么,你都做而不是想要尝试从C++单元测试整个可执行文件。

+0

嗯,我并不真正的意思是测试构建的可执行文件,我的意思是我的项目编译为exe文件,而不是库。大多数单元测试框架是为图书馆设计的,因此存在混淆和问题。 – Charles 2009-12-15 05:33:59

6

我使用的CppUnit到一个额外的项目,简单地链接到从可执行代码生成的* .OBJ文件中测试我的可执行文件。这样,您在原始代码库中就没有任何测试逻辑,并且可以为您的测试编写单独的控制台或Windows应用程序。

干杯 霍尔格

+0

如何将* .obj添加到单元测试项目中? – NSA 2011-07-22 16:29:55

+0

至少在Visual Studio中,您可以将所需的* .obj文件添加到链接器输入文件中,就像使用lib一样。 – 2011-10-06 11:40:52

1

可以包括从你的单元测试项目需要.cpp文件并进行测试。

像我一样:

测试\游戏服务器\ PVESettingsTest.cpp:

#include "../../sources/GameServer/PVESettings.cpp" 

一切工作正常...

+0

该方法使编译时间加倍。在你的例子中'PVESettings.cpp'被编译了两次:用于原始项目和单元测试。对于小型项目来说可能是微不足道的,但随着项目的增长将会变得很痛苦。 – 2017-12-22 14:29:20

相关问题