Метод покрытия QTest методом окраски

У меня есть пользовательские QWidgets, где все рисование выполняется вручную (fillRect, drawRect, drawText, drawPixmap..). Существует до 120 свойств, влияющих на то, что будет краской, как она будет мигать и так далее. Устаревший спагетти-код.

Когда я что-то меняю, я хотел бы сначала протестировать старую функциональность. Есть ли рекомендуемый способ покрытия QWidget::paintEvent(QPaintEvent* event) модульными тестами? Должен ли я издеваться над QPainter или есть способ проверить вывод paintEvent?

Как вы покрываете paintEvetnt тестами?


person Libor Tomsik    schedule 22.05.2019    source источник
comment
Вы можете сделать скриншоты своего виджета и сравнить их. ИМО, это лучший и самый точный способ проверить, как вещь визуализируется.   -  person vahancho    schedule 22.05.2019
comment
@vahancho Есть ли стандартный способ сделать это в QTestlib? Или попиксельное сравнение собственным методом (или внешней библиотекой)?   -  person Libor Tomsik    schedule 22.05.2019
comment
Это не так сложно, как кажется. Сохраните базовое изображение вашего текущего виджета. Когда вы что-то меняете, делайте скриншот виджета, например. с функцией QPixmap::grabWidget(). Преобразуйте растровое изображение в QImage и сравните его с исходным изображением: QImage::operator!=(). Это только скажет вам, отличаются они или нет. Чтобы увидеть различия, вам нужно написать свою собственную функцию использования какого-либо инструмента.   -  person vahancho    schedule 22.05.2019
comment
модульное тестирование пользовательского интерфейса обычно является пустой тратой времени и болью в... Если вы можете извлечь логику виджета, это следует протестировать.   -  person Marek R    schedule 22.05.2019


Ответы (1)


Наконец, сохранение и сравнение изображений, таких как:

auto configuredImage = widgetUnderTest->grab().toImage();
QImage sampleImage;      
sampleImage.load("src/Images/configuredImage.png");
QCOMPARE(configuredImage, sampleImage);
person Libor Tomsik    schedule 22.05.2019