我有一个在 Qt4 中广泛使用 graphicsview 架构的应用程序,我想开始对 ui 组件进行自动化测试,但我找不到任何与我应该测试的内容或如何测试基于 qgraphicsview/qgraphicswidget 的类相关的资源?
1 回答
我在尝试对 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 转换为应用程序的事件,但要了解这些测试将比您的大多数测试更脆弱。