Преа́мбула: в связи со спецификой условий выполнения задачи, код далее написан исходя из следующих принципов:
- Больше, не значит лучше.
- Сначала функционал, потом оптимизация.
- Делаешь, как понимаешь.
Подробности специфики не уточняю, однако автор полностью согласен со всей критикой в части, например, оптимизации кода.
Код написан по заданию Hopper IT.
Работаем с репозиторием.
Поставленные задачи:
- Реализовать набор автотестов для представленного web-сервиса на Python.
Для того, чтобы проверить в работе автотесты, мы будем работать с локальной копией web-сервиса из репозитория. Для этого...
1.1 Разверните сервис согласно инструкции предложенного репозитория или, если что-то пошло не так, то исходного репозитория.
1.2 Скачайте код:
https://github.com/Sam1808/QA-Hopper
1.3 Создайте виртуальное окружение, активируте его и перейдите в папку QA-Hopper
:
python3 -m venv _название_окружения_
1.4 Обновите установщик пакетов pip
(не помешает) и установите зависимости:
pip install --upgrade pip
pip install -r requirements.txt
1.5 Вы сделали почти все, пора приступать к тестам...
Лирика: Согласно инструкций предложенных репозиториев, для web-сервисов реализован API по ссылкам /api/subscribe
и /api/subscribers
, однако... у меня по указанным ссылкам API не доступен :(.
Причины выяснять не стал, откопав в коде доступный API по ссылке /subscriptions
.
Далее весь код реализован с помощью фреймворка PyTest
на основании доступности API сервиса.
2.1 Определите URL по которому доступен сервис (по умолчанию http://localhost:4000
).
2.2 Убедитесь в доступности API (по умолчанию http://localhost:4000/subscriptions
).
2.3 В папке представлено три основных файла для работы:
conftest.py
- конфигурация наших тестов.
tests.py
- сами тесты.
load_data.txt
- данные для использования в тестировании.
О каждом файле по порядку...
Используется для переопределения URL сайта (п.2.1) и API URL сайта (п.2.2). Таким образом, если URL сайтов у вас отличаются от значения по умолчанию, вы можете их переопределить в командной строке, при запуске тестов. Подробнее в Примерах.
Непосредственно сами тесты. Название функции определяет цель теста.
Например, test_create_subscriber
на самом деле тестирует создание подписчика.
Файл с тестовыми данными.
Мы тестируем Cервис подписок
, данных много и очень удобно, если у нас есть возможность вынести их в отдельный файл. Каждая новая строка - новый словарь с тестовыми данными. В текущем репозитории приложен пример, который вы можете изменять по своему усмотрению:
{"email": "test@email.com","name": "test_name","time": "7s","comment": "Test0 - Pozitive",}
{"email": "test@email.com","name": "test_name","time": "7m","comment": "Test1 - Pozitive",}
{"email": "test@email.com","name": "test_name","time": "7d","comment": "Test2 - Pozitive"}
{"email": "test@email.com","name": "","time": "7d","comment": "Test3 - Negative"}
{"email": "test@email.com","name": "","time": "7d","comment": "Test4 - Negative"}
{"email": "test@email","name": "test_name","time": "7d","comment": "Test5 - Negative"}
{"email": "@email.com","name": "test_name","time": "7d","comment": "Test6 - Negative"}
Поля email
, name
, time
используются для создания подписчика, поле comment
никак не используется сервисом (хотя и возвращается через API), поэтому мы можем пользовать его на свое усмотрение, например, чтобы комментировать характер теста.
При отсуствии требований к приложению тяжело судить, будет ли конкретная ситуация считаться ошибкой (например, имя пользователя с использованием спецсиволов?), но отследить поведение приложения можно без проблем.
2.4. Предлагаю уже запускать тесты. Итак примеры:
pytest tests.py
Запускает тесты в минимальным выводом в консоль и отчетом об ошибках.
В текущей конфигурации это 51 тест меньше, чем за 2 секунды. ;)
pytest -v tests.py
Тесты с более подробной детализацией в консоли.
pytest -s -v tests.py
Тесты с более подробной детализацией в консоли. Плюс, если были отладочные принты - то вы бы их тоже увидели. Учень удобно пользовать такие принты с полем комментариев, которое есть у нас в файле с тестовыми данными.
pytest -v --site_url=http://localhost:8000 --api_url=http://localhost:8000/api/ tests.py
Здесь вы запустили тесты с переопределенными URL самого сайта и его API на http://localhost:8000
и http://localhost:8000/api/
, соответвенно.
2.5 И последнее, что хочется напомнить... AssertionError
- кратко расскажет вам причину ошибки. Обращайте внимание на test_data
в заголовке отчета, чтобы понимать, с какими именно данными приложение вызвало ошибку.
TODO:
- Можно все переписать на Selenium, тестов будет немного больше, но и их длительность существенно увеличится;
- Можно ещё отмаркировать тестовые функции, для того, чтобы была возможность запускать конкретные тесты;
- Если вы ошибётесь в файле с данными - система этого не поймет... по хорошему надо добавить проверку тестовых данных перед тем как запускать тесты;
- А ещё, можно попробовать управлять тестовыми данными через командную строку;
- Этот список можно придумывать бесконечно...
Ого! Вы дочитали до конца! Вам понравилось? В любом случае - поставте звездочку репозиторию, так хотя бы будет ясно, что его смотрели.