Автор: Санджит Хохар (Sunjeet Khokhar) Оригинал статьи Перевод: Ольга Алифанова Выдающиеся тестировщики, с которыми я имел счастье сотрудничать, не просто "сообщали, что там пожар" – они очень хорошо умели расследовать и сообщать –
- Как долго горит
- Каков масштаб бедствия
- Какие области затронуты, а какие нет
- Какова природа бедствия
- Когда оно началось
- Когда мы проверяли это последний раз
- Что могло быть причиной
- Что мы можем впредь сделать лучше, чтобы найти ответы на вышеуказанные вопросы, когда начнется следующий пожар.
Одна из основных сложностей исследовательского тестирования при тестировании незнакомой (и сложной) системы – это выяснение, куда смотреть для поиска источника ошибки с целью дебага и причинно-следственного анализа.
Исходя из своего опыта тестирования мульти-технологичных интегрированных систем, я составил список общих эвристик, которым я пользуюсь для исследования и поиска информации, помогающей в дебаге и вносящей вклад в выявление исходной причины проблем конечного пользователя.
Эвристики "сверху вниз"
Под "сверху вниз" в этом контексте я понимаю дебаг того стека системного компонента, где проклюнулся симптом.
Цель тут – задавать вопросы, чтобы выяснить, лежит ли исходная причина в вертикальном срезе архитектуры. Если это не так, то мы перейдем ко второму набору эвристик (то есть к интеграции этого системного компонента с другими компонентами архитектуры).
- Повторяемость симптомов. Можно ли систематически воспроизвести проблему через интерфейс? Какие комбинации браузеров и платформ лучше всего подходят для воспроизведения симптома?
- API-трафик для стека. Какие конечные точки API вызываются интерфейсом стека, когда происходит ошибка? Отвечают ли они? Что говорят инструменты разработчика в браузере (или другие методы) о структуре запроса и ответе при возникновении ошибки? Вызовите конечную точку API напрямую, с той же точно структурой запроса, и сравните ответ с ответом, полученным через интерфейс. Есть ли ошибки в консоли инструментов разработчика? Связаны ли они? Как вы это узнали?
- Транзакции базы данных внутри стека. В какие таблицы API должен вносить данные? В какие поля? Правильно ли наполнены эти таблицы/поля? Актуальны и верны ли определения схемы базы данных? Если вызывается сохраненная процедура, вызывается ли она на самом деле, как вы узнаете об этом? Логируются ли ошибки API/базы данных в базе? Если да, то есть ли ошибки в логах во время возникновения ошибки в интерфейсе пользователя? Если нет, вы должны ратовать за постоянное логирование ошибок для облегчения дебага.
- Последняя рабочая версия стека. В какой версии стека эта ошибка не возникала? Откатите стек к этой версии, теперь ошибка воспроизводится? Если нет, проведите совместную оценку изменений, осуществленных с тех пор. Есть ли у вас автотесты, сообщающие о статусе всех версий между рабочей и нерабочей? Просматривая эти проверки или меняя по одной переменной за раз вручную, можете ли вы точно сказать, с какой версии стека проблема начала появляться?
Эвристики архитектуры "из конца в конец".
Что ж, прогон наших проверок сверху вниз по стеку не привел к успеху, и теперь нужно исследовать интеграционные точки и другие компоненты системы, с которыми взаимодействует ваше приложение.
- Поток данных и события на интеграционных точках. Есть ли у вас диаграмма архитектурного решения, подтверждающая, с какими компонентами системы общается ваш стек? Можете ли вы ее нарисовать? Можете ли вы выяснить, каких данных или событий ваше приложение ожидает от системных компонентов, с которыми оно интегрируется, в момент возникновения ошибки? Получает ли ваше приложение ожидаемые данные? В правильном ли они формате? Можете ли вы проверить, какие данные пишутся в другие компоненты системы при возникновении ошибки? Как вы узнаете, что это действительно происходит? Есть ли логи, подтверждающие ваши ответы? Если их нет, боритесь за постоянное логирование ошибок.
- Последняя рабочая версия архитектуры. Знаете ли вы последние рабочие версии (в которых не возникала ошибка) всех интеграционных точек и системных компонентов? Можно ли откатить всю архитектуру к рабочей версии? Есть ли у вас автотесты, сообщающие о статусе всех компонентов между рабочими и нерабочими копиями архитектуры? Просматривая эти проверки (или вручную), можно ли выявить, в какой версии или при каком изменении компонента/точки интеграции начала возникать ошибка?
- Полнота архитектуры. Полна ли архитектура, все ли компоненты и точки интеграции отвечают? Есть ли логи, подтверждающие (или отрицающие), что в системе нет отсутствующих компонентов или нерабочей точки интеграции? Если их нет, обсудите с системным архитектором, как можно улучшить ситуацию для упрощения дебага.
- Нефункциональная/времязависимая деятельность в архитектуре. Есть ли какие-либо ресурсоемкие (CPU, память, диск, ввод-вывод) процессы, запущенные или стартующие в другой части архитектуры в момент возникновения проблемы? можно ли отслеживать ресурсы компонентов и точек интеграции? Как вы узнаете, что эти процессы завершились или зависли? Если это нельзя сделать, куда обратиться за подтверждением отказа этих процессов или задач? Нет ли таймаутов – не ожидает ли какой-либо системный компонент ответа другого, не получая его? Есть ли логирование этих моментов? Если нет, то вы уже знаете, что делать :-)
|