GoogleTest:如何跳过测试?


118

使用Google Test 1.6(Windows 7,Visual Studio C ++)。如何关闭给定的测试?(aka如何阻止测试运行)。除了注释整个测试,我还能做些什么?

Answers:


176

Google Test 1.7 的文档建议

“如果您有一个无法立即修复的损坏测试,则可以在其名称中添加DISABLED_前缀。这会将其从执行中排除。”

例子:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public ::testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

1
刚刚也找到了它和过滤器
用户

@Bill,我在您发表评论之前就发现了它(我也将其作为答案)。然后,我删除了我的评论,认为它已经过时了……但这是一些非常好的信息!+1
Kiril

67

根据文档,您还可以运行测试的子集

运行测试的子集

默认情况下,Google测试程序会运行用户定义的所有测试。有时,您只想运行测试的一个子集(例如,用于调试或快速验证更改)。如果您将GTEST_FILTER环境变量或--gtest_filter标志设置为过滤器字符串,则Google Test将仅运行其全名(以TestCaseName.TestName的形式)与过滤器匹配的测试。

过滤器的格式是由“:”分隔的通配符模式列表(称为正模式),可以选择后跟“-”和另一个由“:”分隔的模式列表(称为负模式)。当且仅当测试匹配任何正模式但不匹配任何负模式时,测试才与过滤器匹配。

模式可以包含“ *”(与任何字符串匹配)或“?” (匹配任何单个字符)。为方便起见,过滤器“ * -NegativePatterns”也可以写为“ -NegativePatterns”。

例如:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

不是最漂亮的解决方案,但它可以工作。


24

现在,您可以使用GTEST_SKIP()宏在运行时有条件地跳过测试。例如:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

请注意,这是一项最新功能,因此您可能需要更新GoogleTest库才能使用它。


此功能尚未发布。它不太可能包含在1.8.x分支中,因为那里仅接受修复程序。1.9目前尚不可用,甚至尚未宣布。
ocroquette

2
GTEST_SKIP()从1.10.0开始可用。
mattdibi

遗憾的是,有关此方面的文档仍然很少。这似乎也有GTEST_SKIP_("some message")(注意尾随下划线)
马特乌斯·布兰德

19

这是表达式,其中包括名称中包含字符串foo1或foo2的测试,并排除名称中包含字符串bar1或bar2的测试:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

10

我更喜欢用代码来做:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

我可以注释掉这两行以运行所有测试,可以不注释第一行以测试正在研究/正在研究的单个功能,也可以注释第二行,如果测试已损坏但我想测试其他所有功能。
您也可以通过使用通配符并编写列表“ MyLibrary.TestNetwork *”或“ -MyLibrary.TestFileSystem *”来测试/排除一组功能。


这是一个很好的解决方案。如果过滤器为空白,则默认情况下使用它排除一些测试。可以使用启用它们export GTEST_FILTER='*'
Timmmm

实际上,这是行不通的,因为默认值为“ *” not“”。相反,我将仅使用另一个覆盖过滤器的环境变量。
Timmmm

您在哪里定义“过滤器”?是琴弦吗?
beasone

我没有定义它,所以我认为它必须是gtest / gtest.h中包含的全局变量?
pilkch

6

如果需要多个测试,则跳过

--gtest_filter=-TestName.*:TestName.*TestCase

4

对于另一种方法,可以将测试包装在一个函数中,并在运行时使用正常的条件检查仅在需要时执行它们。

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

这对我很有用,因为我仅在系统支持双栈IPv6时才尝试运行一些测试。

从技术上讲,双栈内容实际上不应该作为单元测试,因为它取决于系统。但是我无法真正进行任何集成测试,除非我测试了它们是否可以正常工作,并且这确保了在不是代码故障的情况下也不会报告故障。

至于测试,我有一些存根对象,它们通过构造伪套接字来模拟系统对双栈(或缺乏栈)的支持。

唯一的缺点是测试输出和测试数量将发生变化,这可能会导致某些问题监控成功的测试数量。

您也可以使用ASSERT_ *而不是EQUAL_ *。如果测试失败,则将声明其余的测试。防止将大量多余的内容转储到控制台。


4

我对条件测试也有同样的需求,并且找到了一个不错的解决方法。我定义了一个类似于TEST_F宏的TEST_C宏,但是它具有第三个参数,它是一个布尔表达式,在开始测试之前在main.cpp中评估了运行时。不执行评估为假的测试。宏很丑陋,但是看起来像:

#pragma once
extern std::map<std::string, std::function<bool()> >* m_conditionalTests;
#define TEST_C(test_fixture, test_name, test_condition)\
class test_fixture##_##test_name##_ConditionClass\
{\
    public:\
    test_fixture##_##test_name##_ConditionClass()\
    {\
        std::string name = std::string(#test_fixture) + "." + std::string(#test_name);\
        if (m_conditionalTests==NULL) {\
            m_conditionalTests = new std::map<std::string, std::function<bool()> >();\
        }\
        m_conditionalTests->insert(std::make_pair(name, []()\
        {\
            DeviceInfo device = Connection::Instance()->GetDeviceInfo();\
            return test_condition;\
        }));\
    }\
} test_fixture##_##test_name##_ConditionInstance;\
TEST_F(test_fixture, test_name)

此外,在main.cpp中,您需要以下循环来排除评估为false的测试:

// identify tests that cannot run on this device
std::string excludeTests;
for (const auto& exclusion : *m_conditionalTests)
{
    bool run = exclusion.second();
    if (!run)
    {
        excludeTests += ":" + exclusion.first;
    }
}

// add the exclusion list to gtest
std::string str = ::testing::GTEST_FLAG(filter);
::testing::GTEST_FLAG(filter) = str + ":-" + excludeTests;

// run all tests
int result = RUN_ALL_TESTS();

您如何在std :: string str = :: testing :: GTEST_FLAG(filter);中定义“过滤器”?
beasone '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.