[Ольга Назина] Техники локализации плавающих дефектов (2019)
Автор: Ольга Назина
Название: Техники локализации плавающих дефектов (2019)
Описание:
Ох уж эти мистические «плавающие ошибки». Сколько вокруг них мифов! Но, когда причина найдена, всегда оказывается, что нет плавающих багов, а есть недолокализованные.
Поэтому мы будем учиться локализовывать баги, которые «не воспроизводятся». Учиться искать причину проблемы без помощи разработчика. Учиться смотреть в код и искать причину снаружи. Делить бисекционно и читать логи. В общем, всё, что нужно для воспроизведения!
Воспроизведение ошибки
Если вы не можете вопроизвести ошибку, то:
- Прочитайте логи — если есть доступ к логам, всегда в первую очередь смотрим туда! Если у нас веб-приложение, проверьте, что ушло с клиента на сервер.
- Проверьте граничные значения — баги часто тусят на границах.
- Попробуйте пойти «от обратного» — подумать, как получить саму проблему. Этот метод хорошо работает для багов с кэшом
- Составьте таблицу отличий — у вас то все работает. Что отличает ваш кейс от падающего?
- Состояние объекта.
- Действия, которые с ним выполняли.
- Устройство, на котором воспроизводится.
- Время выполнения действия (какой релиз?).
- Способ воспроизведения (GUI, API).
- Количество открытых вкладок в браузере.
Локализация ошибки
Если вы можете воспроизвести баг, но не можете локализовать (слишком много шагов воспроизведения / слишком большой файл, внутри которого есть ошибка), то:
- Посмотрите код — возможно, это будет самым быстрым решением.
- Используйте бисекционное деление.
- Придумайте теорию (на баг влияет то и то) — подтвердите ее, а потом попробуйте опровергнуть.
- Выкиньте лишнее из шагов — возможно, именно это сбивает вас с толку
Для локализации багов мы будем применять техники:
- Черного ящика — как понять, что происходит, если нет доступа в код.
- Белого ящика — куда можно посмотреть в коде? Смотреть будем на примере приложения folks с открытым исходным java-кодом. Разумеется, у вас на проекте код будет выглядеть по-другому, но зато вы получите представление, где там могут вылезти баги. Баги, которые мы будем рассматривать на курсе, не были внесены в приложение нарочно — так что все приближено к реальности.
Если вы переживаете, что не сможете что-то сделать (например, задания на просмотр кода), вот вам задача для самопроверки — соберите проект folks и запустите тесты. Инструкция есть, есть даже видео-инструкция по установке java, maven на Windows, Если справитесь, то и все остальное будет вам по плечу!
Программа курса
0. Введение
Что такое локализация и зачем она вообще нужна тестировщику.
Как умение локализовывать задачи экономит время команды и убирает панику.
Как знание о типовых проблемах помогает воспроизводить баги, которые «не воспроизводятся».
1. Уточнение устройств, на которых есть баг
На что обращать внимание при багах «поехала верстка», «текст вылезает за пределы экрана».
Как понять, в какой момент едет верстка? Какие инструменты использовать:
— как замерить размер окна;
— какие есть линейки;
— как посмотреть размер окна в консоли.
2. Исследование состояний
Изучим разные состояния объекта. Если проблема при сохранении — а кого мы вообще сохраняем?
— свежесозданную карточку
— отредактированную
— удаленную
…
Если у нас есть пользователь, то какой он? А как регистрировался? Как это может повлиять на воспроизведение бага?
3. Использование классов эквивалентности и граничных значений
Что такое классы эквивалентности.
Почему на границах встречаются баги.
Зачем тестировать ноль и как его найти, если у нас не строка ввода?
4. Опровержение своих теорий
Как опровергать свои теории и зачем это нужно.
— таблица отличий;
— метод «найди 5 отличий»;
— принцип минимализма (отсеивание лишнего).
5. Метод бисекционного деления
Что такое бисекционное деление.
Как его использовать тестировщику для локализации бага.
Как оно используется в разработке и к каким проблемам может привести.
6. Чтение логов
Что такое логи. Что в них записывается?
Как читать логи. Как читать стектрейс ошибки.
Логи на сервере и на клиенте.
7. Просмотр запросов с клиента на сервер
На клиенте помимо JS-логов можно смотреть, что вообще ушло на сервер.
Это помогает понять, где произошла ошибка и кто виноват: клиент или сервер. Учимся это делать.
8. Воспроизведение «от обратного»
Техника расследования закрытой комнаты. Наиболее актуальна для багов с кэшом.
Вот есть баг, из кэша достаются неправильные данные. Как воспроизвести? Идем от обратного, пытаемся получить “плохие данные” разными путями.
9. Проверка по коду
Как читать код, при условии, что разработчики идут вам на встречу и разделяют потроха логики и описание объектов.
Читаем java-объект и схему создания БД. Выверяем их на соответствие друг другу.
Внимание: у вас на проекте может быть не java, но принцип все тот же. На примере домашнего задания вы увидите, как можно найти баг, исследуя код
10. Проверка соответствия типов данных
Если поле встречается в коде несколько раз:
— в объектной модели;
— в схеме создания БД;
— где-то еще
Важно проверять соответствие типов. Смотрим, какие встречаются баги на несоответствие типов.
11. Проверка стыка интеграции
Какая бывает интеграция между системами.
Какие бывают баги на стыке интеграции.
Куда смотреть в первую очередь.
12. Проверка данных после миграции
Зачем тестировщику нужна как чистая база, так и база, живущая веками?
Примеры ошибок, вылезающих после миграции и почему они не ловятся на свежей тестовой БД.
13. Проверка concurrency
Типичная ошибка — выполнение CRUD над одним пользователем. Тестировщик может найти баги, переключаясь между вкладками интерфейса. Но это про поиск багов, а не про локализацию, казалось бы, да?
Но о concurrency важно знать, так как параллельная работа может быть и на другом уровне:
- Идет забор данных из базы по 1000 записей за раз. Что, если в этой 1000 встретились 2 одинаковых клиента? Строка базы заблокирована первым изменением — второе разваливается.
- Интеграция по SOAP REST. Если запросов много, там тоже можно влететь на изменение одного и того же клиента.
14. Заключение
Подводим итоги.
Подробнее:
Скачать: