Как выполнить модульное тестирование виджетов / элементов вида qt graphics - PullRequest
7 голосов
/ 05 января 2011

У меня есть приложение, которое широко использует архитектуру graphicsview в Qt4, и я хотел бы начать автоматическое тестирование компонентов пользовательского интерфейса, но я не могу найти никаких ресурсов, связанных с что я должен тестировать Как проверить классы на основе qgraphicsview / qgraphicswidget?

1 Ответ

8 голосов
/ 09 марта 2011

У меня были проблемы с попыткой модульного тестирования QGraphicsView.Моя самая большая проблема заключалась в том, что

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

приводит к тому, что

Событие мыши «MousePress» не принимается при получении виджета

при записи в консоль,и мои обработчики событий никогда не вызывают.Решение, которое я нашел, заключается в отправке события в область просмотра, а не в сам QGraphicsView:

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

, который отправляет событие в мой подкласс QGraphicsView, как и должно быть.Это должно позволить вам проверить весь графический вид с высокого уровня, чтобы убедиться, что ваши графические элементы получают события надлежащим образом.

Теперь перейдем к вашим реальным вопросам.

Графически интенсивные классы печально известен жесткий до тест .Опираясь на несколько советов на связанных страницах, я бы предложил (1) максимально разделить логику и представление, и (2) не проводить тестирование на слишком низком уровне.

Отделение логики от представления, как правило, хорошоВ любом случае попрактикуйтесь, но это может быть сложно, когда основная часть вашей логики уходит на создание презентации!В случае объектов QGraphicsItem у нас нет удобных функций QTest для имитации событий для нас.Поэтому спроектируйте свои классы так, чтобы они реагировали на семантически значимые события, используя типы, которые вы действительно можете построить во время тестов, а не подклассы QGraphicsSceneEvent, например, используйте

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

, а затем метод mousePressEvent извлекает соответствующую информацию из QGraphicsSceneMouseEvent ивызовите свой собственный метод pressed.Затем ваши тесты будут использовать ваш метод, и вам не придется беспокоиться о создании искусственного QGraphicsSceneEvents.

Однако проблема с , что для тестирования, значительно сложнее.Например, вы не захотите жестко кодировать позиции графических элементов в своих тестах.Что происходит, когда графический движок меняется из-под вас и ваши элементы отображаются немного по-другому?Вместо этого вы должны сосредоточиться на семантически значимых тестах.Эти два объекта сталкиваются?Меняется ли цвет этого элемента при его выборе?

Основная идея здесь заключается в том, чтобы разрабатывать и тестировать ваши классы на уровне семантики вашего приложения, а не на уровне QGraphicsView.Возможно, вам понадобится небольшое количество правильно построенных тестов, которые проверяют ваш перевод QGraphicsSceneEvents на события вашего приложения, но вы понимаете, что они будут более хрупкими, чем большинство ваших тестов.

...