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 覆盖漆法的主要内容,如果未能解决你的问题,请参考以下文章

QTEST_MAIN 不使用提供的 Testclass

QTest 单元测试框架

QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时

如何从 QTest 单元测试中编辑 QTableView 单元格?

QTest大会Qunit新标签-你值得拥有

测试覆盖率