Материал в данном уроке рекомендуется к прочтению, но выпишите основную суть лекции себе в тетрадь, т.к я этот вопрос точно буду задавать на экзамене.
Эффект пестицида
Если повторять одни и те же тесты снова и снова, в какой-то момент они перестанут выявлять новые ошибки.
Эту аналогию ввел Борис Бейзер в 1983 г в своей книге «Software Testing Techniques». Он привел пример обработки полей пестицидами. Поле обрабатывается неким пестицидом в первый раз, и значительная часть вредителей погибает.
Но некоторые всё же выживают, потому что их организмы оказались устойчивы к действию яда. Если повторно обработать поле тем же пестицидом, то выжившие после первой обработки с большой вероятностью выживут и после второй.
Аналогично в тестировании. Повторное применение тех же тестов и тех же методик приводит к тому, что в продукте остаются именно те дефекты, против которых эти тесты и эти методики неэффективны.
Чтобы избежать эффекта пестицида, нужно каждый раз брать разные значения для тестов. Например, у нас есть такой чек-лист для тестирования имени при регистрации:
В первый раз берем пример, а потом используем что-то своё. Мужское имя? Иван, Александр, Ян, Анатолий…
Это помогает найти ошибки, о которых мы даже не думали! Например, система ругается на вполне нормальное имя «Иван», пропуская «Саша», «Антон» (вполне реальная история с Иваном кликните, чтобы прочитать).
Или мы исходно предполагаем, что имя — это простая строка, поэтому ее не надо делить на «мужское / женское / …». А потом выясняется, что система по имени ставит пол и всех считает мужчинами. Или ругается на женские имена, мол, «таких не бывает». Или что-то ещё.
То есть смена тестовых данных может помочь нам найти класс эквивалентности, о котором мы не подумали. Но на который натолкнулись случайно.
Так что если у нас есть в чек-листе пример — используем его. Для первого раза. А потом начинаем варьировать:
— Если нужно ввести число, то каждый раз пробуем разное. То 5, то 55, то вообще 888888.
— Если нужен реальный московский адрес, то каждый раз пробуем ввести новый. Или играем формой записи: «Москва, Турчанинов пер, 6», «город Москва, пер Турчанинов 6», «г. Москва, пер. Турчанинов, дом 6»…
— Если нужен email, тоже пробуем разные. С точкой внутри, с тире, начинается с заглавной буквы, с маленькой…
— Если нужно выбрать цвет в фильтре интернет-магазина, то один раз выбрали красный, потом зеленый, потом черный, потом фиолетовый…
Если вы нашли баг благодаря тому, что выбрали другое значение — нужно провести анализ. Из-за чего именно возникла ошибка? Чем «падающее» значение отличается от примера? Вполне возможно, что это отдельный класс эквивалентности, просто вы о нем не подумали раньше.
В таком случае расширяем исходный чек-лист, добавляя новую строку для проверки. Например, в имя вводили Иван, Мария, Анна — все было нормально. А ввели двойное «Анна Мария», и система сломалась. Разработчик посчитал, что имя — это одно слово. Ага, понятно. Значит, теперь будем проверять:
• Имя в одно слово (Иван, Мария, Антуаннетта)
• Имя в несколько слов (Анна Мария, Анна-Мария, Жан Жак Руссо)
Иногда смотришь потом на новые проверки и думаешь:
— Как я раньше об этом не подумал? Разные же значения!
Но это не страшно. Лучше запомните на будущее, что есть и такая проверка. Главное — не упираться в один и тот же пример. Иногда взятое с потолка значение помогает найти баг и обнаружить отдельный класс эквивалентности!
Та самая история с Иваном, которая до этого упоминалась.
Пару лет назад Иван зашел на сайт банка Х и попробовал оставить заявку на кредит. Ввел ФИО и получил отлуп — «Имя «Иван» вводить нельзя»
Оказалось, что это криво реализованная защита от дурака. ФИО «Иванов Иван Иванович» вызывает подозрение. Скорее всего, это вымышленные данные, которые ввел тестировщик, или человек, который просто дурачится, не хочет давать свои данные.
Конечно, даже Иванов Иван Иванович может встретиться, но таких очень мало и с ними проще работать в ручном режиме. А от вымышленных данных защититься.
Проблема в том, что нужно было запретить связку: имя Иван и фамилия Иванов и отчество Иванович. То есть условие в коде записать через AND.
А разработчики сделали через OR: если фамилия Иванов ИЛИ имя Иван ИЛИ отчество Иванович — получай ошибку!
Так что увы, все Ивановы, и даже просто Иваны. Таких имен нет, выберите другое!