【问题标题】:Grouping googletest unit tests by categories按类别对 googletest 单元测试进行分组
【发布时间】:2012-09-26 20:55:03
【问题描述】:

googletest 单元测试可以按类别分组吗?例如“SlowRunning”、“BugRegression”等。我发现最接近的是 --gtest_filter 选项。通过将类别名称附加/附加到测试或夹具名称中,我可以模拟组的存在。这不允许我创建不正常运行的组。

如果 googletest 中不存在类别,是否有好的或最佳实践解决方法?

编辑:另一种方法是使用 --gtest_also_run_disabled_tests。在测试前添加 DISABLED_ 可以为您提供一个条件类别,但我觉得我在执行此操作时误用了 DISABLED。

【问题讨论】:

  • 如果可能,您可以考虑使用内置此基本功能的“catch2”测试框架。

标签: c++ unit-testing googletest


【解决方案1】:

其中一种方法是使用 gtest_filter 选项并使用测试的命名约定(如您在问题中描述的那样)。

TEST_F(Foo, SlowRunning_test1) {...}
TEST_F(Foo, BugRegression_test1) {...}
TEST_F(Foo, SlowRunningBugRegression_test1) {...}

其他方式对任何类型的测试使用单独的二进制文件/可执行文件。这种方式有一些限制,因为 gtest 使用静态自动注册,所以如果你包含一些源文件 - 在这个源文件中实现的所有测试都将包含在生成的二进制/可执行文件中。

我认为第一种方法更好。此外,我将实施新的测试注册宏以使我的生活更轻松:

#define GROUP_TEST_F(GroupName, TestBase, TestName) \
#ifdef NO_GROUP_TESTS \
   TEST_F(TestBase, TestName) \
#else \
   TEST_F(TestBase, GroupName##_##TestName) \
#endif

【讨论】:

  • 我喜欢你的 GROUP_TEST_F 形式化了命名约定。它改进了使用过滤。我仍然希望有比过滤更好的东西。
  • 您如何使用 GROUP_TEST_F? NO_GROUP_TESTS 何时定义,何时未定义? “\”是干什么用的? makro 根本不适合我。我把它改成#define GROUP_TEST_F(GroupName, TestBase, TestName) #ifdef NO_GROUP_TESTS TEST(TestBase, TestName) #else TEST(TestBase, GroupName_TestName) #endif 但是如果我使用GROUP_TEST_F,测试结果看起来像这样“GroupName.GroupName_TestName”
【解决方案2】:

在单个测试可执行文件中运行测试子集的唯一方法是 --gtest_filter。执行集成测试和单元测试有两种解决方法

  1. 使用诸如 Integration.Testname 和 Unit.Testname 之类的命名约定。除此之外,我还将维护 RunIntegration.bat 和 RunUnit.bat 等脚本文件,以便从我的构建自动化脚本中针对不同场景运行。
  2. 维护集成和单元或其他类别的不同测试可执行文件。 在视觉工作室中,每个项目都有单独的项目。

【讨论】:

  • 我喜欢单独的可执行文件的想法,但这要么意味着将类别分离到单独的源文件中,要么使用#defines 并重新生成 .o 文件。两者都不是很可口。
  • 我可能不明白你的评论。为什么要将隔离到单独的测试文件中是一个坏主意。随着您的测试套件的增长,模块化测试、创建深度命名空间等将是有利的。如果您担心重用/代码重复,那么您可以开始在测试类型code.google.com/p/googletest/wiki/… 之间使用通用测试夹具
  • 我绝对相信将测试分离到单独的文件中。但是,如果我有一个包含 X 测试的文件,我不喜欢仅仅因为它属于“长期运行”类别而将一个测试拆分为一个单独的文件。为类别使用单独的可执行文件将需要使用不同的#defines 或重新编译相同的文件。
  • 好的,让您了解重新编译,这意味着额外的构建步骤。尽管您可能已经尝试过,而不是使用#defines 来参数化,但我会查看code.google.com/p/googletest/wiki/… 以避免重写测试,因此相同的测试可用于基于参数的长时间运行或短期运行。
  • 我确实使用值和类型参数化测试。但不同的类别不仅仅是其他测试中的不同参数。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多