Qt单元测试闪退ASSERT: “false“ in file qtestdata.cpp, line 92abort() has been called xx.exe解决方法

文章讲述了Qt单元测试过程中遇到的闪退问题,源于数据类型不匹配导致的ASSERT失败。通过将易混淆的数据类型强制转换为正确的类型(如将0转换为short),解决了测试集中的崩溃问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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") <<short0 << vec << -3.5;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值