如何单元测试qt图形视图小部件/项目

时间:2011-01-05 20:20:40

标签: unit-testing qt qgraphicsview

我有一个应用程序在Qt4中广泛使用了graphicsview架构,我想开始自动测试ui组件,但我找不到任何与我应该测试的相关的资源或者如何测试基于qgraphicsview / qgraphicswidget的类?

1 个答案:

答案 0 :(得分:8)

我在尝试单元测试QGraphicsView时遇到了问题。我最大的问题是

QTest::mousePressEvent(view, Qt::LeftButton, 0);

结果

  

接收小部件不接受鼠标事件“MousePress”

写入控制台,我的事件处理程序永远不会被调用。我发现的解决方案是将事件发送到视口,而不是QGraphicsView本身:

QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0);

将事件发送到我的QGraphicsView子类。这应该允许您从高级别测试整个图形视图,以确保您的图形项目正确地接收事件。

现在,回答你真正的问题。

图形密集型课程为notoriously hardtest。从链接页面中收集一些建议,我建议(1)尽可能地分离逻辑和表示,(2)不要在太低的水平上进行测试。

无论如何,将逻辑与表示分离通常都是很好的做法,但是当你的大部分逻辑花在创建演示文稿上时可能会很困难!在QGraphicsItem对象的情况下,我们没有方便的QTest函数来为我们模拟事件。因此,设计您的类以使用您可以在测试期间实际构造的类型来响应具有语义意义的事件,而不是QGraphicsSceneEvent子类,例如,使用

void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last)

然后让您的mousePressEvent方法从QGraphicsSceneMouseEvent中提取相关信息,并调用您自己的pressed方法。然后,您的测试将使用您的方法,您不必担心创建人工QGraphicsSceneEvents。

但是,测试什么的问题要困难得多。例如,您不希望将图形项的位置硬编码到测试中。当图形引擎从您的下方发生变化并且您的项目呈现略有不同时会发生什么?相反,你应该专注于语义上有意义的测试。这两个物体是否相撞?选择它时,此项目的颜色会发生变化吗?

这里的基本思想是在应用程序的语义级别设计和测试类,而不是QGraphicsView的级别。您可能需要一些构造良好的测试来测试您对应用程序事件的QGraphicsSceneEvents的翻译,但要了解这些测试会比大多数测试更脆弱。