防止退出/死亡测试

问题描述 投票:0回答:1

我正在使用 googletest 来测试多线程代码

std::thread
。在损坏的代码中,经常会发生
std::thread
在线程加入之前被销毁,从而导致程序终止。不幸的是,测试框架没有捕获这种情况,因此停止执行。测试用例未标记为失败。

例如:

#include <thread>
using namespace std::literals::chrono_literals;

TEST( ThreadDeathTest, death )
{
    std::thread t([] {
        std::this_thread::sleep_for(2s);
    });
    // exiting scope destroys thread, causing terminate()
}

输出:

$ctmltest --gtest_filter=ThreadDeathTest.death
Note: Google Test filter = ThreadDeathTest.death
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from ThreadDeathTest
[ RUN      ] ThreadDeathTest.death

$

我读过有关死亡测试的内容,但我认为这不适用于我的案例:我期望我的所有测试用例没有死亡

有没有办法告诉 googletest 注意终止,就像死亡测试一样?

c++ multithreading c++11 concurrency googletest
1个回答
0
投票

如果您顽固地使用google死亡测试,您可以在包含对

EXPECT_EXIT
的调用的复合语句上编写
ASSERT_EXIT
exit(0);
。像这样:

class BadThread {
public:
    void run() { std::cout << "run()\n"; }
    void die() { std::thread t([]() { std::cout << "die!\n"; } );
    }
};

TEST(MyDeathTest, xxx) {
    GTEST_FLAG_SET(death_test_style, "threadsafe");
    BadThread sut;
    EXPECT_EXIT(
        {
            sut.die();
            std::exit(0);
        },
        testing::ExitedWithCode(0), "");
    EXPECT_EXIT(
        {
            sut.run();
            std::exit(0);
        },
        testing::ExitedWithCode(0), "");
}

在第一次失败的期望之后,您的测试(和其他测试用例)将继续,然后优雅地完成并报告失败。但是,请阅读死亡测试文档并了解所有注意事项。

© www.soinside.com 2019 - 2024. All rights reserved.