Рівень 2. Місце тестування в процесі розробки
Рівень 2
Місце тестування в процесі розробки

Ласкаво просимо на новий рівень, мій юний падаване! Перш ніж ти відкриєш нові таємниці сили тестування, я хотів би розібрати з тобою домашнє завдання. На відео магістр Кі-Аді-Мунді покаже, як він протестував сайт із практичного завдання. Він поділиться секретами практичного тестування, розповість, на що звертати увагу і який підхід застосовувати.
Отже, приступімо до нашої теми — «Місце тестування в процесі розробки». Можливо, ти запевнятимеш, що ти ще зовсім не готовий, але вже на другому рівні тобі доведеться зустрітися із силами зла! Як ти здогадуєшся, головні сили зла — це програмісти, або розробники. Саме вони створюють підступний код, у якому живуть усі ці жахливі баги.
Хтось скаже, що в житті вони добродушні бородаті товстуни, які й мухи не скривдять. І це теж правда. Але на полі розробки ПЗ вони — наші головні вороги.
Мій юний падаване, сьогодні ми вирушаємо на ризиковану місію: ми спостерігатимемо, як іде процес на Зорі Смерті (у програмістів), і порівнюватимемо їхній робочий процес із нашим, щоб бути максимально ефективними. Адже ворога треба знати краще, ніж друга!
Стадії тестування та розробки
Далі — схема організації взаємодії розробки та тестування ПЗ. Про кожен етап можна дізнатися докладніше, перейшовши за посиланням, хоча з більшістю цих понять ви ще зустрінетеся на наступних рівнях — уже докладніше.
Development process
Testing process
Проєктування тестів, наприклад тест-кейсів
Програмування (coding)
Виконання тестів (проходження тест-кейсів, запуск автотестів)
Налагодження тестів
(адаптація тест-кейсів до змін у функціоналі)
Створення версій продукту, який ви тестуєте (build)
Результат тестування
(test result)
Підтримка продукту
Підтримка продукту
Докладніше про стадії тестування
Тестування
програмного продукту
вимог
Планування процесу тестування
Проєктування тестів
Виконання
тестів (testing cycles)
Налагодження тестів
Системне тестування
(System Testing)
Стадії статичного тестування:
- Аналіз вимог — вивчення специфікацій і функціональних вимог до системи. Отримання даних для складання плану проведення тестування
- Планування процесу тестування — визначення обсягів тестування, підходів, ресурсів і розкладу виконання намічених дій
- Проєктування тестів — визначення мети тестування, специфікації вхідних даних, архітектури тестів для впорядкування тестів за групами
Стадії динамічного тестування:
- Виконання тестів (testing cycles) — безпосередня перевірка спроєктованих тестів, аналіз усіх можливих тестових випадків
- Налагодження тестів — перегляд і налагодження тестових випадків
- Системне тестування (System Testing) — функціональна перевірка, тестування для визначення робочих характеристик
- Приймальні випробування (Acceptance Testing): альфа-тестування, бета-тестування
- Експлуатація та підтримка — перевірка результатів, виправлення дефектів
Приймальні випробування
(Acceptance Testing)
Експлуатація та
підтримка

Ми побачили концепцію процесу тестування та розробки, так би мовити, з висоти пташиного польоту. Тепер пора спуститися на землю й розглянути конкретні речі.
Розглядатимемо все від простого до складного:
- Аналіз вимог — рівень 8
- Планування — рівень 7
- Проєктування тестів — ось тут розглянемо докладніше
Усі наступні пункти ми почнемо розглядати зараз і плавно продовжимо працювати над ними на наступному рівні. Почнемо тему з того, щоб зрозуміти, що ж таке Тест.
Визначення тесту та тестового набору

