Пахне запитанням домашнього завдання.
Чи потрібно тестування в галузі програмного забезпечення?
Так. Абсолютно. На всіх рівнях. За винятком кількох спеціалізованих доменів, ми ще не знаходимося на етапі, коли зможемо математично довести, що наш код правильний щодо конкретних помилок (принаймні, не у розумні часові рамки), тому нам доведеться кидати на нього скелі, щоб побачити, чи де вона ламається.
Якщо ми створюємо програмне забезпечення з великою ретельністю, то навіщо нам тестувати?
Тестування стосується не лише пошуку помилок кодування. Йдеться також про те, щоб переконатися, що ви виконали всі свої вимоги, і що загальна система працює так, як очікувалося. Якщо у мене є вимога, що збита транзакція повинна повернути певний код помилки, тоді мені потрібно написати тест, щоб перевірити, чи функціональність існує, і що вона працює правильно.
І все це передбачає, що специфікація та конструкція є повною, правильною та внутрішньо узгодженою, що часто не буває. Навіть якщо ви дотримаєтесь специфікації до букви і дотримуєтесь дизайну до останньої крапки і крапки з комою, якщо специфікація або дизайн погані, то в інтеграцію можуть виникнути проблеми. Часто системне або інтеграційне тестування - це коли ви дізнаєтесь, що сама специфікація є помилковою і потребує перегляду (див. Історію війни нижче).
Після тестування чи можемо ми бути впевнені, що ми досягли цієї мети (продукт / програмне забезпечення працює за призначенням), оскільки ми зробили тестування для цього? Це можливо?
Ні, не до 100%. Ми не можемо перевірити кожну можливу комбінацію входів або шляхів виконання в будь-якому, крім найпростішому коді. Ми не можемо врахувати всі фактори навколишнього середовища. Ми не можемо уявити всі можливі режими відмов.
Ми можемо перевірити до точки , де ми знаходимося досить впевнені , що немає ніяких великих проблем. Знову-таки, саме тому нам потрібно протестувати на всіх рівнях. Напишіть набір тестів, щоб переконатися, що ваш код правильно обробляє крайові умови (поганий ввід, несподівані результати, винятки тощо). Тест блоку, щоб перевірити, чи відповідає ваш код його вимогам. Тест системи для перевірки обробки в кінці. Інтеграційний тест, щоб перевірити, чи всі компоненти розмовляють один з одним правильно. Зробіть тестування на зручність, щоб переконатися, що вся справа працює таким чином, що клієнти не хочуть знімати вас.
Справжній сценарій - я працював над бек-енд-системою, яка періодично надсилала оновлення до сервісу GUI для відображення в таблиці на екрані. Під час проекту була додана вимога додати фільтрування до дисплея (наприклад, оператор міг вибрати відобразити підмножину записів у таблиці). Помилка дизайну №1 - фільтрування повинна була бути виконана службою GUI (у мене є це вигадливе антикварне уявлення про те, що функції управління дисплеєм повинні нести відповідальність за програмне забезпечення для управління дисплеями), але через політику та мою нездатність визнати проблеми до того, як вони стануть проблеми , що ця вимога була покладена на бек-енд-сервіс. Ну гаразд, немає проблем, я можу це зробити. Зміни стану фільтру, я отримую повідомлення, а потім надсилаю повідомлення про створення або видалення длякожен рядок у таблиці , тому що так працює інтерфейс (помилка дизайну №2 - немає жодного способу надсилати оновлення до декількох рядків в одному повідомленні; ми навіть не могли надіслати одне повідомлення "очистити" або "видалити", щоб очистити всю таблицю).
Ну, все добре працює під час розвитку; тестування блоку, системи та інтеграції показують, що я надсилаю потрібну інформацію та правильно обробляю зміни фільтра. Тоді ми переходимо до тестування на юзабіліті, і все це важко падає , оскільки обсяг даних був величезним. Затримка в мережі між моєю сервісною програмою та графічним інтерфейсом користувалася приблизно від 15 до 25 секунд. Непогано, якщо вам доведеться надсилати оновлення лише на десяток рядків. Смертельно, коли вам доведеться надсилати оновлення на кілька сотень. Ми почали отримувати повідомлення про помилки, що GUI замерзав після зміни стану фільтра; ну ні, те, що відбувалося, полягало в тому, що це займало порядок декількох хвилин оновити дисплей, оскільки протокол повідомлень про оновлення одно рядків одночасно не міг обробити реальний сценарій.
Зауважте, що все це могло б і слід було передбачити всім від головного підрядника аж до маленької старої мене, якби ми заздалегідь намагалися зробити навіть найпростіший аналіз. Єдиний захист, який я пропоную, - це те, що ми закінчували другий рік шестимісячного проекту, який збирався перетворити майже одразу після доставки, і всі ми просто відчайдушно побачили його задню частину.
Що підводить нас до остаточної причини тестування - CYA. Реальні проекти провалюються з різних причин, багато з яких є політичними, і не всі діють добросовісно, коли справи йдуть не так. Пальці наголошуються, звинувачуються, і в кінці дня вам потрібно мати можливість вказати на запис, який показує, що принаймні ваші речі працювали так, як належить.
If we create a software with care in during its development period then why should we go for Test?
- тому що незалежно від того, навіть найкваліфікованіший програміст допускає помилки.