Чому Джем Канер вважає тест, який не виявляє помилку, марна трата часу?


15

Як щодо підтвердження функціональності в позитивних тестах, доведення, що це працює - чи варто сказати, що це марна трата часу? Яка концепція стоїть за цією цитатою?

Невдалі тести, тобто тести, які не знаходять помилок, є марною тратою часу.

Веб-інженерія: Дисципліна систематичної розробки веб-додатків із цитуванням Джема Канера .


2
Не зовсім. Канер стверджує, що загалом тестування має просто виявити дефекти.
Іван V

4
Це дуже академічна позиція. Містеру Канеру та містерові Шредінгер потрібно коли-небудь посидіти за чашкою кави.
Blrfl

2
@Blrfl єдина проблема в тому, що пан Шредінгер мертвий. О, зачекайте ... гм ...
ikmac

1
Це твердження без контексту звучить шалено нерозумно ...
Rig

1
"Підтвердження функціональності в позитивних тестах" - Це принципово неможливо. Ви не можете довести щось правильне, ви можете лише довести це неправильно.
Конрад Рудольф

Відповіді:


37

Я написав більшість тестування програмного забезпечення понад 25 років тому. З тих пір я вказував на кілька частин книги, які вважаю застарілими або просто неправильними. Див. Http://www.kaner.com/pdfs/TheOngoingRevolution.pdf

Ви можете побачити більше (поточні перегляди, але без явних покажчиків назад до TCS) на моєму сайті Курсу тестування програмного забезпечення Black Box (відео та слайди доступні безкоштовно), www.testingeducation.org/BBST

Культура тестування тоді була багато в чому підтверджуючою.

У сучасних тестуваннях підхід до тестування одиниць значною мірою підтверджує - ми пишемо великі колекції автоматизованих тестів, які просто підтверджують, що програмне забезпечення продовжує працювати за призначенням. Тести служать сповіщувачами змін - якщо щось в інших частинах коду і в цій частині зараз є проблеми, або якщо значення даних, які раніше були неможливі в реальному світі, зараз доходять до програми, то детектори змін спрацьовують, попереджаючи про програміст до проблеми обслуговування.

Я думаю, що підтверджуючий спосіб мислення підходить для тестування одиниць, але уявіть собі світ, у якому все тестування системи було підтверджуючим (для людей, які роблять розрізнення, будь ласка, інтерпретуйте "тестування системної інтеграції" та "тестування прийняття", як це включено до моїх коментарів до системи тестування.) Тест тестування полягав у тому, щоб підтвердити, що програма відповідала своїм специфікаціям, і домінуючим підходом було побудувати регресійні тести на рівні на мільйон (або, принаймні, кілька сотень) системного рівня, які відобразили частини специфікації на поведінку програми. (Я думаю, що підтвердження специфічної поведінки є корисним, але я думаю, що це невелика частина більшої мети.)

Є ще тестові групи, які діють таким чином, але це вже не є домінуючим поглядом. Тоді це було. Я наполегливо писав і малював різкі контрасти, щоб вказувати людям, які постійно навчалися в цьому режимі мислення. Сьогодні деякі різкі контрасти (включаючи наведене тут) застаріли. Вони неправильно трактуються як напади на неправильні погляди.

Як я бачу, тестування програмного забезпечення - це емпіричний процес для вивчення інформації про програмний продукт чи послугу, що стосується якості.

Тест повинен бути розроблений для виявлення корисної інформації.

Тоді, до речі, ніхто не говорив про тестування як про метод виявлення "інформації". Тоді тестування було або для (деякої версії ...) пошуку помилок, або для (деякої версії ...) перевірки (перевірки) програми на предмет специфікацій. Я не думаю, що твердження про тестування для виявлення корисної інформації потрапило до словника тестування до цього століття.

Уявіть рейтингові тести з огляду на їхню інформаційну цінність. Тест, який, ймовірно, навчить нас чомусь, чого ми не знаємо про програмне забезпечення, мав би дуже високу інформаційну цінність. Тест, який, ймовірно, підтвердить те, що ми вже очікуємо і що вже було демонструвано багато разів раніше, мало б інформаційне значення. Один із способів розставити пріоритети тестів - це запустити вищі тести інформаційного значення перед тестами нижчої інформації.

Якби я спростив цю пріоритетність, щоб вона привернула увагу програміста, менеджера проектів чи менеджера процесів, який не знає тестування програмного забезпечення, я б сказав: "ТЕСТ, ЩО НЕ ЗАдуманий ВІДКРИТТЯ БУГА - ВІДХОДИ ЧАСУ" . " Це не ідеальний переклад, але для читачів, які не можуть чи не зрозуміють будь-якої тонкості чи кваліфікації, це настільки ж близько, як це дістанеться.