Тест — «триплет» Вхід/Стан/Вихід
Тест — це послідовність кроків/дій, яка переводить систему з одного стану в інший
Тест описується абревіатурою ISO, де:
- [I] – is input data or action (вхідні дані або дії)
- [S] – is State of system at which data will be input (стан системи, яка отримує вхідні дані або вплив)
- [O] – is the expected Output (очікуваний Вихід, вихідні дані або вихідний стан системи)
Тестовий набір
- Набір тестів, що реалізують завершену бізнес-задачу, автоматизовану функціональністю системи, яка тестується
- Тестовий набір містить, окрім безпосередньо тестових сценаріїв, ще й тестові дані або правила їх створення/генерації
Тестовий набір — практичні міркування
- Після об'єднання тестів у набори не має залишатися незадіяних тестів
- За проєктування тестів «зверху вниз» тест-кейси стають частинами тестових наборів
- Рекомендується застосовувати саме проєктування тестів «зверху вниз»
Тестове покриття — практичні міркування
- Кількість тестів не визначає якість тестового покриття
- Відсоток тестового покриття не визначає ступінь довіри до результатів тестування, якщо він не дорівнює 100%
- 100% покриття в умовах реальної розробки практично недосяжне
- Підвищуйте поріг тестового покриття, якщо в тестовій області або компоненті виникають помилки
Розроблення тестових сценаріїв — практичні міркування
Існують формальні методи розроблення тестових сценаріїв
- Методологія розроблення тестових випадків на основі сценаріїв використання
- Методологія розроблення тестових випадків на основі ортогональної класифікації дефектів
Існують формальні методики оцінювання обсягів робіт, потрібних для мінімального тестового покриття
- Метод розрахунку цикломатичної складності, заснований на метриці Маккейба (McCabe)
Змішані методики — комбінація підходів
Класифікація тестування за рівнем «готовності» системи
Unit level — модульний рівень
- Тестування цілісності коду на рівні логічних модулів
- Виконується розробниками
- Контролюється групою тестування за допомогою інструментів аналізу покриття коду unit-тестами (unit test coverage tools)
Коментар: згідно з концепцією TDD, тестувальник має вимагати від програмістів покриття коду unit-тестами (елементарне тестування кожного модуля). Це не завжди обов'язок тестувальника. З погляду мануального тестування модульний рівень — це тестування окремо взятої форми входу (login + password)
Integration level — міжмодульна взаємодія
- Тестування проміжних результатів інтеграції системи
- Виконується розробниками й тестувальниками
Коментар: з погляду мануального тестування це перенесення вашої форми входу на сторінку сайту й перевірка взаємодії форми та сторінки сайту.
System level — рівень системи в цілому
Валідація повністю побудованої системи на відповідність сформульованим вимогам
Підрівні системного тестування:
- Alpha Testing
Виконується групою тестування всередині команди/організації розробки
- Beta Testing
Виконується групою тестування в середовищі дружньо налаштованих клієнтів
- Acceptance Testing
Виконується клієнтом, щоб визначити, чи буде система прийнята в експлуатацію
- «Димове тестування» (smoke testing) Виконується групою тестування, щоб визначити, чи буде система прийнята в тестування. Застосовується для того, щоб з'ясувати, чи працює програма взагалі і чи варто починати цикл тестування.
Коментар: з погляду мануального тестування це тестування форми в межах усього проєкту. Приклад — перевірка бази даних користувачів, у якій має з'явитися новий запис після реєстрації користувача на вашому готовому сайті через форму входу
Вітаю! Половину другого рівня пройдено.
Саме час зробити перерву й розім'яти спину, випити чайку, глибоко вдихнути і знову зануритися у світ тестування
White box (Structural) Testing
- Аналіз застосунку на рівні коду
- Розрізняють ручне — експертне тестування коду та автоматизоване тестування інструментами статичного аналізу
- Один із найдорожчих методів тестування, що потребує високої кваліфікації
Grey box testing (сірий ящик)
- Змішана адаптивна методика, яку застосовують досвідчені тестувальники або розробники під час налагодження
- Аналіз застосунку з погляду виконання операцій кінцевим користувачем і контролю отриманих результатів із застосуванням знань про код застосунку та подробиці реалізації його функцій
Останнє занурення у функціональне тестування
Далі буде перелічено види тестування, які є розділами або варіаціями функціонального тестування. При цьому також перевіряється правильність роботи застосунку, але є свої особливості ...
Регресійне тестування (regression testing) — це набір тестів, спрямованих на виявлення дефектів у вже протестованих ділянках застосунку. Робиться це зовсім не для того, щоб остаточно переконатися у відсутності багів, а для пошуку й виправлення регресійних помилок, тобто помилок у тому, що раніше працювало справно. Такі помилки, як правило, спричинені виправленням інших помилок або додаванням нового функціоналу, причому зовсім в іншому місці. Адже програма як кубик Рубика: повернув одну грань, а кольори змінилися по всьому поясу.
Автоматизоване тестування — передбачає використання спеціального програмного забезпечення (або написаного вами коду) для контролю виконання тестів і порівняння очікуваного та фактичного результату роботи програми. Цей тип тестування допомагає автоматизувати завдання, які часто повторюються, але потрібні для максимізації тестового покриття. І цього ми навчимося!
Негативне тестування (negative testing) — це підрозділ функціонального тестування, що передбачає відпрацювання тих сценаріїв, які можуть статися із системою, якщо, скажімо, користувач припуститься помилки під час введення даних або навмисно спробує вивести її з ладу. У такому разі система має бути готова «відповісти» на запит користувача повідомленням про помилку.
Приклад: коли очікується введення від 0 до 10, ввести -1 і порожнє значення.
1. Які ви знаєте стадії тестування?
2. Що таке тестовий набір?
3. Які існують види тестування за класифікацією?
4. У чому відмінність валідації та верифікації?

