CppUnit 测试在 Qt 5.9 中挂起
CppUnit test hangs with Qt 5.9
将我们的源代码从 Qt 5.6 移植到 Qt 5.9.1 时,使用 CppUnit 1.13.2 进行测试时出现了一个问题:DllPluginTester.exe
在完成所有单元测试后挂起。调试进程时,堆栈显示
CppUnit::DynamicLibraryManager::doReleaseLibrary()
卡在调用 ::FreeLibrary
中,堆栈进一步挂起在 QThread::wait()
,即 WaitForSingleObject
永远等待。
有人知道什么会导致这种行为吗?
我找到了导致该问题的原因:c.f。 QTBUG-34460。
我不知道为什么在从 Qt 版本 5.6 移动到 5.9.1 之前没有发现这个问题,因为这个错误已经在版本 5.1.1 中报告过。因此调查需要一些时间。
对于受影响的测试 - 所有这些都涉及某种多线程,例如通过在某处调用 QtConcurrent::run()
- 我在每个受影响的测试结束时插入了以下几行作为我的解决方案:
void UnitTestClass::testWithMultithreadingInside
{
...
constexpr auto MAX_WAIT_MS = 5000;
auto pool = QThreadPool::globalInstance();
if (pool)
{
pool->clear();
pool->waitForDone(MAX_WAIT_MS);
}
}
将我们的源代码从 Qt 5.6 移植到 Qt 5.9.1 时,使用 CppUnit 1.13.2 进行测试时出现了一个问题:DllPluginTester.exe
在完成所有单元测试后挂起。调试进程时,堆栈显示
CppUnit::DynamicLibraryManager::doReleaseLibrary()
卡在调用 ::FreeLibrary
中,堆栈进一步挂起在 QThread::wait()
,即 WaitForSingleObject
永远等待。
有人知道什么会导致这种行为吗?
我找到了导致该问题的原因:c.f。 QTBUG-34460。 我不知道为什么在从 Qt 版本 5.6 移动到 5.9.1 之前没有发现这个问题,因为这个错误已经在版本 5.1.1 中报告过。因此调查需要一些时间。
对于受影响的测试 - 所有这些都涉及某种多线程,例如通过在某处调用 QtConcurrent::run()
- 我在每个受影响的测试结束时插入了以下几行作为我的解决方案:
void UnitTestClass::testWithMultithreadingInside
{
...
constexpr auto MAX_WAIT_MS = 5000;
auto pool = QThreadPool::globalInstance();
if (pool)
{
pool->clear();
pool->waitForDone(MAX_WAIT_MS);
}
}