Яка різниця між одиничним, функціональним, приймальним та інтеграційним тестуванням (та будь-якими іншими видами тестів, які я не зміг зазначити)?
Яка різниця між одиничним, функціональним, приймальним та інтеграційним тестуванням (та будь-якими іншими видами тестів, які я не зміг зазначити)?
Відповіді:
Залежно від того, куди ви дивитесь, ви отримаєте дещо різні відповіді. Я багато читав про цю тему, і ось моя дистиляція; знову ж таки, вони злегка хиткі, і інші можуть не погодитися.
Тестові одиниці
Тестує найменшу одиницю функціональності, як правило, метод / функцію (наприклад, заданий клас із певним станом, виклик методу x у класі повинен спричинити y). Тести одиниць повинні бути зосереджені на одній конкретній особливості (наприклад, виклик методу pop, коли стек порожній, повинен кидати InvalidOperationException
). Все, чого вона торкнеться, слід робити на пам’ять; це означає, що тестовий і тестовий код не повинні:
Будь-який вид залежності, який повільно / важко зрозуміти / ініціалізувати / маніпулювати, повинен бути заглушений / знущається / керуватися за допомогою відповідних методик, щоб ви могли зосередитись на тому, що робить одиниця коду, а не на тому, що його залежність.
Коротше кажучи, одиничні тести є максимально простими, легкими для налагодження, надійними (за рахунок зменшення зовнішніх факторів), швидкими у виконанні та допомагають довести, що найменші будівельні блоки вашої програми функціонують за призначенням до того, як їх скласти. Застереження полягає в тому, що, хоча ви можете довести, що вони відмінно працюють у відриві, одиниці коду можуть підірватися, коли поєднати, що приведе нас до ...
Інтеграційні тести
Інтеграційні тести ґрунтуються на одиничних тестах, комбінуючи одиниці коду та перевіряючи правильність функціонування отриманої комбінації. Це може бути або внутрішня частина однієї системи, або комбінування декількох систем разом, щоб зробити щось корисне. Крім того, інша річ, яка відрізняє інтеграційні тести від одиничних тестів, - це довкілля. Інтеграційні тести можуть і використовуватимуть потоки, отримуватимуть доступ до бази даних або робити все необхідне, щоб забезпечити правильність роботи всіх кодів та різних змін середовища.
Якщо ви створили якийсь код серіалізації і блок перевірив його внутрішню частину, не торкаючись диска, то як ви знаєте, що він буде працювати при завантаженні та збереженні на диску? Можливо, ви забули промити та розпоряджатися потоками файлів. Можливо, ваші дозволи на використання файлів неправильні, і ви протестували внутрішню частину, яка використовується в потоках пам'яті. Єдиний спосіб достеменно це перевірити - це перевірити його на «справжнє», використовуючи середовище, найближче до виробництва.
Основна перевага полягає в тому, що вони знайдуть помилки, які не можуть перевірити одиничні тести, такі як помилки підключення (наприклад, екземпляр класу A несподівано отримує нульовий екземпляр B) та помилки середовища (він працює добре на моїй машині з одним процесором, але мій чотири основні машини колеги не можуть пройти тести). Основним недоліком є те, що тести інтеграції стосуються більшої кількості коду, менш надійні, діагностування відмов важче, а тести важче підтримувати.
Також інтеграційні тести не обов'язково доводять, що повноцінна функція працює. Користувач може не піклуватися про внутрішні деталі моїх програм, але я це роблю!
Функціональні тести
Функціональні тести перевіряють певну особливість на правильність, порівнюючи результати для заданого введення та специфікації. Функціональні тести не стосуються проміжних результатів або побічних ефектів, лише результату (їх не хвилює, що після виконання x, об'єкт y має стан z). Вони записуються для перевірки частини специфікації, наприклад, "виклик функції Square (x) з аргументом 2 повернення 4".
Тести на прийняття
Здається, тестування на прийняття розбито на два типи:
Стандартне тестування приймання включає проведення тестів у всій системі (наприклад, використання веб-сторінки через веб-браузер), щоб побачити, чи задовольняє функціональність програми специфікація. Наприклад, "натискання значка масштабування повинно збільшити перегляд документа на 25%." Немає справжнього континууму результатів, лише результат пропуску чи невдачі.
Перевагою є те, що тести описані простою англійською мовою і забезпечують, що програмне забезпечення в цілому є функціональним завершенням. Недоліком є те, що ви перемістили інший рівень вгору на тестову піраміду. Тести на прийняття торкаються гір коду, тому відстежувати несправність може бути складним.
Крім того, в умовах гнучкої розробки програмного забезпечення тестування прийнятності користувачів передбачає створення тестів для відображення історій користувача, створених / для замовника програмного забезпечення під час розробки. Якщо тести пройдуть, це означає, що програмне забезпечення повинно відповідати вимогам замовника, і розповіді можна вважати завершеними. Набір тестових програм прийняття - це в основному виконувана специфікація, написана мовою, визначеною для домену, яка описує тести мовою, якою користуються користувачі системи.
Висновок
Всі вони доповнюють один одного. Іноді вигідно зосередитись на одному типі або повністю відмовитися від них. Основна відмінність для мене полягає в тому, що деякі тести розглядають речі з точки зору програміста, тоді як інші використовують фокус на клієнта / кінцевого користувача.
Важливим є те, що ви знаєте, що ці терміни означають для ваших колег. У різних групах будуть дещо відрізнятися визначення того, що вони означають, наприклад, коли вони говорять про "тести" повного кінця ".
Нещодавно я натрапив на систему імен Google для їх тестів, і мені це більше подобається - вони обходять аргументи, використовуючи лише малий, середній та великий. Вирішуючи, до якої категорії підходить тест, вони розглядають кілька факторів - скільки часу потрібно запустити, чи має він доступ до мережі, бази даних, файлової системи, зовнішніх систем тощо.
http://googletesting.blogspot.com/2010/12/test-sizes.html
Я думаю, що різниця між малим, середнім та великим для вашого поточного робочого місця може відрізнятися від Google.
Однак мова йде не лише про сферу застосування, а про мету. Точка Марка щодо різних перспектив тестів, наприклад програміст проти клієнта / кінцевого користувача, є дуже важливою.
http://martinfowler.com/articles/microservice-testing/
Повідомлення в блозі Мартіна Фаулера розповідає про стратегії тестування коду (особливо в архітектурі мікропослуг), але більшість із них стосується будь-якої програми.
Я цитую його слайд-резюме:
- Тестові одиниці - вправте найменші шматочки тестуваного програмного забезпечення в додатку, щоб визначити, чи поводиться вони так, як очікувалося.
- Інтеграційні тести - перевірити шляхи зв'язку та взаємодії між компонентами для виявлення дефектів інтерфейсу.
- Тести на компоненти - обмежте сферу застосування програмного забезпечення на частину тестованої системи, маніпулюючи системою через внутрішні інтерфейси коду та використовуючи тестові подвійні елементи для ізоляції тестового коду від інших компонентів.
- Контрактні випробування - перевірити взаємодію на кордоні зовнішньої служби, стверджуючи, що вона відповідає договору, очікуваному споживчою послугою.
- Кінцеві тести - переконайтеся, що система відповідає зовнішнім вимогам та досягає своїх цілей, випробовуючи всю систему, від кінця до кінця.
Тестування одиниць - як випливає з назви, цей метод тестується на рівні об'єкта. Окремі компоненти програмного забезпечення тестуються на наявність помилок. Знання програми необхідні для цього тесту, і тестові коди створюються, щоб перевірити, чи програмне забезпечення поводиться так, як призначено.
Функціональне тестування - проводиться без будь-яких знань про внутрішню роботу системи. Тестер намагатиметься використовувати систему, дотримуючись вимог, надаючи різні входи та тестуючи згенеровані результати. Цей тест також відомий як тестування закритого типу або чорний.
Тестування прийняття - це останній тест, який проводиться до передачі програмного забезпечення клієнту. Він проводиться для того, щоб розроблене програмне забезпечення відповідало всім вимогам замовника. Існує два типи приймального тестування - один, який проводиться членами групи розробників, відомий як внутрішнє приймальне тестування (Alpha testing), а другий, який проводиться замовником або кінцевим користувачем, відомий як (бета-тестування)
Інтеграційне тестування - окремі модулі, які вже піддані тестуванню одиниці, інтегруються один з одним. Зазвичай дотримуються два підходи:
1) Зверху вниз
2) Знизу вгору
Це дуже просто.
Тестування блоку: це тестування, яке насправді проводиться розробниками, які мають знання з кодування. Це тестування проводиться на етапі кодування і є частиною тестування білого поля. Коли програмне забезпечення надходить на розробку, воно розробляється у фрагмент коду або фрагменти коду, відомі як одиниця. І індивідуальне тестування цих підрозділів називається тестуванням одиниць, яке проводиться розробниками, щоб з'ясувати якісь помилки людини, як, наприклад, відсутність покриття виписки тощо.
Функціональне тестування: Це тестування проводиться на етапі тестування (QA) і є частиною тестування чорної скриньки. Фактичне виконання раніше написаних тестових справ. Це тестування фактично проводиться тестерами, вони знаходять фактичний результат будь-якої функціональності на сайті і порівнюють цей результат з очікуваним результатом. Якщо вони виявили різницю, то це помилка.
Тестування прийняття: відомий як UAT. І це насправді зробили тестери, а також розробники, керівна команда, автор, письменники та всі, хто бере участь у цьому проекті. Щоб проект нарешті був готовий до доставки з помилками безкоштовно.
Інтеграційне тестування: одиниці коду (пояснено у пункті 1) інтегровані між собою для завершення проекту. Ці одиниці кодів можуть бути записані в різній технології кодування або можуть бути різної версії, тому це тестування проводиться розробниками, щоб переконатися, що всі одиниці коду сумісні з іншими і не виникає жодних питань інтеграції.
Деякі (відносно) останні ідеї проти надмірного глузування та чистого тестування одиниць:
Я поясню вам це на практичному прикладі і без теоретичних речей:
Розробник пише код. Ще не реалізовано графічний інтерфейс. Тестування на цьому рівні підтверджує, що функції працюють правильно і типи даних є правильними. Ця фаза тестування називається одиничним тестуванням
Коли розробляється графічний інтерфейс, і програма призначається тестувальнику, він перевіряє бізнес-вимоги з клієнтом і виконує різні сценарії. Це називається функціональним тестуванням. Тут ми зіставляємо вимоги клієнта з потоками додатків.
Інтеграційне тестування: скажімо, наш додаток має два модулі: HR та Finance. HR модуль був доставлений і протестований раніше. Зараз Фінанси розроблені і доступні для тестування. Взаємозалежні функції також доступні зараз, тому на цій фазі ви перевірите точки зв’язку між двома і перевірте, чи працюють вони так, як вимагають вимоги.
Регресійне тестування - ще одна важлива фаза, яка виконується після будь-якої нової розробки або виправлення помилок. Її метою є перевірка раніше працюючих функцій.
тестова одиниця: тестування окремого модуля або незалежного компонента в додатку, як відомо, є тестуванням одиниць, тестування одиниць буде виконано розробником.
тест інтеграції: поєднання всіх модулів та тестування програми для перевірки зв'язку та потоку даних між модулями працюють належним чином чи ні, це тестування також виконується розробниками.
функціональний тест, що перевіряє індивідуальну функціональність програми, означає функціональне тестування
тестування прийняття цього тестування проводиться кінцевим користувачем або замовником, чи відповідає програма збірки відповідно до вимог замовника, а специфікація замовника, як відомо, це тестова перевірка.