如何在单元测试框架Google Test中组合测试过滤器?

4
我有几个单元测试用例,使用Google Test框架编写:
  1. Test class:

    class Test: public testing::Test
    {
    public:
      virtual void SetUp() {}
      virtual void TearDown() {}
    };
    
  2. Actual tests:

    TEST_F(Test, SubTest1)
    {
      // execute Test logic
    }
    
    TEST_F(Test, SubTest2)
    {
      // execute Test logic
    }
    
    TEST_F(Test, SubTest3)
    {
      // execute Test logic
    }
    
假设我只想显示SubTest1SubTest3,我该怎么做?重要的是,我想在一个中心位置(主方法)看到实际执行的测试。我认为我可以像以下示例中一样“堆叠”过滤器,但这种方法行不通:
int main(int argc, char** argv)
{
  ::testing::InitGoogleMock(&argc, argv);

  ::testing::GTEST_FLAG(filter) = "Test.SubTest1";
  ::testing::GTEST_FLAG(filter) = "Test.SubTest3";
  return RUN_ALL_TESTS();
}

→ 第二个过滤器移除了第一个过滤器,只有SubTest3被执行。
2个回答

8

我试图找到一些官方的googletest参考资料,但我只发现了this article,它解释了googletest过滤器的语法。如果你想运行匹配2个不同模式之一的测试用例,你的过滤器应该如下所示:

"FIRST_PATTERN:SECOND_PATTERN"

所以,在你的情况下:
  ::testing::GTEST_FLAG(filter) = "Test.SubTest1:Test.SubTest3";

你也可以使用通配符?*,并且你可以在-符号后添加排除模式。

1
这正是我想要的。而且很好,你提到了通配符的使用。 - h0ch5tr4355

3

您可以使用DISABLED_前缀(参见文档)来禁用不想运行的测试:

TEST_F(Test, DISABLED_SubTest2)
{
  // execute Test logic
}

测试仍将被编译,但GoogleTest不会运行它。

测试结束后,GoogleTest会提供一个良好的信息,显示有多少测试被禁用了。

您还可以使用--gtest_also_run_disabled_tests标志暂时启用它们。


但是我在主方法中没有一个已执行测试的列表。虽然这不是我写的,但我想在一个中心位置(主方法)看到实际执行的测试。 - h0ch5tr4355
这让人感觉设计不好,违反了DRY原则。你为什么需要一个已执行测试列表?你会在每个新测试后更新列表吗?如果你忘记添加测试到列表中怎么办?如果你想要更改fixture名称怎么办? - Yksisarvinen
在某种程度上你可能是正确的,但我想要一个简单的概述我的实际执行测试,我可以“解析”不同的测试套件。在我的用例中,单元测试不需要完美的设计,并且没有遵循任何指南或类似的东西。 - h0ch5tr4355

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