Мій підхід до тестування GUI розвивається, як і галузевий консенсус. Але я думаю, що кілька ключових прийомів починають з'являтися.
Я використовую одну або декілька цих методик, залежно від ситуації (наприклад, що це за GUI, як швидко його потрібно побудувати, хто буде кінцевим користувачем тощо).
Тестування вручну. У вас завжди працює графічний інтерфейс, працюючи над кодом, і переконайтеся, що він синхронізований з кодом. Ви вручну тестуєте та повторно перевіряєте частину, над якою працюєте, працюючи над нею, перемикаючись між кодом та запущеним додатком. Кожен раз, коли ви виконуєте якусь істотну роботу, ви даєте на весь екран або область програми загальний тест, щоб переконатися, що немає регресій.
Блок тестування. Ви пишете тести на функції або невеликі одиниці поведінки GUI. Наприклад, вашим графікам може знадобитися обчислити різні відтінки кольору на основі "базового" кольору. Ви можете витягнути цей обчислення у функцію і написати для неї тест одиниці. Ви можете шукати таку логіку в графічному інтерфейсі (особливо логічну для повторного використання) та витягувати її в стримані функції, які можна легше перевірити. Навіть складну поведінку можна витягнути і перевірити таким чином - наприклад, послідовність кроків майстра може бути вилучена до функції, а тестова одиниця може перевірити, що за умови введення повертається правильний крок.
Провідник компонентів. Ви створюєте екран "explorer", єдиною ролю якого є демонстрація кожного з повторно використовуваних компонентів, що складають ваш графічний інтерфейс. Цей екран дає вам швидкий та простий спосіб візуально перевірити, чи має кожен компонент правильний вигляд. Провідник компонентів є більш ефективним, ніж вручну переглядати всю вашу програму, тому що A) вам потрібно лише один раз перевірити кожен компонент, і B) вам не доведеться переходити вглиб програми, щоб побачити компонент, ви можете просто переглянути і перевірити це негайно.
Тестування автоматизації. Ви пишете тест, який взаємодіє з екраном або компонентом, імітуючи клацання миші, введення даних тощо, стверджуючи, що програма функціонує правильно з урахуванням цих маніпуляцій. Це може бути корисним як додатковий тест резервного копіювання для збору потенційних помилок, які можуть пропустити ваші інші тести. Я схильний зарезервувати тестування автоматизації для частин графічного інтерфейсу, які найбільш схильні до злому та / або вкрай критичні. Частини, де я хочу дізнатися якомога раніше, якщо щось зламалося. Це може включати дуже складні інтерактивні компоненти, вразливі до зламу або важливі основні екрани.
Тестування різниць / знімків. Ви пишете тест, який просто фіксує вихід у вигляді скріншоту або як HTML-код і порівнює його з попереднім результатом. Таким чином, ви оповіщаєте вас щоразу, коли вихід змінюється. Тести на відмінності можуть бути корисними, якщо візуальний аспект вашого графічного інтерфейсу складний та / або може бути змінений. У такому випадку ви хочете швидкого та візуального відгуку про те, який вплив дана зміна має на графічний інтерфейс в цілому.
Замість того, щоб важко використовувати всі можливі види тесту, я вважаю за краще вибирати та вибирати техніку тестування виходячи з того, що я працюю. Отже, в одному випадку я витягну просту функцію і тестую її, але в іншому випадку я додам компонент до провідника компонентів і т. Д. Це залежить від ситуації.
Я не вважав, що покриття коду є дуже корисною метрикою, але інші, можливо, знайшли для нього застосування.
Я думаю, що перший захід - це кількість та серйозність помилок. Ваш перший пріоритет - це, мабуть, програма, яка працює правильно. Якщо програма функціонує правильно, помилок має бути небагато. Якщо помилок багато або серйозно, то, імовірно, ви або не тестуєте, або ваші тести не є ефективними.
Крім зменшення помилок, існують і інші заходи, такі як продуктивність, зручність використання, доступність, ремонтопридатність, розширюваність тощо. Вони залежать від того, який саме додаток ви будуєте, бізнес, кінцевий користувач тощо.
Все це базується на моєму особистому досвіді і дослідженнях, а також велику запис-вгору на тестах UI по Ham Vocke .