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

时间:2015-11-12 07:26:50

标签: c++ unit-testing googletest

我正在为大型产品编写测试,其中包括 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链接中的讨论,这表明当我们开始编写测试时,我们必须为每个类创建单独的可执行文件。如何制作单独的可执行文件?这是一种更好的方法吗?

1 个答案:

答案 0 :(得分:0)

一件事是,如果您的生产代码由5个项目组成,乍看之下就有5个测试项目是有意义的,因此可以单独测试每个项目(关注的基本分离)。

如果一个项目依赖于其他项目的某些类,则通常是实施Mock类以进行测试的情况。

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

有意义的是为每个生产类都配备一个类测试治具。但这是第一个简单的实现,因为至少需要考虑以下两种情况

  • 如果您有面向对象的类(父/子),则可能需要 进行参数化测试
  • 如果您具有模板化类,则可能要使用模板化 测试(类型化测试)

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

相同的解决方案专业版:

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

相同的解决方案缺点:

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

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