如何对Qt图形视图小部件/项进行单元测试

8

我有一个应用程序,它在Qt4中广泛使用了graphicsview架构,并且我想开始对ui组件进行自动化测试,但是我找不到任何与测试qgraphicsview / qgraphicswidget基础类相关的资源,也不知道应该测试什么或如何测试。

1个回答

11

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

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

结果为

鼠标事件"MousePress"未被接收小部件接受

被写入到控制台,并且我的事件处理程序从未被调用。我找到的解决办法是将事件发送到视口而不是QGraphicsView本身:

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

这样可以将事件正确地发送到我的QGraphicsView子类。这样,您就可以从高层次测试整个图形视图,以确保您的图形项适当地接收事件。

现在,进入您真正关心的问题。

图形密集型类通常 很难进行测试。从链接页面中获取一些建议,我建议(1)尽可能分离逻辑和表示,并且(2)不要在太低的级别进行测试。

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

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

然后,您需要让您的mousePressEvent方法从QGraphicsSceneMouseEvent中提取相关信息并调用自己的pressed方法。您的测试将使用您的方法,您就不必担心创建人工QGraphicsSceneEvents了。
然而,要测试的问题要复杂得多。例如,您不希望在测试中硬编码图形项的位置。当图形引擎在您下面更改并且您的项目稍微不同地呈现时会发生什么?相反,您应该集中精力进行语义上有意义的测试。这两个对象是否发生碰撞?当我选择它时,这个项目的颜色会改变吗?
这里的基本思想是在应用程序的语义级别设计和测试您的类,而不是在QGraphicsView级别。您可能希望拥有少量的良好构建的测试,以测试您将QGraphicsSceneEvents转换为应用程序事件的方式,但请注意,这些测试比大多数测试更容易受到破坏。

有关我的链接问题,你有什么想法吗?使用viewport()似乎无法将QGraphicsItem设置为使用此方法的鼠标抓取项。 - paulm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接