编写Google测试的最佳做法是什么?

问题描述 投票:3回答:1

我正在为大型产品编写测试,其中包括大约2000个c ++类。主要产品的解决方案有5个项目。我为编写测试提出了一个单独的解决方案,并在其中添加了主项目的include和lib目录。在我的单元测试项目(在visual studio中)中,我创建了一个具有以下代码的主类

#include "gtest/gtest.h"   
int main(int argc, char **argv) 
{
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
  return 0;
}

除此之外,我为主要产品解决方案的每个项目制作了五个过滤器。每个过滤器都包含主产品解决方案项目中的类的测试类。在每个测试类中,有一个装夹,SetUp和TearDown指针变量,在cpp文件中,我正在注册该fixture类并执行测试操作如下

TEST_F(FixtureClassName, testFunction) 
{
    // testing logic and asserts    
}
// more test cases

对于必须由所有测试类使用的常用功能,我在我的测试项目中创建了实用程序类,当任何类需要该功能时,它只调用这些实用程序类中编写的函数。

我已经编写了大约20个类的测试,当我运行我的测试代码时,它运行在所有类中编写的测试(在所有过滤器中)。我想问一下,我怎样才能进一步改进它的结构?

有没有办法一次只运行一个类夹具的测试?

我的测试项目是否应该在主要产品解决方案中,还是我为其制定单独解决方案的正确方法?

我已经阅读了this链接中的讨论,这表明我们在开始编写测试时必须为每个类创建单独的可执行文件。如何制作单独的可执行文件,这是一种更好的方法吗?

c++ unit-testing googletest
1个回答
0
投票

有一点是,如果您的生产代码由5个项目组成,乍一看有5个测试项目是有意义的,这样每个项目都可以单独测试(基本的关注点分离)。

如果一个项目依赖于某些类的其他项目,那么这是典型的情况,您可以实现模拟类以便进行测试。

所以5个测试可执行文件(当然不是2000个?每个类一个?我怀疑它是否有意义。)

有意义的是为每个生产类都有一个类测试夹具。但这是第一个天真的实施,因为至少要考虑以下两个案例

  • 如果您有面向对象的类(父/子),您可能希望进行参数化测试
  • 如果你有模板化的类,你可能想要模板化测试(类型测试)

对于下一个问题,将它们放在同一解决方案或单独的解决方案中取决于您。

同样的解决方案:

  • 如果在破坏API兼容性的生产代码中进行了更改,则关联的测试项目将无法编译,因此运行它们会更快

相同的解决方案:

  • 额外编译时,更大的解决方案。

最后,您可以决定使用@nos注释中提到的gtest_filter运行的测试。但这与您应该如何构建这些测试无关。

© www.soinside.com 2019 - 2024. All rights reserved.