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

2024-03-23

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


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

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

结果是

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

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

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

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

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

图形密集型课程是臭名昭著地 http://c2.com/cgi/wiki?GuiUnitTesting hard http://c2.com/cgi/wiki?GuiTesting to test http://c2.com/cgi/wiki?GuiTestingGameApps。从链接页面收集一些建议,我建议(1)尽可能分离逻辑和表示,以及(2)不要在太低的级别进行测试。

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 qt 图形视图小部件/项目进行单元测试 的相关文章

  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • 如何以编程方式创建 Spring 上下文?

    有谁知道是否有任何方法可以以编程方式创建 bean 上下文 我希望能够做类似的事情 ConfigurableApplicationContext c new ConfigurableApplicationContext BeanDefini
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 如何通过 NUnit 有效地对使用 ADO.NET 和 SQL Server 的 DAL 进行单元测试?

    因此 您在 C 中有一个使用存储库模式的 DAL 并且每个存储库都有一个接口 它由 ADO NET MS SQL Server 和存储过程调用支持 这对于在进行单元测试时对正在其他地方使用的存储库进行存根 模拟非常有用 我喜欢它 不过 我很
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 使用文件 IO 的单元测试方法

    我正在努力养成编写单元测试的习惯 我之前写过一些 但它们通常都很基础 我想开始转向 TDD 因为我想提高质量我的代码 设计和结构 减少耦合 同时希望减少可测试构建的回归数量 我从一个相对简单的项目开始 生成的程序监视一个文件夹 然后对该文件
  • 使用内联查询进行单元测试

    我知道有几个问题与我的类似 Dapper 单元测试 SQL 查询 https stackoverflow com questions 20461553 dapper unit testing sql queries 测试简洁的查询 http
  • 如何在 Angular 单元测试中模拟/触发 $routeChangeSuccess?

    给定一个附加到 routeChangeSuccess 事件的处理程序来更新 rootScope 上的 title 属性 rootScope on routeChangeSuccess function event current previ
  • 我的单元测试 ReSharper 装订线图标未显示

    我已经安装了 ReSharper 4 1 和 Gallio 3 0 5 但没有获得单元测试的装订线图标 测试似乎在测试资源管理器中运行良好 但代码中的测试旁边没有图标 可能是什么原因造成的 我之前安装了 MbUnit 2 4 ReSharp
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 如何检查带有通配符的模拟调用?

    我正在编写单元测试 并且想要检查具有函数对象的调用 如下所示 call u mock u foobar
  • 如何在 Java Spring 中模拟 RestTemplate?

    public class ServiceTest Mock RestTemplate restTemplate new RestTemplate InjectMocks Service service new Service Respons
  • 测试 Python 脚本

    如何使用 doctest unittest nose 等测试框架测试 Python 脚本的 STDOUT 输出 例如 假设运行我的脚本 todo py list 应该返回 取出垃圾 我读过有人将脚本的 STDOUT 打印部分与生成要打印的输
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect

随机推荐