Как я могу модульно протестировать графический интерфейс?
вычисления в моем коде хорошо протестированы, но поскольку есть так много кода GUI, мой общий охват кода ниже, чем я хотел бы. Существуют ли какие-либо рекомендации по модульному тестированию графического кода? Это вообще имеет смысл?
например, в моем приложении есть графики. Я не смог понять, как автоматизировать тестирование графиков. Требуется человеческий глаз, АФАИК, чтобы проверить правильность графика.
(Я использую Java Swing)
12 ответов:
такие проекты, как MVP и MVC, обычно пытаются абстрагировать как можно больше логики из фактического графического интерфейса. Одна очень популярная статья об этом - "Скромное Диалоговое Окно" Майкл перья. Лично у меня был смешанный опыт с попыткой переместить логику из пользовательского интерфейса - иногда это работает очень хорошо, а в других случаях это было больше проблем, чем стоит. Хотя это несколько выходит за рамки моей компетенции.
конечно, ответ состоит в том, чтобы использовать MVC и переместить как можно больше логики из GUI.
Как говорится, Я слышал от коллеги давным-давно, что когда SGI портировал OpenGL на новое оборудование, у них была куча модульных тестов, которые рисовали набор примитивов на экран, а затем вычисляли сумму MD5 буфера кадров. Затем это значение можно сравнить с известными хорошими хэш-значениями, чтобы быстро определить, является ли API точным на пиксель.
вы можете попробовать UISpec4J-это библиотека функционального и/или модульного тестирования с открытым исходным кодом для приложений Java на основе Swing...
вот несколько советов:
Попробуйте удалить большинство кода, который вы можете из графического интерфейса (есть контроллер и объект модели) таким образом, вы сможете проверить их без графического интерфейса.
для графика следует проверить значение, которое вы предоставляете коду, генерирующему график.
вы можете попробовать использовать огурец и свингер для написания функциональных приемочных тестов на простом английском языке для приложений Swing GUI. Свингер использует библиотеку Netbeans' Jemmy под капотом, чтобы управлять приложением.
огурец позволяет писать тесты следующим образом:
Scenario: Dialog manipulation Given the frame "SwingSet" is visible When I click the menu "File/About" Then I should see the dialog "About Swing!" When I click the button "OK" Then I should not see the dialog "About Swing!"взгляните на это свингер видео демо чтобы увидеть его в действии.
здесь Selenium RC, что позволит автоматизировать тестирование веб-интерфейса. Он будет записывать действия и воспроизводить их. Вам все равно нужно будет пройти через взаимодействие с вашим пользовательским интерфейсом, поэтому это не поможет с покрытием, но его можно использовать для автоматических сборок.
тестирование-это форма искусства. Я согласен, что логика должна быть удалена GUI как можно больше. Затем мы можем сосредоточить наше модульное тестирование там. Как и все остальное тестирование заключается в снижении риска. Вам не всегда нужно тестировать все, но много раз лучше всего разбить различные испытания для разных областей.
другой вопрос, что вы действительно пытаетесь проверить на уровне пользовательского интерфейса. Тестирование пользовательского интерфейса является самым дорогим тестированием, потому что обычно требуется больше времени для создания, выдерживают и он самый хрупкий. Если вы проверяете логику, чтобы знать, что координаты верны, прежде чем пытаться нарисовать линию, что вы тестируете конкретно? Если вы хотите проверить график с красной линией. Можете ли вы дать ему набор предопределенных координат и проверить, если некоторые пиксели красные или не красные? Как было предложено выше bitmap comparisons work, Selenium, но мой основной акцент будет заключаться не в тестировании GUI, а в тестировании логики, которая поможет создать пользовательский интерфейс, а затем сосредоточиться на том, что часть пользовательского интерфейса ломается или подозревается и фокусируется на нескольких тестах.
можно использовать JFCUnit чтобы проверить свой графический интерфейс, но графика может быть более сложной задачей. Я несколько раз делал снимки своего графического интерфейса и автоматически сравнивал его с предыдущей версией. Хотя это не обеспечивает фактический тест,он предупреждает вас, если автоматическая сборка не дает ожидаемого результата.
что я понял из вашего вопроса, так это то, что вы ищете автоматизированный способ подробно проверить свое поведение графического интерфейса, пример, который вы даете, проверяет, правильно ли нарисована кривая.
платформы модульного тестирования предоставляют способ автоматизированного тестирования, но я думаю, что те тесты, которые вы хотите сделать, являются сложными интеграционными тестами, которые проверяют правильное поведение множества классов, среди которых классы вашего GUI toolkit / library, которые вы не должны хотите проверить.
ваши параметры очень сильно зависят от того, какие платформы/наборы инструментов/фреймворки вы используете: например, приложение, использующее Qt в качестве своей GUI-платформы, может использовать Squish для автоматизации своих тестов. Вы проверяете результаты своих тестов один раз, а последующие автоматически выполняемые тесты сравнивают результаты с проверенными результатами.
Window Licker для Swing & Ajax
из того, что я знаю, это довольно сложно, и действительно зависит от языка - многие языки имеют свой собственный способ тестирования GUI, но если вам действительно нужно проверить GUI (в отличие от взаимодействия модели/gui), вам часто приходится имитировать фактический пользователь, нажимая кнопки. Например, платформа SWT, используемая в Eclipse, предоставляет SWTBot,JFCUnit уже упоминалось, Mozilla имеет свой собственный способ моделирования этого в XUL (и из того, что я читал дальше их блоги, эти тесты кажутся довольно хрупкими).
иногда вам нужно сделать снимок экрана и проверить пиксель-идеальный рендеринг (я считаю, что Mozilla делает это, чтобы проверить правильность отображения страниц) - это требует более длинной настройки, но может быть то, что вам нужно для графиков. Таким образом, когда вы обновляете свой код и тест прерывается, вы должны вручную проверить изображение, если ошибка была реальной, или вы улучшили код рендеринга графика для создания более красивых графиков и должны обновите скриншоты.
Если вы используете Swing,FEST-Swing полезно для вождения вашего графического интерфейса и тестирования утверждений. Это делает его довольно простым, чтобы проверить такие вещи, как "Если я нажимаю кнопку A, должен отображаться диалог B" или "Если я выберу вариант 2 из раскрывающегося списка, все флажки должны быть сняты".
сценарий графика, который вы упомянули, не так легко проверить. Довольно легко получить покрытие кода для компонентов GUI, просто создав и демонстрируя их (и, возможно, управляя ими с FEST). Однако создание значимых утверждений является трудной частью (а покрытие кода без значимых утверждений-это упражнение в самообмане). Как вы проверяете, что график не был нарисован вверх ногами или слишком мал?
Я думаю, что вы просто должны признать, что некоторые аспекты графических интерфейсов не могут быть эффективно протестированы автоматизированными модульными тестами и что вам придется протестировать их другими способами.
Comments