【发布时间】:2011-03-09 07:29:17
【问题描述】:
我有一个在 Qt4 中广泛使用 graphicsview 架构的应用程序,我想开始自动测试 ui 组件,但我找不到与我应该测试的 what 相关的任何资源或者如何测试基于 qgraphicsview/qgraphicswidget 的类?
【问题讨论】:
标签: unit-testing qt qgraphicsview
我有一个在 Qt4 中广泛使用 graphicsview 架构的应用程序,我想开始自动测试 ui 组件,但我找不到与我应该测试的 what 相关的任何资源或者如何测试基于 qgraphicsview/qgraphicswidget 的类?
【问题讨论】:
标签: unit-testing qt qgraphicsview
我在尝试对 QGraphicsView 进行单元测试时遇到了问题。我最大的问题是
QTest::mousePressEvent(view, Qt::LeftButton, 0);
结果
接收小部件不接受鼠标事件“MousePress”
被写入控制台,而我的事件处理程序永远不会被调用。我找到的解决方案是将事件发送到视口,而不是 QGraphicsView 本身:
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0);
它应该将事件发送到我的QGraphicsView 子类。这应该可以让您从高级别测试整个图形视图,以确保您的图形项正确接收事件。
现在,谈谈你真正的问题。
图形密集型课程是 notoriously hard 到 test。从链接页面中收集一些建议,我建议 (1) 尽可能将逻辑和表示分开,以及 (2) 不要在太低的级别上进行测试。
无论如何,将逻辑与表示分离通常是一种很好的做法,但是当您的大部分逻辑都用于创建表示时,这可能会很困难!对于 QGraphicsItem 对象,我们没有方便的 QTest 函数来为我们模拟事件。因此,设计您的类以使用您可以在测试期间实际构建的类型来响应语义上有意义的事件,而不是 QGraphicsSceneEvent 子类,例如,使用
void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last)
然后让您的mousePressEvent 方法从 QGraphicsSceneMouseEvent 中提取相关信息并调用您自己的pressed 方法。然后您的测试将使用您的方法,您不必担心创建人工 QGraphicsSceneEvents。
不过,什么要测试的问题要困难得多。例如,您不希望将图形项的位置硬编码到测试中。当图形引擎从您下方更改并且您的项目呈现略有不同时会发生什么?相反,您应该专注于语义上有意义的测试。这两个物体会碰撞吗?当我选择它时,它的颜色会改变吗?
这里的基本思想是在应用程序语义级别而不是 QGraphicsView 级别设计和测试您的类。您可能需要少量构建良好的测试来测试您将 QGraphicsSceneEvents 转换为应用程序的事件,但要了解这些测试将比您的大多数测试更脆弱。
【讨论】: