GoogleTest: 如何跳过测试?

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

164008 次浏览

谷歌测试的 医生1.7 建议:

如果您有一个无法立即修复的中断测试,您可以将 DISABLED_前缀添加到它的名称中。这将排除它的执行。这比注释掉代码或使用 #if 0要好,因为禁用的测试仍然在编译(因此不会腐烂)。

上述文档中的例子:

// 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) { ... }

如果您能够访问更新版本的 Google Test (当前版本是 v1.12.1) ,请在评论中查看 jslmsca 建议的 GTEST_SKIP()宏,在另一个答案中查看 Peter Bloomfield。来自 Advanced 中的样本:

TEST(SkipTest, DoesSkip) {
GTEST_SKIP() << "Skipping single test";
EXPECT_EQ(0, 1);  // Won't fail; it won't be executed
}


class SkipFixture : public ::testing::Test {
protected:
void SetUp() override {
GTEST_SKIP() << "Skipping all tests for this fixture";
}
};


// Tests for SkipFixture won't be executed.
TEST_F(SkipFixture, SkipsOneTest) {
EXPECT_EQ(5, 7);  // Won't fail
}

你也可以 运行测试的子集,根据文件:

运行测试的子集

默认情况下,GoogleTest 程序运行用户定义的所有测试。 有时,您希望只运行测试的一个子集(例如, 调试或快速验证更改) 环境变量或者—— gtest _ filter 标志添加到过滤器字符串, 谷歌测试将只运行其全名(以下面的形式)的测试 TestCaseName.TestName)匹配筛选器。

筛选器的格式是“ :”-分隔的通配符模式列表 (称为正面模式)后跟一个“-”和 另一个“ :”-分隔模式列表(称为负模式) Test 匹配过滤器当且仅当它匹配任何正值 但不符合任何负面模式。

模式可以包含“ *”(匹配任何字符串)或“ ?”(匹配任何 为了方便起见,过滤器’*-NegativePattern’使用 也可以写成-负模式。

例如:

./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.

虽然不是最好的解决办法,但是很有效。

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

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

对于另一种方法,您可以将测试封装在一个函数中,并在运行时使用普通的条件检查来只在需要时执行它们。

#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 _ * 。如果测试失败,则对其余测试进行断言。防止将大量冗余内容转储到控制台。

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

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

我更喜欢用代码:

// 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 *”来测试/排除一组特性。

我对条件测试也有同样的需求,所以我想出了一个很好的解决办法。我定义了一个类似于 TEST _ F 宏的宏 TEST _ C,但是它有第三个参数,即布尔表达式,在开始测试之前,在 main.cpp 中计算运行时。不执行计算 false 的测试。宏观经济形势很糟糕,但看起来:

#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();

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

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


...
}

注意,这是一个非常 最近的新闻的代码,因此您可能需要更新 GoogleTest 库来使用它。