【问题标题】:Time out for test cases in googletestgoogletest 中的测试用例超时
【发布时间】:2014-09-15 16:13:31
【问题描述】:

gtest 中有没有办法让内联/测试用例甚至测试超时。 例如,我想做类似的事情: EXPECT_TIMEOUT(5 秒, myFunction());

我在 2010 年 12 月 9 日发现这个问题 googletest 问题为“类型:增强”。 https://code.google.com/p/googletest/issues/detail?id=348

看起来这篇文章没有 gtest 方法。 我可能不是第一个尝试解决这个问题的人。

我能想到的唯一方法是让子线程运行该函数,如果它没有返回 时间限制父线程将杀死它并显示超时错误。

有什么方法可以不必使用线程? 还是其他方式?

【问题讨论】:

  • 您可能会引入test code smell 并使测试变得脆弱。如果你真的想做,你可以自己写断言宏
  • 对于断言宏,我们可能需要两个线程运行?子线程运行函数,如果没有按时返回,主线程就停下来,返回false什么的。
  • 讨论似乎导致了实现讨论。由于有很多 ifs 和 whens,我建议在 googletest 或任何其他测试框架问题中讨论细节。范围太广了。是的,产生子线程可能会有所帮助,但很难说它是否强大。您也可以等待通话结束并使用秒表来确定时间
  • @DmitryLedentsov :在我的情况下等待呼叫结束是行不通的。我正在测试一个使用正则表达式的实现,并且我想确保它在匹配失败时不会调用灾难性的回溯。一个正确的实现应该少于 100ms;灾难性的回溯可能需要 10**30 秒。
  • @MartinBonner 我猜,您的算法没有取消点(因为它应该运行得非常快),如果发生“灾难性回溯”,您可能需要终止整个过程。这意味着,每个这样的测试用例都应该作为一个单独的进程运行。有多种实现方式,例如使用自定义测试工具,但是对于 SO 来说讨论太多了。开始一个带有 travis-ci 集成的 github 项目来玩转创意怎么样?

标签: googletest


【解决方案1】:

我刚遇到这种情况。

我想为我的反应堆添加一个失败的测试。反应堆永远不会结束。 (它必须先失败)。但我不希望测试永远运行。

我点击了您的链接,但仍然不开心。所以我决定使用一些 C++14 的特性,这样就比较简单了。

但我是这样实现超时的:

TEST(Init, run)
{
    // Step 1 Set up my code to run.
    ThorsAnvil::Async::Reactor                      reactor;
    std::unique_ptr<ThorsAnvil::Async::Handler>     handler(new TestHandler("test/data/input"));
    ThorsAnvil::Async::HandlerId                    id = reactor.registerHandler(std::move(handler));

    // Step 2
    // Run the code async.
    auto asyncFuture = std::async(
        std::launch::async, [&reactor]() {
                               reactor.run();   // The TestHandler
                                                // should call reactor.shutDown()
                                                // when it is finished.
                                                // if it does not then 
                                                // the test failed.
                            });

    // Step 3
    // DO your timeout test.
    EXPECT_TRUE(asyncFuture.wait_for(std::chrono::milliseconds(5000)) != std::future_status::timeout);

    // Step 4
    // Clean up your resources.
    reactor.shutDown();             // this will allow run() to exit.
                                    // and the thread to die.
}

现在我的测试失败了,我可以编写修复测试的代码。

【讨论】:

  • 或者,如果你想在没有 C++ 11 或 14 的情况下做类似的事情......可能有一种方法可以用 boost::asio::io_service 做类似的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多