我正在使用 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 注意终止,就像死亡测试一样?
如果您顽固地使用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), "");
}
在第一次失败的期望之后,您的测试(和其他测试用例)将继续,然后优雅地完成并报告失败。但是,请阅读死亡测试文档并了解所有注意事项。