Тестирование web-интерфейса приложения SBTS

Тестирование интерфейса веб-приложения с помощью Selenium, pytest и ChromeDriver.

Как запустить тесты?

Запуск сервера приложения SBTS

Запустите сервер приложения SBTS с помощью docker compose:

docker compose up -d

Запуск самих тестов

Nix-системы

Для nix систем доступен flake flake.nix, который автоматически настраивает окружение и предоставляет оболочку разработчика одной командой:

nix develop

Затем тесты можно запустить командой:

pytest webui

Другие системы

1. Установка Google Chrome

На системе должен быть установлен браузер Google Chrome и доступен в $PATH.
Также можно самостоятельно указать путь к браузеру, задав переменную окружения CHROME_PATH.

2. Установка ChromeDriver

Для работы тестов с браузером на системе должен быть установлен движок ChromeDriver. Многие репозитории предоставляют пакет chromedriver, который может быть установлен и добавлен в $PATH пакетным менеджером системы.
Например, для Arch Linux chromedriver досупен в AUR:

paru -S chromedriver

Также можно самостоятельно указать путь к движку, задав переменную окружения CHROMEDRIVER_PATH.

3. Установка selenium, pytest и запуск тестов

С помощью poetry:

poetry install

Затем тесты можно запустить командой:

poetry run pytest webui

Или же с помощью pip:

pip -r requirements.txt

Затем тесты можно запустить командой:

pytest webui

Перед запуском тестов можно указать значение переменной окружения TESTING_URL - ссылки, к которой будет подключаться браузер (по умолчанию - http://localhost:8091/)

Ожидается, что все тесты провалятся, что сообщит о найденных ошибках. Тестирование проходит ~30 секунд.

Найденные ошибки

Ошибка #1

Раздел
2. Описание модели и режима перемещения

Описание
Перемещаемый корабль может выйти за предел или переместиться на место левого ограничителя (расположенного на координате -20), при быстром нажатии на кнопку перемещения влево, что запрещено правилами ТЗ.

Тест
Проверяется тестом test_moving_past_left_boundary().

Ошибка #2

Раздел
2. Описание модели и режима перемещения

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

Тест
Используется тест test_moving_during_timer().

Ошибка #3

Раздел
1. Сессии и авторизация

Описание
Корректный идентификатор сессии длиной 20 символов не может использоваться для входа в систему, хотя ТЗ завявляет, что идентификатор сессии может быть от 4 до 20 символов.

Тест
Используется тест test_long_session_id().

Ошибка #4

Раздел
3. Описание режима торговли

Описание
Продажа товара порту повышает цену покупки и понижает цену продажи, хотя ТЗ завявляет, что цена покупки должна понижаться, а цена продажи повышаться.

Тест
Используется тест test_sell_item_to_dock_price_change(). Для простоты, предполагается, что всегда есть порт на начальной клетке, в котором есть вода, которую можно купить.

Ошибка #5

Раздел
3. Описание режима торговли

Описание
Продажа одной единицы медикаментов порту при отстутствии медикаментов на корабле повышает цену покупки, что свидетельствует об успешности продажи, хотя не выполняется условие совершения операции о доступности выбранного количества товара на корабле.

Тест
Используется тест test_sell_item_to_dock_price_change(). Для простоты, предполагается, что всегда есть порт на начальной клетке, в котором можно продать медикаменты, которых нет на корабле.