Тоді, і я знову бачу це тут, деякі люди, які не розуміють тестування, відповіли б, що тест, призначений для пошуку кутових випадків, є марною тратою часу порівняно з тестом на основне використання основної функції. Вони не розуміють двох речей. По-перше, коли тестери часу знаходять час для перевірки граничних значень, основні функції основних функцій вже були здійснені кілька разів. (Так, є винятки, і більшість тестових груп уважно звертають увагу на ці винятки.) По-друге, причина тестування з екстремальними значеннями полягає в тому, що програма, швидше за все, виходить з ладу з крайніми значеннями. Якщо це не виходить з ладу, ви протестуєте щось інше. Це ефективне правило. З іншого боку, якщо воно не спрацьовує при надзвичайному значенні, тестер може зупинитися і повідомити про помилку, або тестер може усунути неполадки, щоб перевірити, чи не виходить програма таким же чином при більш нормальних значеннях. Хто займається усуненням несправностей (тестер або програміст) - це питання корпоративної культури. Деякі компанії сплачують час тестера на це, деякі бюджетують програмісти, а деякі очікують, що програмісти виправлять неполадки у кутових випадках, будь то узагальнюючі чи ні, щоб усунення несправностей не було актуальним. Поширене непорозуміння - тестувальники витрачають час (а не максимізують ефективність) шляхом тестування екстремальних значень - ще одна причина того, що "Тест, який не призначений для виявлення помилок, є марною витратою часу", є відповідним повідомленням для тестувальників. Це контрапункт для заохочення з боку деяких програмістів ніколи (за фактом) не запускати тести, які можуть кинути виклик програмі. Повідомлення спрощене, але вся дискусія спрощена.

До речі, "інформаційна цінність" не може бути єдиною системою пріоритетності. Це не моє правило, коли я розробляю тестові набори. Це не моє правило, коли я розробляю тести перевірки побудови (він же перевіряє здоровість). В обох цих випадках мене більше цікавлять типи покриття, ніж сила окремих тестів. Є й інші випадки (наприклад, автоматизовані тести великих обсягів, які дешево встановлювати, запускати та контролювати), коли потужність окремих тестів для моєї конструкції просто не має значення. Я впевнений, що ви можете придумати додаткові приклади.

Але як правило, якби я міг зазначити лише одне правило (наприклад, розмова керівника, голова якого вибухає, якщо він намагається обробити більше одного речення), було б тест на низьку інформаційну цінність, як правило, марна трата часу.


4
+1 знайшли час , щоб відповісти на питання , який ви перебуваєте авторитетне джерело, а також перевірки моє використання терміна «Будівництва по перевірці тестів» , які так багато людей дивляться на мене смішно для використання ... Завжди приємно бачити людей , вашого статусу знадобиться час, щоб допомогти людям тут
Джиммі Хоффа

1
Ерік Г: Я думаю, якщо ти перечитаєш, що ти побачиш, Джем заявляє, що частина читачів розуміє, що його погляд на цю тему еволюціонував з часом. Або ви можете просто продовжувати ігнорувати тонкощі та кваліфікації, перефразовуючи Джема. (і я приймаю "кваліфікацію" не як його повноваження, а як винятки.)
Джим Холмс

Ваша цитата нагадує мені про те, що я спостерігав про науку: не можна довести (або навіть значущо підтримати) наукову теорію шляхом проведення експериментів, можна очікувати результатів, що відповідають теорії; спосіб підтримати теорію - докладати сумлінних зусиль до експериментів із пристроями, які не підтримують її, але не можуть цього зробити.
supercat