Я в захваті від твоїх успіхів! Лущиш рівні як насіння. Гадаю, вже стає зрозуміло, що стати тестувальником зовсім не складно. Але це лише початок шляху, і попереду ще 19 рівнів, кожен з яких унікальний як за змістом, так і за дизайном. Роби крок далі й відкривай нові загадки силою тестування.
Я із задоволенням перевірю результат твоєї роботи після того, як ти підкинеш старому магістру кілька кредитів на новий світловий меч, бо старий уже, то барахлить...
Щоб перейти на рівень 3, необхідно набрати щонайменше 20,6 бала за завдання рівня 2.
Рівень 3
Класифікація тестування за застосовуваним підходом
Black box (Functional) Testing
- Тестування з погляду кінцевого користувача
- Часто комбінується з методиками «білого ящика»
- Найпоширеніші методики тестування для user-oriented систем і застосунків
Думаю, ти готовий іти далі, мій друже. Щасти!
Функціональне тестування

Функціональне тестування — первинний вид тестування, спрямований на перевірку відповідності функціональних вимог до ПЗ його реальним характеристикам. Основне завдання функціонального тестування — підтвердити, що програмний продукт, який розробляється, має весь функціонал, потрібний замовнику.
Залежно від мети функціональне тестування може проводитися:
• На основі функціональних вимог, зазначених у специфікації. При цьому для тестування створюються тестові випадки (Test cases). Під час їх складання враховується пріоритетність функцій ПЗ, які необхідно покрити тестами. Таким чином ми можемо переконатися, що всі функції продукту, який розробляється, працюють коректно за різних типів вхідних даних, їх комбінацій, кількості тощо.
• На основі бізнес-процесів, які має забезпечувати ваш застосунок. У цьому разі нас цікавить не так працездатність окремих функцій ПЗ, як коректність виконуваних операцій з погляду сценаріїв використання системи. Тут тестування ґрунтуватиметься на варіантах використання системи (usecases).
• На основі здорового глузду. Оскільки і в документації проєкту, і навіть у голові архітектора може бути помилка (щось забули, щось не врахували), тестувальник має завжди бути насторожі. Суперечність складеного ТЗ здоровому глузду та досвіду має викликати природну реакцію — тут баг!
Нефункціональне тестування

