Мой подход к тестированию GUI развивается, так же как и консенсус в отрасли. Но я думаю, что несколько ключевых методов начинают появляться.
Я использую один или несколько из этих методов, в зависимости от ситуации (например, какой это GUI, как быстро его нужно создать, кем будет конечный пользователь и т. Д.).
Ручное тестирование. У вас всегда работает графический интерфейс при работе с кодом, и убедитесь, что он синхронизирован с кодом. Вы вручную тестируете и повторно тестируете часть, над которой работаете, когда вы работаете над ней, переключаясь между кодом и запущенным приложением. Каждый раз, когда вы выполняете какую-то значительную часть работы, вы проводите общий тест на весь экран или область приложения, чтобы убедиться в отсутствии регрессий.
Модульное тестирование. Вы пишете тесты для функций или небольших модулей поведения GUI. Например, вашим графикам может потребоваться рассчитать различные оттенки цвета на основе «базового» цвета. Вы можете извлечь это вычисление в функцию и написать для него модульный тест. Вы можете искать подобную логику в графическом интерфейсе (особенно многократно используемую логику) и извлекать ее в дискретные функции, которые легче тестировать модулем. Даже сложное поведение может быть извлечено и протестировано таким образом - например, последовательность шагов в мастере может быть извлечена для функции, и модульный тест может проверить, что, при вводе, возвращается правильный шаг.
Компонент проводник. Вы создаете экран «проводника», единственная роль которого заключается в демонстрации каждого из повторно используемых компонентов, составляющих ваш графический интерфейс. Этот экран дает вам быстрый и простой способ визуально убедиться, что каждый компонент имеет правильный внешний вид. Компонент проводника более эффективен, чем ручной просмотр всего приложения, потому что A) вам нужно проверить каждый компонент только один раз, и B) вам не нужно углубляться в приложение, чтобы увидеть компонент, вы можете просто просмотреть и проверьте это немедленно.
Автоматизация тестирования. Вы пишете тест, который взаимодействует с экраном или компонентом, имитирует щелчки мыши, ввод данных и т. Д., Утверждая, что приложение работает правильно с учетом этих манипуляций. Это может быть полезно в качестве дополнительного резервного теста для выявления потенциальных ошибок, которые могут пропустить другие ваши тесты. Я склонен резервировать автоматизированное тестирование для тех частей графического интерфейса, которые наиболее подвержены взлому и / или крайне критичны. Части, где я хочу знать как можно раньше, если что-то сломалось. Это может включать очень сложные интерактивные компоненты, которые уязвимы для взлома или важных главных экранов.
Тестирование различий / снимков. Вы пишете тест, который просто захватывает вывод в виде скриншота или в виде HTML-кода и сравнивает его с предыдущим выводом. Таким образом, вы будете предупреждены всякий раз, когда вывод изменится. Тесты различий могут быть полезны, если визуальный аспект вашего графического интерфейса пользователя сложен и / или подвержен изменениям, и в этом случае вы хотите получить быструю и визуальную обратную связь о том, какое влияние данное изменение оказывает на графический интерфейс в целом.
Вместо того, чтобы жестко использовать всевозможные виды тестов, я предпочитаю выбирать технику тестирования в зависимости от того, над чем я работаю. Таким образом, в одном случае я извлеку простую функцию и протестирую ее, но в другом случае я добавлю компонент в проводник компонентов и т. Д. Это зависит от ситуации.
Я не нашел охват кода очень полезным показателем, но другие, возможно, нашли его применение.
Я думаю, что первая мера - это количество и серьезность ошибок. Ваш первый приоритет, вероятно, иметь приложение, которое работает правильно. Если приложение работает правильно, ошибок должно быть мало или не должно быть. Если есть много или серьезные ошибки, то, вероятно, вы либо не тестируете, либо ваши тесты неэффективны.
Помимо устранения ошибок, существуют и другие меры, такие как производительность, удобство использования, доступность, ремонтопригодность, расширяемость и т. Д. Они будут различаться в зависимости от того, какое приложение вы создаете, бизнес, конечный пользователь и т. Д.
Все это основано на моем личном опыте и исследованиях, а также большую запись-вверх на тестах UI по Ham Vocke .