C++ googletest:如何从内部方法跳过测试

C++ googletest:如何从内部方法跳过测试,c++,testing,googletest,C++,Testing,Googletest,使用GTEST\u SKIP,一个测试。其实施方式如下: #define GTEST_SKIP_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) 如果我们是主要的测试机构,一切都很好 如何从代码库深处跳过测试?这不起作用: int skip_this(int x) { if (x == 3) GTEST_SKIP(); return x; } TEST(X, Y) { sk

使用
GTEST\u SKIP
,一个测试。其实施方式如下:

#define GTEST_SKIP_(message) \
  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)
如果我们是主要的测试机构,一切都很好

如何从代码库深处跳过测试?这不起作用:

int skip_this(int x) {
  if (x == 3) GTEST_SKIP();
  return x;
}

TEST(X, Y) {
  skip_this(2);
  skip_this(3);
  throw std::runtime_error("Did not skip");
}
错误:

/Users/markus/Projekte/Opossum/Git/src/test/operators/aggregate_test.cpp:183:15: error: cannot initialize return object of type 'int' with an rvalue of type 'void'
  if (x == 3) GTEST_SKIP();
              ^~~~~~~~~~~~

换句话说:我如何修改
skip_this
,使测试通过或标记为“skipped”

您不能在内部函数中使用GTEST_SKIP。它不会生效。我只能提供此解决方案或类似的解决方案:

#define SKIPCODE -1

int skip_this(int x)
{
   if (x == 3)
      return SKIPCODE;
   else return x;
}

TEST(Test)
{
   int n = 3;

   if (skip_this(n) == SKIPCODE)
      GTEST_SKIP();
   ASSERT_TRUE(false);
}

int main(int argc, char** argv)
{
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
}

这不是很好,但对我来说很有用。其思想是展开堆栈,搜索调用测试的googletest方法,并重置指向该堆栈帧的指令指针

请注意,堆栈未正确销毁,这意味着,例如,资源可能泄漏

输出:

[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from SkipTest
[ RUN      ] SkipTest.ShouldNotBeSkipped
skip_test.cpp:44: Failure
Value of: false
  Actual: false
Expected: true
[  FAILED  ] SkipTest.ShouldNotBeSkipped (0 ms)
[ RUN      ] SkipTest.ShouldBeSkipped
[  SKIPPED ] SkipTest.ShouldBeSkipped (0 ms)
[ RUN      ] SkipTest.TestExecutionContinues
[       OK ] SkipTest.TestExecutionContinues (0 ms)
[----------] 3 tests from SkipTest (0 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.
[  SKIPPED ] 1 test, listed below:
[  SKIPPED ] SkipTest.ShouldBeSkipped
[  FAILED  ] 1 test, listed below:
[  FAILED  ] SkipTest.ShouldNotBeSkipped

 1 FAILED TEST

您能否从普通函数以及
测试()中演示它的工作情况?问题中的错误似乎更多地是由于嵌入的
return
没有值。Yepp。您正在演示
GTEST\u SKIP
的预期/文档化使用。我想从
skip\u this
中跳过上面的测试。你是对的,我不知怎么地对这个问题感到困惑
int foo(int x) {
  if (x == 3) skip();
  return 11;
}

TEST(SkipTest, ShouldNotBeSkipped) {
  foo(2);
  EXPECT_TRUE(false);
}

TEST(SkipTest, ShouldBeSkipped) {
  foo(3);
  EXPECT_TRUE(false);
}

TEST(SkipTest, TestExecutionContinues) {
  EXPECT_FALSE(false);
}

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from SkipTest
[ RUN      ] SkipTest.ShouldNotBeSkipped
skip_test.cpp:44: Failure
Value of: false
  Actual: false
Expected: true
[  FAILED  ] SkipTest.ShouldNotBeSkipped (0 ms)
[ RUN      ] SkipTest.ShouldBeSkipped
[  SKIPPED ] SkipTest.ShouldBeSkipped (0 ms)
[ RUN      ] SkipTest.TestExecutionContinues
[       OK ] SkipTest.TestExecutionContinues (0 ms)
[----------] 3 tests from SkipTest (0 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.
[  SKIPPED ] 1 test, listed below:
[  SKIPPED ] SkipTest.ShouldBeSkipped
[  FAILED  ] 1 test, listed below:
[  FAILED  ] SkipTest.ShouldNotBeSkipped

 1 FAILED TEST