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

15

我刚开始使用TDD,很好奇其他人运行测试的方法。供参考,我正在使用谷歌测试框架,但我相信这个问题适用于大多数其他测试框架以及C/C++之外的语言。

到目前为止,我的一般做法是以下三种之一:

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

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

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

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

你是如何处理的呢?

7个回答

6
你的第一种方法是我在C/C++和Java中一直采用的方式。大部分应用程序代码都在静态库中,我尽量保持应用程序所需的额外代码量最少。
在Python和其他动态语言中,我处理TDD的方式略有不同,我会将应用程序和测试的源代码放在一起,然后通过测试运行器找到这些测试并运行它们。

3
我使用两种方法进行单元测试。对于dlls,我只需将我的单元测试与dll链接即可。对于可执行文件,我在可执行项目和单元测试项目中都包含被测试的源文件。这会稍微增加构建时间,但意味着我不需要将可执行文件分成静态库和主函数。
我使用boost.test进行单元测试,并使用cmake生成我的项目文件。我发现这是最简单的方法。此外,我正在逐步向大型遗留代码库引入单元测试,因此我试图引入尽可能少的更改,以免给其他开发人员带来不便并阻碍他们进行单元测试。我担心仅为单元测试使用静态库可能被视为不采用它的借口。
话虽如此,我认为静态库方法是一种好方法,特别是在从头开始时。

我喜欢简单重新编译相关源文件的想法,但你是正确的,这确实会增加构建的时间。对于较大的项目来说,这将是不切实际的。 - kurige

3

对于C/C++应用程序,我尽可能将大部分代码放在一个或多个dll中,而主要应用程序只需最少量的代码以启动并将控制权移交给dll。Dll更容易测试,因为它们可以导出我想要的多个入口点供测试应用程序使用。

我使用单独的测试应用程序链接到Dll(s)。我强烈支持将测试代码和“产品”代码保留在不同的模块中。


3
我倾向于使用静态库而不是dll,因此我的大部分C++代码最终都以静态库的形式存在,正如您发现的那样,它们与dll一样易于测试。
对于构建为exe的代码,我要么有一个单独的测试项目,它仅包括正在测试的源文件,并且通常构建为exe,要么构建一个新的静态库,其中包含大部分exe并以与测试所有其他静态库相同的方式进行测试。我发现在新项目中通常采用“大部分代码在库中”的方法,在对现有应用程序进行测试时则采用“从exe项目中提取源文件到测试项目”的方法。
我根本不喜欢您的选项2和3。管理2的构建配置可能比仅拉取所需源的单独测试项目更难,并且像您在3中建议的那样将所有测试包含在exe中是错误的;)

2

我赞同第一点的观点,以下是原因:

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

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


0

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

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

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

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


-2

我正在使用第三方的测试运行器与他们的框架,并将测试包含在构建脚本中。测试位于生产代码之外(外部dll)。


什么框架?此外,这并没有解释测试如何访问您的应用程序代码。这是黑盒测试还是系统测试? - kurige
主要我使用 .net 进行开发,所以要么用 NUnit(如果项目无法承担带测试支持的 Visual Studio),要么使用 MS Unit Test 框架。我听说过可以将 C++ 支持添加到 MS Unit 中,但不确定。对于第二部分的问题:是的,这是黑盒测试。 - Aen Sidhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接