你如何进行单元测试?编译器标志?静态库?

时间:2010-04-21 07:00:38

标签: c++ unit-testing tdd application-design

我刚刚开始使用TDD,并且很好奇其他人采用什么方法来运行他们的测试。作为参考,我使用谷歌测试框架,但我相信这个问题适用于大多数其他测试框架和C / C ++以外的语言。

到目前为止,我的一般做法是做三件事之一:

  1. 将大部分应用程序写入静态库,然后创建两个可执行文件。一个可执行文件是应用程序本身,而另一个是具有所有测试的测试运行器。两者都链接到静态库。

  2. 将测试代码直接嵌入到应用程序本身中,并使用编译器标志启用或禁用测试代码。这可能是我到目前为止使用过的最好的方法,但稍微混乱了代码。

  3. 将测试代码直接嵌入到应用程序本身中,并且在给定某些命令行开关的情况下,运行应用程序本身或运行应用程序中嵌入的测试。

  4. 这些解决方案都不是特别优雅 ......

    怎么做?

7 个答案:

答案 0 :(得分:5)

你的方法没有。 1是我在C / C ++和Java中总是这样做的方式。大多数应用程序代码都在静态库中,我尝试将应用程序所需的额外代码量保持在最低限度。

我在Python和其他动态语言中处理TDD的方式略有不同,因为我留下了应用程序和测试的源代码,测试运行器找到测试并运行它们。

答案 1 :(得分:3)

我使用两种方法,对于dll,我只是简单地将我的单元测试与dll链接起来。对于可执行文件,我包括可执行项目和单元测试项目中正在测试的源文件。这略微增加了构建时间,但意味着我不需要将可执行文件分成静态库和主函数。

我使用boost.test进行单元测试,并使用cmake生成项目文件,我发现这是最简单的方法。此外,我正在慢慢地将单元测试引入大型遗留代码库,因此我尝试引入最少量的更改,以防我给其他开发人员带来不便并阻止他们进行单元测试。我担心使用静态库仅用于单元测试可能被视为不采用它的借口。

话虽如此,我认为静态库方法很好,特别是如果你从头开始。

答案 2 :(得分:3)

对于C / C ++应用程序,我尝试在一个或多个dll中拥有尽可能多的代码,主应用程序是启动和传递到dll的最小值。 Dll更容易测试,因为它们可以导出尽可能多的入口点,以供测试应用程序使用。

我使用链接到Dll的单独测试应用程序。我非常赞成将测试代码和“产品”代码保存在单独的模块中。

答案 3 :(得分:3)

我倾向于支持静态库而不是dll,所以我的大多数C ++代码最终都是静态库,而且正如你所发现的那样,它们和dll一样容易测试。

对于构建到exe的代码,我要么有一个单独的测试项目,它只包含正在测试的源文件,并且通常内置在exe中,或者我构建一个包含大部分exe和test的新静态库这与我测试所有其他静态库的方式相同。我发现我通常使用新项目采用“库中代码最多”的方法,并且当我将测试复制到现有应用程序时,将“将exe文件中的源文件拉入测试项目”方法。

我根本不喜欢你的选择2和3。管理2的构建配置可能比单独的测试项目更难,只需简单地提取所需的源代码,并将所有测试包含在exe中,正如你在3中所建议的那样是错误的;)

答案 4 :(得分:2)

我选择#1,其中一些原因是

  • 它允许检查每个lib是否正确链接
  • 您不希望产品中有额外的代码
  • 调试单个小型测试程序更容易
  • 某些测试(如通信测试)可能需要多个可执行文件

对于C ++构建和测试,我喜欢使用CMake,它可以运行一系列目标可执行文件作为测试并打印结果摘要。

答案 5 :(得分:0)

个人而言,我使用的另一种方法依赖于你的方法:

我保持项目测试完好无损。如果它是可执行文件,它应该保持可执行文件。您只需创建一个后期构建操作,以便将所有obj文件聚合到一个静态库中。

然后,您可以创建测试项目,链接测试框架和先前生成的静态库。

以下是与您的问题相对应的一些主题:

答案 6 :(得分:-2)

我正在使用第三方测试运行器及其框架,并在构建脚本中包含测试。测试不在生产代码中(外部dll)。