Написание системных тестов с оценкой покрытия
Зачем нужно оценивать степень покрытия
При разработке тестов одним из базовых параметров качества написанных тестов является степень покрытия. Данный параметр указывает какой процент из строк кода приложения был выполнен в рамках теста. Таким образом, если степень покрытия стремится к 100%, то это значит, что во время выполнения теста все строки кода были успешно выполнены.
Стоит отметить, что степень покрытия не даёт гарантии, что приложение будет работать без ошибок. Она всего-лишь говорит, что эти линии кода при определённых обстоятельствах выполнились в рамках теста успешно. Зачастую при изменении параметров ввода или последовательности взаимодействия с приложением могут возникнуть различного рода ошибочные ситуации.
Однако уже подтверждение того, что приложение в определённых сценариях может работать корректно и что эти сценарии выполняют весь код приложения, является достаточно позитивной информацией, чтобы стремиться к увеличению степени покрытия для своих тестов. Некоторые практики по созданию тестов отмечают, что для любого приложения необходимо поддерживать степень покрытия не менее чем 95%. Если степень покрытия снижается ниже данного числа, то можно считать, что приложение вообще не тестируется.
Использование библиотеки SimpleCov
Библиотека SimpleCov позволяет решить задачу оценки степени покрытия тестами для Ruby.
Документания
- Официальная страница библиотеки анализа степени покрытия тестами SimpleCov
Подключение к тестам на RSpec
- Добавьте джем
simplecov
к зависимостям вашего приложения и установите его. -
Подключите SimpleCov в файле тестов
spec/spec_helper.rb
:require 'simplecov' SimpleCov.start do add_filter %r{^/spec/} # Исключение кода самих тестов из оценки end
Подключение необходимо производить в самом начале файла, до подключения всех остальных файлов.
- Запустите тесты приложения с помощью
rspec
. - Откройте файл
coverage/index.html
, чтобы посмотреть на степень покрытия для всего приложения и каждого файла в отдельности.
Задача
Разработайте приложение, которое позволяет осуществлять бронирование мест на авиаперелёты. Приложение должно хранить у себя список доступных авиационных перелётов. Для каждого перелёта указывается:
- Аэропорт отправления.
- Аэропорт прибытия.
- Номер рейса.
- Количество доступных посадочных мест.
- Количество забронированных посадочных мест.
- Время вылета.
- Время прибытия.
- Стоимость одного посадочного места.
Приложение должно предоставлять следующие функции:
- Подборка необходимого авиарейса. Выбор рейса должен быть реализован по аэропорту отправления, прибытия и доступности по количеству посадочных мест.
- При показе страницы можно выводить полный список рейсов.
- Если указан аэропорт отправления, то только рейсы из данного аэропорта следует выводить.
- Если указан аэропорт прибытия, то только рейсы для данного аэропорта следует выводить.
- Если указаны оба аэропорта, то необходимо выбирать соответствующие рейсы.
- Состояние полей ввода должно сохраняться после выполнения поиска.
- Осуществление бронирование места на выбранном авиарейсе. После выполнения бронирования общее количество мест должно уменьшаться в зависимости от количества забронированных мест.
Технические требования к реализации
- Приложение должно сохранять данные между перезапусками приложения.
- Для ключевых сценариев работы должны быть написаны системные тесты.
- Степень покрытия тестами вашего кода должна быть не менее 95%.
- Для страницы подбора авиарейса желательно использовать выпадающие списки для выбора аэропорта отправления и прибытия.
Решение проблемы с изменяющимся хранилищем для тестов
При реализации сценариев следует использовать отдельное хранилище данных для тестов. Данные из данного хранилища должны считываться в начале теста, но по окончании работы теста они не должны записываться в хранилище. Таким образом каждый тест будет знать корректное состояние приложения до старта и сможет опираться на него.
Другой альтернативой может стать дополнение предыдущей схемы с методами по добавлению нужных данных внутрь хранилища во время работы приложения. Этот подход позволяет не содержать очень большое хранилище подо все случаи и улучшить читаемость тестов, так как очевидно откуда берутся данные для теста.
Сценарии для проверки работы приложения
Показ всех рейсов
- Приложение показывает страницу со списком рейсов.
- Количество рейсов на странице должно соответствовать количеству рейсов в хранилище.
Поиск рейсов по пункту отправления
- Приложение показывает страницу со списком рейсов.
- Пользователь указывает в качестве аэропорта отправления «Шереметьево» и нажимает на кнопку «Найти рейсы».
- Приложение показывает страницу со рейсами, пунктом отправления которых является «Шереметьево».
Поиск рейсов по пункту назначения
- Приложение показывает страницу со списком рейсов.
- Пользователь указывает в качестве аэропорта назначения «Толмачёво» и нажимает на кнопку «Найти рейсы».
- Приложение показывает страницу со рейсами, пунктом назначения которых является «Толмачёво».
Поиск существующего рейса по пункту назначения и отправления
- Приложение показывает страницу со списком рейсов.
- Пользователь указывает в качестве аэропорта отправления «Новороссийск», в аэропорт назначения «Внуково» и нажимает на кнопку «Найти рейсы».
- Приложение показывает страницу с необходимыми рейсами.
Поиск несуществующего рейса по пункту назначения и отправления
- Приложение показывает страницу со списком рейсов.
- Пользователь указывает в качестве аэропорта отправления «Симферополь», в аэропорт назначения «Мюнхен» и нажимает на кнопку «Найти рейсы».
- Приложение показывает страницу со списком рейсов, на которой написано «По указанному направлению нет авиационного сообщения».
Бронирование билета на доступный рейс
- Приложение показывает страницу со списком рейсов.
- Пользователь выбирает второй доступный рейс. У данного рейса должно быть больше 5 свободных мест для бронирования.
- Приложение показывает страницу с информацией по данному рейсу.
- Пользователь нажимает на кнопку «Забронировать билеты».
- Приложение показывает страницу с бронированием билетов.
- Пользователь выбирает в выпадающем меню 3 взрослых билета и нажимает на кнопку «Забронировать билеты».
- Приложение показывает информационную страницу, информирующую пользователя о том, что билеты забронированы.
- Пользователь нажимает на кнопку «Вернуться к списку авиарейсов».
- Приложение показывает обновлённое количество билетов, доступных для данного рейса.
Бронирование последнего билета на рейс
- Приложение показывает страницу со списком рейсов.
- Пользователь выбирает третий доступный рейс. У данного рейса должно быть ровно 2 доступных места.
- Приложение показывает страницу с информацией по данному рейсу.
- Пользователь нажимает на кнопку «Забронировать билеты».
- Приложение показывает страницу с бронированием билетов.
- Пользователь выбирает в выпадающем меню 2 взрослых билета и нажимает на кнопку «Забронировать билеты».
- Приложение показывает информационную страницу, информирующую пользователя о том, что билеты забронированы.
- Пользователь нажимает на кнопку «Вернуться к списку авиарейсов».
- Приложение показывает список авиарейсов, в котором уже нет указанного рейса.
Попытка бронирования недоступного количества билетов
- Приложение показывает страницу со списком рейсов.
- Пользователь выбирает третий доступный рейс. У данного рейса должно быть ровно 2 доступных места.
- Приложение показывает страницу с информацией по данному рейсу.
- Пользователь нажимает на кнопку «Забронировать билеты».
- Приложение показывает страницу с бронированием билетов.
- Пользователь выбирает в выпадающем меню 5 взрослых билетов и нажимает на кнопку «Забронировать билеты».
- Приложение показывает страницу с бронированием билетов, на которой отображается сообщение «К сожалению на данный рейс не осталось указанного вами количества билетов».