Qt 单元测试:指针列表上的 QCOMPARE 函数

Qt unit testing: QCOMPARE function on list of pointers

Qt 测试框架是否支持比较指针列表或者我做错了什么?

我的单元测试源码如下:

QList<QString *> list1;
QList<QString *> list2;

list1.append(new QString("test"));
list2.append(new QString("test"));

QCOMPARE(list1, list2);

在 运行 这个测试之后,我期待通过测试,但是测试失败并显示以下输出:

********* Start testing of ConfigurationTest *********
Config: Using QtTest library 5.5.1, Qt 5.5.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.4.0 20160609)
FAIL!  : ConfigurationTest::test_sample(default) Compared lists differ at index 0.
   Actual   (list1): <null>
   Expected (list2): <null>
   Loc: [../unittest/sample_test.cpp(32)]
Totals: 0 passed, 1 failed, 0 skipped, 0 blacklisted
********* Finished testing of ConfigurationTest *********

如果列表包含非指针元素,QCOMPARE 不会有任何问题,returns "passed" 输出。

docs 中,您可以读到 QCOMPARE 使用比较运算符来比较值:

The QCOMPARE macro compares an actual value to an expected value using the equals operator.

QListworks in the same way.

这意味着如果您的列表存储指针,则使用指针比较运算符,而不是底层对象的比较运算符(即比较指针的值,而不是指向的对象的值)。当指针指向同一对象时,指针比较相等,在您的情况下,您有两个不同的对象,因此即使对象的内容相同,它们也不相等。

所以答案是:QCOMPARE 确实支持比较指针列表 - 它只是无法按您预期的方式工作。指针比较规则详解here.