На відміну від функціонального тестування, метою якого є перевірка
явної працездатності програми, нефункціональне тестування може бути не зазначене у вимогах. У це поняття вміщується все, що впливає на якість програми, але безпосередньо не стосується її бізнес-логіки.
Нефункціональні вимоги характеризують продукт з таких боків, як:
- Надійність — здатність програмної системи стабільно працювати тривалий час без втручання людини
- Продуктивність — працездатність системи під різними плановими навантаженнями
- Масштабованість — вимоги до горизонтального або вертикального масштабування застосунку. Застосунок має гарно й адекватно змінювати верстку під час додавання або вилучення структурних елементів. Те саме стосується й архітектури застосунку
- Безпека — захищеність даних користувачів від злому, захист системи від стороннього впливу, неавторизованого доступу та захищеність даних користувача від помилок системи
- Тестування установки (Installation testing) – перевірка успішності установки застосунку, його налаштування та видалення. Знижує ризики втрати даних користувачів, втрати працездатності застосунку тощо
- Тестування зручності використання (Usability testing) – характеризує систему з погляду зручності використання кінцевим користувачем
- Конфігураційне тестування (або тестування портованості) – дослідження працездатності програмної системи за різних програмних конфігурацій
- Тестування на відмову та відновлення (Failover and Recovery Testing) – дослідження програмної системи на предмет відновлення після помилок і збоїв. Оцінювання реакції захисних властивостей застосунку
- Стрес-тестування – це вид тестування, що характеризує систему з погляду стійкості її роботи за умов, які перевищують нормальні. Не плутайте з тестуванням продуктивності, адже в цьому разі йдеться лише про пікові навантаження, а не про розрахункові
- Тестування продуктивності – це комплекс типів тестування, метою якого є визначення працездатності, стабільності, споживання ресурсів та інших атрибутів якості застосунку за різних сценаріїв використання й навантажень. Тестування продуктивності дає змогу знаходити можливі вразливості та недоліки в системі, щоб запобігти їхньому згубному впливу на роботу програми в умовах використання. У цьому разі йдеться лише про планові навантаження, описані у вимогах до продукту
- Тестування взаємодії та сумісності (compatibility) – вид тестування, спрямований на оцінювання якості взаємодії компонентів програмної системи або всього застосунку з іншими компонентами чи програмним забезпеченням
Класифікація тестування за типами перевірки
Верифікація (verification) — це процес оцінювання системи або її компонентів з метою визначення, чи задовольняють результати поточного етапу розробки умови, сформовані на початку цього етапу. Тобто чи виконуються завдання, цілі та терміни з розробки продукту.
Валідація (validation) — це визначення відповідності ПЗ, що розробляється, очікуванням і потребам користувача та вимогам до системи.
Наступна таблиця допоможе виокремити ключові відмінності між цими поняттями:
Usability та GUI тестування
Usability та GUI тестування тісно пов'язані, адже в них перетинаються об'єкти тестування — інтерфейси. Також ці види тестування зручно проводити одночасно. До юзабіліті та GUI тестування належить:
Експертна оцінка зручності використання
У цьому разі ви вдаєте із себе крутого дизайнера й здійснюєте експертну оцінку вашого застосунку відповідно до цілей проєкту, функціональних і нефункціональних вимог до ПЗ. Процедури експертної оцінки включають:
- аналіз інформаційної архітектури застосунку
- аналіз інтерфейсу та елементів інтерфейсу
- аналіз функціональної відповідності інтерфейсу
- відповідність дизайну проєкту корпоративному дизайну
Приклад: виконуєте всіляку тонку оцінку — єдиний стиль застосунку, якість зображень, зайві лінії й навіть пікселі, масштабованість і розтяжність GUI застосунку, граматичні помилки тощо.
Імітація поведінки користувачів
У цьому разі ви берете на себе роль найпримітивнішого користувача й перевіряєте поведінку застосунку шляхом імітації його поведінки. Ваше завдання — забути застосунок і почати користуватися ним з нуля. Мета — отримати уявлення про користувацьке враження загалом. Знайти всі моменти, які можуть зіпсувати настрій користувачеві. Багом тут буде все, що неочевидне й незрозуміле новому користувачеві.
Приклад: очікування результату без прелоадера понад три секунди — баг, а посилання, яке не підкреслене, неправильна форма курсора під час наведення — usability баг. Відсутність підказок за складного процесу реєстрації тощо.
Види тестування, підсумок:

Це моя улюблена схема. Варто прийняти її близько до серця. Дуже часто на співбесідах із тестування дають подібне завдання — протестувати якийсь предмет. Воно показує, наскільки гнучкий розум тестувальника щодо видів і об'єкта тестування. Адже не важливо, що перед вами, а важливо розуміти логічну концепцію видів тестування. Перегляни й увібери цю схему НАЗАВЖДИ, якщо тестувальником вирішив стати.
Стратегія тестування
Стратегію тестування вам належить застосувати на практиці під час тестування плеєра. Але поки що не всі види, а лише ті, що позначені жовтим.
Типи тестування в звичайній стратегії:
- Функціональне тестування
- Негативне тестування
- Тестування бізнес-циклів
- Usability тестування
- Тестування користувацького інтерфейсу
- Тестування даних і цілісності бази даних
- Навантажувальне тестування
- Тестування безпеки та керування доступом
- Конфігураційне тестування
- Інсталяційне тестування
- Інструментальні засоби
Чи зрозумів ти урок? Дай відповіді на запитання
Практичне завдання

Настав час застосувати нові знання на практиці.
Для початку попрактикуйся у видах тестування.
Перше завдання — обрати з переліку предмет, який тобі більше до вподоби, і написати по одному тесту для кожного виду тестування.
Зроби це аналогічно до того, як тестували олівець, але у вигляді таблиці (вид тестування — тест). Завдання потрібно оформити в Google doc за цим шаблоном і надіслати через форму.
Друге завдання — тест із теорії. Дізнайся, наскільки ти зрозумів матеріал. Не забудь залогінитися в систему тестування.
Третє завдання ще практичніше. Спробуй використати види тестування під час тестування сайту. Усі знайдені баги також запиши в окремий Google doc і надішли через форму. Я вірю, що в тебе все вийде!

Предмети для першого завдання:
1. Стілець
2. Пляшка мінералки
3. Степлер
4. Діркопробивач
5. Папка для паперів
6. Настільна лампа
7. Розпилювач
8. Лінійка
9. Скотч
10. Ніж для паперу
11. Викрутка













