Qt单元测试数据集闪退:ASSERT: “false” in file qtestdata.cpp, line 92abort() 解决方法
问题描述`
Qt在使用单元测试数据集时,运行测试的时候闪退。看输出记录,错误原因是
qtestdata.cpp(92) : ASSERT: “false” in file qtestdata.cpp, line 92abort() has been called“xxx.exe”(Win32):
下面是发生错误的源码。
QTest::addColumn<short>("expectResult");
QTest::addColumn<QVector<short>>("vec");
QTest::addColumn<double>("target");
QVector<short> vec;
for (short i = 0; i < 100; i++)
{
vec << i;
}
QTest::newRow("lower low bound") << 0 << vec << -3.5;
QTest::newRow("higher high bound") << 99 << vec << 155.55;
原因分析:
根据错误方面的提示。我们找到对应qtestdata.cpp文件,找到92行。发现此处的代码是这样的。
void QTestData::append(int type, const void *data)
{
QTEST_ASSERT(d->dataCount < d->parent->elementCount());
if (d->parent->elementTypeId(d->dataCount) != type) {
qDebug("expected data of type '%s', got '%s' for element %d of data with tag '%s'",
QMetaType::typeName(d->parent->elementTypeId(d->dataCount)),
QMetaType::typeName(type),
d->dataCount, d->tag);
QTEST_ASSERT(false); //这里是92行
}
d->data[d->dataCount] = QMetaType::create(type, data);
++d->dataCount;
}
这几行代码的意思是,如果数值与类型不匹配。就执行92行的断言。退出程序。
再来看代码插入数据的方式。
QTest::newRow("lower low bound") << 0 << vec << -3.5;
我们本意是想插入short类型的0。结果qt单元测试系统给我们识别成了别的类型(极有可能是int)。从而导致程序崩溃。
解决方案:
再插入的时候,把0强转为short,成功解决!
如果有这种容易混淆的数据类型做单元测试数据集的话,还是强转一下比较好。
QTest::newRow("lower low bound") << (short)0 << vec << -3.5;