简体   繁体   English

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

[英]googletest: How to skip test from an inner method

With GTEST_SKIP , we can (conditionally) skip a test. 使用GTEST_SKIP我们可以(有条件地)跳过测试。 The way it is implemented is as follows: 实施方式如下:

#define GTEST_SKIP_(message) \
  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)

If we are in the main test body, all is fine. 如果我们在主要测试机构,一切都很好。

How can I skip a test from deep within my code base? 如何从代码库中深入跳过测试? This does not work: 这不起作用:

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");
}

Error: 错误:

/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();
              ^~~~~~~~~~~~

In other words: How can I modify skip_this so that the test passes or is marked as "skipped"? 换句话说:如何修改skip_this以便测试通过或标记为“跳过”?

This is not really nice, but works for my purpose. 这不是很好,但适合我的目的。 The idea is to unwind the stack, search for the googletest method that called the test and reset the instruction pointer to that stack frame. 我们的想法是展开堆栈,搜索调用测试的googletest方法并重置指向该堆栈帧的指令。

Note that the stack is not properly destroyed, meaning that, eg, resources can leak. 请注意,堆栈未被正确销毁,这意味着,例如,资源可能会泄漏。

#define UNW_LOCAL_ONLY
#include <libunwind.h>
#include <cxxabi.h>
#include <iostream>

#include <gtest/gtest.h>

void skip() {
  unw_cursor_t cursor;
  unw_context_t context;

  unw_getcontext(&context);
  unw_init_local(&cursor, &context);

  while (unw_step(&cursor)) {
    unw_word_t off;

    char symbol[256] = {"<unknown>"};
    char* name = symbol;

    if (!unw_get_proc_name(&cursor, symbol, sizeof(symbol), &off)) {
      int status;
      if ((name = abi::__cxa_demangle(symbol, nullptr, nullptr, &status)) == nullptr) name = symbol;
    }

    if (std::string(name) == "testing::Test::Run()") {
      ::testing::internal::AssertHelper(::testing::TestPartResult::kSkip, __FILE__, __LINE__, "skipped") = ::testing::Message();
      unw_resume(&cursor);
    }

    if (name != symbol) free(name);
  }

  throw std::runtime_error("Did not find test method on the stack, could not skip test");
}

Example test (can be pasted below the code above): 示例测试(可以粘贴在上面的代码下面):

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

Output: 输出:

[==========] 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

You cant use GTEST_SKIP in the inner function. 你不能在内部函数中使用GTEST_SKIP。 It will not take effect. 它不会生效。 I can only offer this solution or something similar: 我只能提供这种解决方案或类似的东西:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM