Підходи до автоматизації тестування програмного забезпечення
Автоматизоване тестування програмного забезпечення - це набір практик, підходів і методів, які в сукупності дозволяють автоматизувати (за допомогою сторонніх по відношенню до системі утиліт або програмних продуктів, включаючи середовище розробки) виконання активностей спрямованих на тестування ПО.
Автоматизація функціонального тестування - це процес, спрямований на економію витрат на виконання функціонального тестування за рахунок створення спеціальних програм, що дозволяють «замінити» тестувальників при виконанні тестування.
До основних цілей впровадження автоматизації функціональності тестування варто віднести:
• Економія витрат на тестування за рахунок автоматизації прогону тестів;
• Економія часу на тестування, оскільки, як правило, автоматизовані тести виконуються швидше, ніж виконання цих же тестів вручну. Цей фактор дозволяє збільшити кількість виконаних тестів в рамках однієї сесії тестування;
• Надійність - автоматизовані тести передбачають виключення людського фактора.
Завданням процесу автоматизації тестування є забезпечення отримання прямих фінансових вигод за рахунок економії ресурсів, а також підвищення якості виконуваних робіт з тестування програмного забезпечення.
До недоліків автоматизації функціонального тестування в порівнянні з ручним тестуванням варто віднести наступне:
• Жорстка запрограмованість - автоматизований тест не в змозі виявити дефекти, на який він не запрограмований;
• Автоматизовані тести, як і будь-який програмний комплекс, потребують підтримки, що призводить до додаткових витрат на всьому етапі розробки і тестування програми;
• Скрипти автоматизованого тестування, як і будь-яка програма, можуть містити в собі помилки. Це призводить до необхідності додаткової валідації результатів прогону автоматизованого тесту.
Існують такі підходи до автомтаизації тестування програмного забезпечення:
• Тестування на рівні коду;
• Тестування програми через графічний інтерфейс.
Тестування на рівні коду.
Цей підхід використовується в основному при модульному і регрессионном тестуванні. Модульне тестування перевіряє функціональність і шукає дефекти в частинах додатка, які доступні і можуть бути протестовані по-окремо (модулі програм, об'єкти, класи, функції і т.д.).
Переваги модульного тестування включають:
• Заохочення змін. Модульне тестування пізніше дозволяє програмістам проводити рефакторинг, будучи впевненими, що модуль як і раніше працює коректно (регресійні тестування);
• Спрощення інтеграції. Модульне тестування допомагає усунути сумніви з приводу окремих модулів і може бути використано для підходу до тестування «знизу вгору»: спочатку тестуються окремі частини програми, потім програма в цілому. Такий підхід значно спрощує інтеграційне тестування;
• Відділення інтерфейсу від реалізації. Оскільки деякі класи можуть використовувати інші класи, тестування окремого класу часто поширюється на класи, пов'язані з ним. Наприклад, клас користується базою даних і в ході написання тесту програміст виявляє, що тесту доводиться взаємодіяти з базою. Це помилка, оскільки тест не повинен виходити за кордон класу.
Звичайно, при тестуванні на рівні коду присутні і свої недоліки:
• Чи не дозволяє виявити всі помилки. Це випливає з практичної неможливості трасування всіх можливих шляхів виконання програми, за винятком найпростіших випадків. Крім того, відбувається тестування кожного з модулів окремо. Це означає, що помилки інтеграції, системного рівня, функцій, виконуваних в декількох модулях, не будуть визначені;
• Великий обсяг тестового коду. Тестування програмного забезпечення - комбінаторна задача. Наприклад, кожне можливе значення булевою змінної зажадає двох тестів: один на варіант TRUE, інший - на варіант FALSE. В результаті на кожен рядок вихідного коду потрібно 3-5 рядків тестового коду;
• суворе дотримання технологій тестування. Необхідно зберігати не тільки записи про всі проведених тестах, але і про всі зміни вихідного коду у всіх модулях. З цією метою слід використовувати систему контролю версій програмного забезпечення. Таким чином, якщо пізніша версія програмного забезпечення не проходить тест, який був успішно пройдений раніше, буде нескладним звірити вихідний код варіантів і усунути помилку.
Інструментарій для полегшення виконання модульного тестування розроблений для широкого спектра мов. У мовах D і Cobra модульне тестування інтегровано в саму граматику мови і доступно без використання додаткових бібліотек.
Для Java: JUnit, TestNG, JavaTESK і ін.
Для C ++: CPPUnit, Boost Test, Google C ++ Testing Framework і ін.
Для PHP: SimpleTest, PHPUnit і ін.
Тестування програми через графічний інтерфейс.
Популярність такого виду тестування пояснюється двома факторами:
• Додаток тестується тим же способом, яким його буде використовувати людина;
• Можна тестувати додаток, не маючи при цьому доступу до вихідного коду.
UI-автоматизація розвивалася протягом 4 поколінь інструментів і технік:
• Програми запису і відтворення записують дії тестувальника під час ручного тестування. Вони дозволяють виконувати тести без прямої участі людини протягом тривалого часу, значно збільшуючи продуктивність і усуваючи «тупе» повторення одноманітних дій під час ручного тестування. У той же час, будь-яке мале зміна тестованого ПО вимагає перезапису ручних тестів;
• Сценарії (Scripting) - форма програмування на мовах, спеціально розроблених для автоматизації тестування програмного забезпечення. Розробкою займаються програмісти високого рівня, які працюють окремо від тестувальників, безпосередньо запускають тести. До того ж скрипти більше підходять для тестування GUI і не можуть бути впровадженими, пакетними або взагалі будь-яким чином об'єднані в систему. Нарешті, зміни в тестованому ПО вимагають складних змін у відповідних скриптах;
• Data-driven testing - методологія, яка використовується в автоматизації тестування. Особливістю є те, що тестові скрипти виконуються і верифицируются на основі даних, які зберігаються в центральному сховищі даних або БД. Роль БД можуть виконувати ODBC-ресурси, csv або xls файли і т.д. Data-driven testing - це об'єднання декількох взаємодіючих тестових скриптів і їх джерел даних в фреймворк, який використовується в методології. У цьому фреймворку змінні використовуються як для вхідних значень, так і для вихідних перевірочних значень: в тестовому скрипті зазвичай закодовані навігація по додатком, читання джерел даних, ведення логів тестування. Таким чином, логіка, яка буде виконана в скрипті, також залежить від даних;
• Keyword-based автоматизація передбачає поділ процесу створення тестових випадків на 2 етапи: етап планування і етап реалізації.
Популярні програми для такого виду тестування включають в себе:
o HP LoadRunner, HP QuickTest Professional, HP Quality Center
o IBM Rational FunctionalTester, IBM Rational PerformanceTester, IBM Rational TestStudio
o AutomatedQA TestComplete
• З відкритим вихідним кодом:
Виходячи з опису вище, при використанні тестування через графічний інтерфейс покривається більше сценаріїв використання продукту. Більш того, тестування на рівні коду звільнить від виконання деяких перевірок функціональних тестувальників, але при цьому завантаження для розробників буде більше.
Якщо ж вибирати техніку тестування через графічний інтерфейс, то варто вибрати утиліти, які допомагають автоматизувати процес тестування, оскільки для інших технік необхідно задіяти автоматизатора-тестувальника. Автоматор-тестувальник спричинить за самою додаткові витрати від компанії. Утиліти ж прості у використанні, є в широкому доступі, не вимагають додаткових навичок програмування від функціональних тестувальників.
Якщо вибрати автоматизацію процесу тестування за допомогою спеціальних утиліт, то автоматизація тестування буде відбувається шляхом впровадження в роботу тестувальників спеціальних сканерів, більшість яких працює саме на рівні коду сторінки, щоб отримувати повну інформацію про тестованому об'єкті. Шляхом передачі спеціальних значень на сервер додатки і сканування отриманої відповіді на предмет порушення протоколів безпеки. Великою перевагою використання таких сканерів є те, що їх перевірки можна запускати в нічний час, що дозволяє скоротити незручності в роботі тестувальника до мінімуму. Також застосування сканерів дозволяє провести набагато більше перевірок за одиницю часу, ніж тестувальник безпеки систем. При цьому кожен отриманий результат сканування повинен бути перевірений ще раз для підтвердження наявності уразливості.
В даний час широко використовуються програмні засоби по автоматизації тестування, які пропонують широкий спектр послуг з тестування різних вразливостей. Зокрема:
• Wapiti. Дозволяє провести аудит на предмет безпеки веб-додатків. Додаток проводить сканування з позиції зловмисника. Тобто, додаток просканує сторінки веб-додатки на наявність скриптів або форм, через які можна провести злом.
• Netsparker Community Edition. Являє собою сканер на предмет SQL Injection. Це безкоштовна версія сканера веб-уразливості, так що користувач може почати сканувати свій веб-сайт відразу ж. Сканер дуже зручний у використанні, швидкий і легкий у застосуванні, користувачеві не потрібно буде турбуватися про помилкові тривоги.
• N-Stalker Free Version. Надає проводити обмежену кількість перевірок Web Security Assessment, які допоможуть підвищити загальний рівень безпеки інфраструктури web-сервісу. Інструмент використовує найповнішу базу сигнатур веб-атак, на сьогоднішній день доступну - «N-Stealth Web Attack Signature Database».
• Websecurify - це просунутий інструмент для тестування, розроблений спеціально для швидкого і точного виявлення вразливостей в веб-додатку.
• OWASP Zed Attack Proxy Project - Інструмент для тестування безпеки на базовому рівні, дозволяє провести перевірки на уразливості до XSS атак, проводитися базові перевірки на можливість SQL ін'єкцій, дозволяє проводити сканування портів додатки, фаззінга, а також дозволяє контролювати використовувані протоколи під час тестування. Даний інструмент буде особливо корисний тестувальникам безпеки, а також розробникам. Сканер надає можливість працювати як в пасивному режимі, так і в активному. Сканер безпеки знаходиться у вільному розповсюдженні.
При виборі з представлених сканерів є очевидним, що доступність сканера в широкому доступі є один з найважливіших критеріїв прийняття рішення. Однак так само є важливим, щоб система працювала з декількома видами веб-вразливостей і була проста у використанні.
Виходячи з представлених альтернатив впровадження сканера OWASP Zed Attack Proxy Project буде кращим варіантом.