QTest 覆盖漆法
Posted
技术标签:
【中文标题】QTest 覆盖漆法【英文标题】:QTest covering paint method 【发布时间】:2019-05-22 07:50:25 【问题描述】:我有自定义的 QWidgets,所有的绘画都是手动完成的(fillRect、drawRect、drawText、drawPixmap..)。多达 120 个属性会影响将要绘制的内容、闪烁方式等。旧式意大利面条代码。
当我改变某些东西时,我想首先测试覆盖旧功能。有没有推荐的方法如何用单元测试覆盖QWidget::paintEvent(QPaintEvent* event)
?我必须模拟 QPainter,还是有办法检查paintEvent 输出?
你是如何用测试覆盖paintEvetnt的?
【问题讨论】:
您可以截取小部件的屏幕截图并进行比较。 IMO,这是测试事物呈现方式的最佳和最精确的方法。 @vahancho 在 QTestlib 中是否有这样做的标准方法?还是通过自己的方法(或外部库)逐像素比较? 这并不像看起来那么难。存储当前小部件的基线图像。当您更改某些内容时,请截取小部件的屏幕截图,例如带有QPixmap::grabWidget()
功能。将像素图转换为QImage
并将其与基线图像进行比较:QImage::operator!=()
。这只会告诉你它们是否不同。为了查看差异,您需要编写自己的函数并使用一些工具。
单元测试 UI 通常是在浪费时间和痛苦......如果您可以提取小部件逻辑,则应该对其进行测试。
【参考方案1】:
最后存储和比较图像,如:
auto configuredImage = widgetUnderTest->grab().toImage();
QImage sampleImage;
sampleImage.load("src/Images/configuredImage.png");
QCOMPARE(configuredImage, sampleImage);
【讨论】:
以上是关于QTest 覆盖漆法的主要内容,如果未能解决你的问题,请参考以下文章
QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时