Как я могу модульно протестировать графический интерфейс?

StackOverflow https://stackoverflow.com/questions/215458

  •  03-07-2019
  •  | 
  •  

Вопрос

Вычисления в моем коде хорошо протестированы, но из-за большого количества графического интерфейса мой общий охват кода ниже, чем хотелось бы.Существуют ли какие-либо рекомендации по модульному тестированию графического интерфейса пользователя?Есть ли в этом вообще смысл?

Например, в моем приложении есть графики.Я не смог понять, как автоматизировать тестирование графиков.Нужен человеческий глаз, AFAIK, чтобы проверить, верен ли график.

(Я использую Java Swing)

Это было полезно?

Решение

Такие конструкции, как MVP и MVC, обычно пытаются абстрагировать как можно больше логики от реального графического интерфейса. Одна очень популярная статья об этом - «Диалоговое окно« Смирение »» Майкла Фезерса. Лично у меня был неоднозначный опыт с попыткой вывести логику из пользовательского интерфейса - иногда это работало очень хорошо, а иногда это было больше проблем, чем оно того стоило. Хотя это несколько выходит за рамки моей компетенции.

Другие советы

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

При этом я давно слышал от коллеги, что когда SGI портировал OpenGL на новое оборудование, у них было несколько модульных тестов, которые выводили на экран набор примитивов, а затем вычисляли сумму MD5 кадровый буфер. Затем это значение можно сравнить с известными хорошими значениями хеш-функции, чтобы быстро определить, является ли API точным на пиксель.

Вы можете попробовать UISpec4J - библиотеку функционального и / или модульного тестирования с открытым исходным кодом для Java-приложений на основе Swing. ...

Вот несколько советов:

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

Для графики вы должны проверить значение, которое вы указываете в коде, который генерирует графику.

Вы можете попробовать использовать огурец и Swinger для написания функциональных приемочных тестов на английском языке для приложений Swing с графическим интерфейсом. Swinger использует библиотеку Джемми из Netbeans для управления приложением.

Cucumber позволяет писать тесты следующим образом:

 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!"

Посмотрите это демонстрационное видео Swinger , чтобы увидеть его в действии.

Существует Selenium RC , который автоматизирует тестирование веб-интерфейса. Он будет записывать действия и воспроизводить их. Вам все равно нужно будет пройти через взаимодействие с вашим пользовательским интерфейсом, так что это не поможет с покрытием, но его можно использовать для автоматизированных сборок.

Тестирование - это искусство. Я согласен, логика должна быть удалена GUI, насколько это возможно. Затем мы можем сосредоточить наше тестирование там. Как и все остальное, тестирование сводится к снижению риска. Вам не всегда нужно тестировать все, но часто лучше разбить разные тесты для разных областей.

Другой вопрос: что вы на самом деле пытаетесь протестировать на уровне пользовательского интерфейса? Тестирование пользовательского интерфейса - самое дорогое тестирование, потому что оно обычно требует больше времени для создания, обслуживания и является самым хрупким. Если вы проверяете логику, чтобы узнать правильность координат, прежде чем пытаться нарисовать линию, что конкретно вы тестируете? Если вы хотите проверить график с красной линией. Можете ли вы дать ему набор заданных координат и проверить, являются ли определенные пиксели красными или не красными? Как было предложено выше, сравнение растровых изображений работает, Selenium, но моя главная задача - не чрезмерное тестирование графического интерфейса, а тестирование логики, которая поможет создать пользовательский интерфейс, а затем сосредоточиться на том, какая часть пользовательского интерфейса ломается или подозрительно, и сосредоточить несколько тестов. есть.

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

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

Фреймворки модульного тестирования предоставляют способ автоматизированного тестирования, но я думаю, что тип тестов, которые вы хотите сделать, - это сложные интеграционные тесты, которые проверяют правильное поведение множества классов, среди которых классы вашего инструментария / библиотеки GUI. , который вы не должны испытывать.

Ваши параметры в значительной степени зависят от того, какие платформы / наборы инструментов / платформы вы используете: например, приложение, использующее Qt в качестве среды графического интерфейса пользователя, может использовать Squish для автоматизации своих тестов. Вы проверяете результаты своих тестов один раз, а последующие автоматически выполняемые тесты сравнивают результаты с проверенными результатами.

Window Licker для Swing & amp; Ajax

Из того, что я знаю, это довольно сложно и действительно зависит от языка - многие языки имеют свой собственный способ тестирования GUI, но если вам действительно нужно протестировать GUI (в отличие от взаимодействия модели / gui), вам часто приходится имитировать реального пользователя, нажимающего кнопки.Например, платформа SWT, используемая в Eclipse, предоставляет SWTBot ( свбот ), Подразделение JFCUnit как уже упоминалось, у Mozilla есть свой собственный способ симуляции этого в XUL (и из того, что я читал в их блогах, эти тесты кажутся довольно хрупкими).

Иногда вам приходится делать скриншот и тестировать пиксельный рендеринг (я полагаю, что Mozilla делает это для проверки корректности отображения страниц) - это требует более длительной настройки, но может быть тем, что вам нужно для графиков.Таким образом, когда вы обновляете свой код и тест прерывается, вам приходится вручную проверять изображение, был ли сбой реальным, или вы улучшили код рендеринга графика, чтобы генерировать более красивые графики, и вам нужно обновить скриншоты.

Если вы используете Swing, FEST-Swing полезен для управления вашим графическим интерфейсом и проверка утверждений. Это довольно просто для тестирования таких вещей, как " если я нажимаю кнопку A, должно отображаться диалоговое окно B " или " если я выбираю вариант 2 из раскрывающегося списка, все флажки должен быть отменен " .

Сценарий графика, который вы упоминаете, не так легко проверить. Довольно просто получить покрытие кода для компонентов GUI, просто создав и отобразив их (и, возможно, управляя ими с помощью FEST). Тем не менее, создание значимых утверждений является сложной частью (и охват кода без значимых утверждений является упражнением в самообмане). Как проверить, что график не был нарисован вверх дном или слишком мал?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top