c++ - 编写谷歌测试的最佳实践是什么?

标签 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 文件中,我正在注册该夹具类并执行测试操作,如下所示

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

对于所有测试类都必须使用的通用功能,我在我的测试项目中制作了实用类,当任何类需要该功能时,它只需调用这些实用类中编写的函数即可。

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

有没有办法让我一次运行一个类装置的测试?

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

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

最佳答案

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

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

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

有意义的是为每个生产类设置一个类测试夹具。但这是第一个天真的实现,因为至少有以下两种情况需要考虑

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

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

相同的解决方案亲:

  • 如果对破坏 API 的生产代码进行更改 兼容性,相关的测试项目不会编译,所以它是 更快地让它们运行

相同的解决方案缺点:

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

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

关于c++ - 编写谷歌测试的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33666236/

相关文章:

c++ - 从 C++ 列表中删除实体的差异

java - 测试 Solr 分布式组件

c++ - 谷歌模拟 : object of abstract class type "xyz" is not allowed?

c++ - 如何让优化器正确地将变量放入寄存器?

c++ - 在带有 '-(inner expression)' 的表达式周围添加括号

Angular 单元测试 NullInjectorError : R3InjectorError(DynamicTestModule)[MatSnackBarComponent -> MatSnackBarComponent]:

c++ -/usr/bin/ld : cannot find -lgmock on ubuntu while running gmock program

c++ - PrintTo 用于 Google Test 中的指针

c++ - 混淆 while(cin >> x && x != 0) (当 int x = 0 时)与 while(x != 0 && cin >> x ) (当 int x = 1 时)

c# - 单元测试异步函数