@supercat ви можете підтримати теорію тестом на те, що відповідає теорії, якби тест не стався до вас перед теорією (наприклад, показ прискорення об'єкта, що падає у вакуумі, такий, як ви б його обчислили. говорить більше, ніж показує, що падає). Крайові тести аналогічні; Можливо, я очікую, що програмне забезпечення поводиться правильно при роботі з екстремальними значеннями, але воно дає більше впевненості в якості, щоб побачити це, ніж повторювати вхідні значення, які він, ймовірно, бачив під час розробки, а також більше шансів знайти помилку.
Джон Ханна

@JonHanna: Моє фразування було поганим: питання не в очікуванні, а в зусиллях. Неможливо довести теорію, намагаючись знайти тести, які вона пройде; потрібно докласти сумлінних зусиль, щоб знайти тести, які були б невдалими, якщо вони недійсні.
supercat

11

За думкою Канера, ідея полягає в тому, "оскільки у вас вичерпається час, перш ніж закінчуватимуться тестові випадки, важливо використовувати доступний час максимально ефективно".

Концепція позаду цитати ви питаєте про представлена і пояснена в хорошій деталізації в тестуванні комп'ютерного програмного забезпечення статті Cem Канер , Джек Фолкнул, Hung Кука Нгуйна, в розділі «МЕТА І КОРДОНІ ВИПРОБУВАНЬ»:

Так, ЧОМУ ТЕСТ?

Ви не можете знайти всіх помилок. Ви не можете довести програму правильною, і цього не хочете. Це дорого, засмучує, і це не виграє вам жодних конкурсів на популярність. Отже, навіщо турбувати тестування?

МЕТА ТЕСТУВАННЯ ПРОГРАМИ ЗНАЙДЕНО ПРОБЛЕМ В ІТ

Пошук проблем є основою вашої роботи. Ви хочете знайти якомога більше; чим серйозніша проблема, тим краще.

Оскільки у вас вичерпається час до закінчення тестових випадків, важливо використати доступний час максимально ефективно. Глави 7,8,12 та 13 детально розглядають пріоритети. Керівний принцип можна викласти просто:


Тест, який виявляє проблему, є успіхом. Тест, який не виявив проблеми, був марною тратою часу.


Розглянемо наступну аналогію з Майєрса (1979). Припустимо, що з вами щось не так. Ви йдете до лікаря. Він повинен запустити тести, з’ясувати, що не так, і рекомендувати коригувальні дії. Він проходить тест за тестом після тесту. Зрештою, він не може знайти нічого поганого. Він чудовий тестер чи некомпетентний діагност? Якщо ти справді хворий, він некомпетентний, і всі ці дорогі випробування були марною тратою часу, грошей та зусиль. У програмному забезпеченні ви діагност. Програма - (впевнено) хворий пацієнт ...


Розумієте, суть вище полягає в тому, що слід з розумом поставити пріоритет на тестування. Очікується, що тестування займе обмежений час, і неможливо протестувати все у вказаний час.

Уявіть, що ви провели день (тиждень, місяць) на тестах, не знайдіть помилок і дозвольте помилку проскочити через те, що ви не встигли запустити тест, який би виявив це. Якщо це трапиться, ви не можете просто сказати, «це не моя вина, тому що я був зайнятий запуском інших тестів», щоб виправдати цю пропуску - якщо ви так скажете, ви все одно будете нести відповідальність.

Ви витратили час на тести, які не виявили помилок, і через це ви пропустили тест, який знайде помилку.

(У випадку, якщо вам цікаво, помилки, як описано вище, як правило, неминучі, як би ви не намагалися, і є способи вирішити це, але це буде більшою темою для окремого питання ... і, можливо, краще підходить для SQA. SE.)


12
Ця відповідь правильно відображає його позицію, але варто зазначити, що багато людей вважають, що його позиція неправильна. З огляду на вибір між тестом, який демонструє найважливішу функцію в додатку, працює правильно (тестування прийняття, якщо ви хочете), і тестом, який знаходить тривіальну помилку (вирівнювання на один піксель) у рідко використовуваному куточку програми, я знаю, яку я обрав би за обмежений час. І для аналогії лікаря: якщо я збираюся на перевірку, а не у відповідь на симптоми, підтвердження того, що серце добре, легені хороші і т. Д. - це хороший результат. Так що там.
Кейт Григорій

@KateGregory Я згоден, я вважаю те саме. Я особисто вважаю його думку неправильною, ми протестуємо в основному для збору інформації ..
Іван V

2
@KateGregory погоджуюсь - я не вважаю за правильне маркувати будь-який пройдений тест як загальний відхід. Хоча, я думаю, один момент, який він робить, є позачасовим : якщо помилка проходить через тестування випуску, QA знадобиться щось більше, ніж "о, але ми були зайняті запуском інших тестів", щоб покрити їх спину. Я в минулому переживав це як тестер, і зараз бачу це, коли я розробник, і не думаю, що це колись зникне
gnat

4

Ну, я не знаю містера Канера, але ІМХО

тести, які потенційно не знаходять помилок

є марною тратою часу. Це включає ситуацію, коли у вас вже є деякі тести (не має значення, чи вони автоматичні чи просто у контрольному списку), і ви додаєте нові тести, які фактично підтверджують ті самі випадки, які ви вже маєте. Тож ваші нові тести не знайдуть більше помилок, ніж існуючі.

Така ситуація може трапитися, наприклад, якщо ви просто через список випадковим чином - я можу сказати також "безмозковий" (вибачте мені це слово) - обирайте тестові випадки у вашій програмі, не замислюючись, чи перевіряють вони нову кращу справу, нову еквівалентність класи вхідних даних або якщо вони збільшують охоплення коду стосовно вже написаних тестів.


-1

На мою думку, ця цитата стосується надто загальних або непроривних тестів.

Якщо ви зробите тест на функцію, яка підтверджує електронні листи, а в тесті ви надаєте лише дійсні електронні листи, цей тест є абсолютно марним. Вам доведеться перевірити цю функцію на наявність "будь-яких" рядків, недійсних, недійсних електронних листів, занадто довгих електронних листів, символів unicode (áêñç ....)

Якщо ви кодуєте тест, який перевіряє лише те, що name@dom.com повертає істину, а ім'я @ com повертає помилкове, цей тест зовсім не є тестом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.