Разбор тренажера
Треугольники
Когда пользователи находят вдвое больше багов, чем ты спрятал
Здравствуйте, коллеги!

Какое-то время назад мы опубликовали тренажер, имитирующий одну из стандартных задач на собеседовании тестировщика: тестирование утилиты, которая выводит данные о треугольниках. Мы решили дать коллегам возможность потренироваться — и не прогадали. Посещаемость сайта в определенные моменты доходила до 400 rps, а всего нашим тренажером воспользовалось больше 7000 уникальных пользователей.

Теперь мы, как и обещали, выкладываем ответы к этой задаче. Внимание, дальше будут спойлеры. Если вы хотели пройти этот тренажер самостоятельно, пока что дальше лучше не читать.
Показывайте уже!
В тренажере было два типа задач: проверить 12 тест-кейсов из тех, что мы задумали, и найти 4 спрятанных бага.

Как это обычно и бывает, багов оказалось больше, и многие их нашли и прислали репорты. Спасибо вам! Но обо всем по порядку.
Кейсы
Кейсов у нас было задумано 12.

1
Первое, что стоит сделать, увидев любую форму, попробовать просто по ней жмакнуть (засабмитить). Что ожидаем увидеть? Если кнопка сабмита не деактивирована (как в нашем случае), то самое ожидаемое поведение - форма выведет ошибки, сообщая, что не все обязательные поля для ввода были заполнены. Один кейс найден.

2
Второй кейс чем-то похож на предыдущий. Только в этом случае мы не заполняем одно поле (А или B). А остальные заполняем. Почему нельзя оставить пустым только поле C? Расскажем чуть ниже :)

3-7
Далее у нас идут позитивные кейсы. Вспоминаем уроки по геометрии, сколько существует треугольников? Нам удалось выделить пять видов: прямоугольный (3, 4, 5), тупоугольный (2, 3, 4), остроугольный (66, 67, 68), равнобедренный (3, 3, 5) и равносторонний (6, 6, 6). Все их можно перебрать, добавив себе пять очков к кейсам.

8
Снова возвращаемся к урокам геометрии. А какого треугольника быть не может? Верно, такого, у которого сумма двух маленьких сторон короче большой стороны (2, 3, 10). Все потому, что стороны в таком случае просто не смогут соединиться. Итак, еще один кейс: "не выполнились условия треугольника".

9
Очередной кейс, попробовать ввести в форму что-то, что никак не может являться сторонами треугольника. Например, буквы q, w, e. Итак, новые кейс найден: это не треугольник.

10
Далее начинается специфика тестирования в целом, и тестирование веб-приложения в частности. Тут, для начала, мы проверяем слишком большое число. Большим числом называем такое, которое больше максимального значения INT. Например, число 4294967295.

11
Два оставшихся кейса посвящены тестированию безопасности. Первый кейс, это проверка на SQL-инъекцию. На самом деле, конечно, писать настоящую инъекцию не надо, главное вообще подумать в эту сторону. Это уже будет означать, что о таком типе уязвимости вы помните. В нашем случае достаточно было ввести в поле такие ключевые слова, как select, or или where.

12
И последний кейс: XSS-уязвимость. О том, что это, можно почитать в нашей группе. Для того, чтобы кейс засчитался, необходимо было ввести тег для JS-кода. Т.е. <script> — в этом случае последний кейс засчитается и мы получим промокод на скидку.
Баги
Мы спрятали 4 бага.

1
Помните, мы говорили о том, что для кейса 2 пустым надо оставить либо поле A, либо поле B? Так вот, все дело в том, что первый баг - поле C не проверяется на заполненность. Если оставить его пустым, форма ничего на это не скажет и честно попытается определить, что же это за треугольник.

2

Второй баг связан снова с геометрией. Что такое равносторонний треугольник? Верно, это такой треугольник, у которого все стороны равны? Именно так подумали и мы. Потому если ввести в каждое поле по нулю, форма честно скажет, что этот треугольник равносторонний. Еще один баг найден.

3
Еще один баг, форма не умеет работать с нецелыми числами. Т.е. если ввести 2.2 для одной из сторон, то форма не сможет определить, что же это за треугольник.

4
Последний баг снова связан с XSS. Но ведь мы уже ее проверяли - недоумевали многие. Все так. Мы уже вводили тег <script> и форма нас ловила. Как? Вероятно (на самом деле точно), там просто стоит проверка, что если поле содержит подстроку <script>, то это попытка XSS. И правильно обработала такую атаку. Так делает большое количество веб-приложений. Но вот что частенько разработчики забывают: HTML-теги не являются регистрозависимыми. А если проще — они могут быть написаны как маленькими буквами, так и большими. Да хоть вперемешку. Лишь бы в итоге получался верный тег. И если в нашу форму ввести <SCRIPT>, то далее можно писать любой JS-код. Он исполнится и последний баг будет засчитан.

Вот такие баги запрятали в эту форму мы. Но нашим тестировщикам удалось еще столько же!
Еще баги!
1
Можно подобрать такой набор данных, который должен "стриггерить" сразу два кейса или один кейс и один баг. Например, если ввести в поля A и B значение 5, а поле C оставить пустым, мы должны одновременно получить кейс "это не треугольник" и баг "форма не валидирует поле C". Но в первой версии тренажера мы не учли этого и некоторым пользователям приходилось пробовать все наборы данных по несколько раз. Конечно, баг был найден в первые же 45 минут и исправлен. :)

2
Хостер тоже беспокоится о нас. Вот почему при вводе некоторых подозрительных данных запрос получал 500-ую ошибку. Например, если использовать граничное значение INT - число 2147483647 введенное в два или три поля сразу. Мы никак не могли на это повлиять и обработать такой запрос. Когда связались с поддержкой, узнали, что это сделано намеренно и никак нельзя отключить для нас. Ну и ладно, спасибо ребятам за заботу.

3
Конечно, многие догадались посмотреть в исходники и найти там всю логику, так или иначе дающую указания на то, какие баги и кейсы искать. Сначала мы ее вообще никак не прятали и оставили в открытом JS-файле. Затем мы обфусцировали код и запрятали в середину библиотеки JQuery, но и это не помогло. Когда уже было решили уносить все с клиента — поняли, что для специалистов с такими навыками форма покажется простой. Потому и оставили как есть.

4
Баг это или нет, но некоторые писали, что форма выглядит так, словно ее сделали тяп-ляп на коленке. Скорее всего это похоже на правду, мы действительно сделали ее довольно быстро. От идеи развлечь вас и дать возможность бесплатно попрактиковаться до момента релиза прошло не более пары часов. Все равно мы надеемся, что вы получили удовольствие и вам все понравилось. :)
Благодарности
Спасибо всем, кто участвовал — вы клевые :) Мы постараемся радовать вас новыми тренажерами, это и интересно, и полезно, и хороший способ отвлечься от работы. Если вам интересно — вступайте в нашу группу VK, делитесь своими впечатлениями и приходите на курсы!
Кстати, в честь дня знаний мы сделали классную акцию - можете заглянуть на страницу и посмотреть, что мы вам приготовили.
А чтобы получать новости о новых тренажерах и разборах — подпишитесь на нашу рассылку!