Проект задуман для нескольких целей:
- Учебное пособие по автоматизации тестирования на
Python. - Универсальный шаблон для проектирования фреймворка автоматизации тестирования.
- Источник живых (не абстрактных) примеров кода и отчётов о прогоне автотестов.
На протяжении более чем 10-летнего опыта в сфере тестирования ПО приходилось регулярно изобретать велосипеды и при смене работы зачастую воспроизводить собственные идеи повторно.
И в какой-то момент захотелось где-то иметь базу знаний с лучшими наработками. По понятным причинам прямое цитирование не представлялось возможным. Поэтому я нашёл открытый API и решил создать этот репозиторий.
На данный момент в проекте реализованы автотесты для:
- Открытого учебного сервиса Restful-Booker как пример автоматизации тестирования REST API. Реализован базовый класс для отправки HTTP запросов и его наследник - клиент для конкретного сервиса.
- Учебного примера gRPC сервиса, написанного на Python как пример автоматизации тестирования gRPC сервисов. Аналогично - реализован базовый класс для отправки gRPC запросов, а затем клиент для конкретного сервиса. Сам сервис не хостится нигде, если захотите попробовать запустить тесты для него - его нужно установить и запустить локально (инструкцию см. в его репозитории).
В планах - для демонстрации универсальности подхода - сделать тесты для хотя бы
ещё одного сервиса с REST API. Возможно, SOAP. Автоматизацию
тестирования фронта (WEB UI) тоже вероятно не обойдём стороной:
Selenium, Playwright. В итоге хотелось бы получить большой проект автотестов,
в котором дружно существуют в человекопонятной структуре разные виды тестов на
разные сервисы. При этом написанные в одном стиле, используя общие подходы.
Но даже сейчас - с небольшим набором тестов на пару сервисов проект представляет
собой вполне реальный пример, частный случай того что Вы можете встретить,
устроившись на работу в команду разработки WEB-приложений, или возможно сами уже
сочиняли что-то подобное в рамках такой команды. Это не абстрактные Hello World
примеры, какими обычно они бывают в документациях.
Код проекта писался на Python 3.12, но насколько я могу судить - я не
использую каких-то "современных" конструкций языка, и смею предположить
что код будет работать на Python 3.8 (а может и более ранних, я не пробовал).
Другое дело что все зависимости проекта (см. requirements.txt) имеют жёстко
зафиксированную версию, а это значит что вероятно на ранних версиях языка они
просто могут не установиться.
После стягивания репозитория:
- Создаём
venvсPython 3.12. - Активируем
venvи устанавливаем зависимости:
pip install -r requirements.txtКроме того потребуется установить Allure Reports
и настроить переменные окружения чтобы из любого места системы можно было вызывать
команду allure.
Для тестирования gRPC сервиса нужно сгенерировать необходимый код из .proto.
В корне проекта:
python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. schema\grpc_example_service\GrpcExampleService.protoВсё. Можно запускать тесты. В корневой папке проекта:
pytest --alluredir allure_reportsПосле прохождения тестов исходники для отчёта будут в папке allure_reports
в корне проекта. Для генерации отчёта (в корне проекта):
allure serve allure_reports| - - preconditions
| - - schema
| - - test_tools
| - - - - asserters
| - - - - clients
| - - - - constants
| - - - - objects
| - - - - waiters
| - - tests
| .pylintrc - файл-конфиг для линтера pylint.
| config.yaml - конфигурационный файл.
| conftest.py - служебный файл-конфиг для тестов Pytest (регистрация фикстур, хуки и т.д)
| logging.conf - файл-конфиг логера.
| pytest.ini - файл-конфиг для Pytest.
| README.md - документ который ты сейчас читаешь.
| requirements.txt - список зависимостей проекта.
| requirements-dev.txt - список технических зависимостей проекта, которые
напрямую не влияют на работу тестов (линтеры, например, там).
Здесь лежат фикстуры Pytest семантически разделённые по модулям.
Каждый модуль нужно "зарегистрировать" в корневом conftest.py в
переменной pytest_plugins чтобы тесты видели фикстуры из него.
Здесь .proto файлы и сгенерированный код для gRPC сервиса.
Всё вспомогательное, что нужно для того чтобы тесты не выглядели монструозными франкенштейнами. Как только возникает мысль о реализации чего-то переиспользуемого - кладём это здесь.
Самописные асертеры. Основная причина их писать - чтобы не думать о том как это будет отображаться в отчёте.
Клиенты (как базовые, так и наследники) для работы с сервисами.
Один из вариантов хранения констант - выделение своей папки (пакета) под них.
Для тех кто любит самописные объекты, а также такие слова как "Композиция" в ООП - надо выделить под это своё место.
Всегда есть что-то асинхронное и потребность организовывать ожидание какого-то события. Хороший подход - сделать набор целевых ожидалок. И выделить под них место в структуре проекта.
Собственно тесты.
Кроме работы с системой отчётности Allure Reports реализовано
логирование при помощи стандартной библиотеки logging. Конфигурирование
организовано с помощью файла logging.conf в корне проекта
описание подхода.
Где нужен логер - он инициализируется на уровне модуля с уникальным именем,
логирование приисходит одновременно в консоль и в файл. По умолчанию оба
варианта настроены на уровень DEBUG. Файл для логов - log.log
(создастся в корне проекта при запуске).
К проекту прикручен самый распространённый линтер - Pylint.
Настроен для него конфиг - .pylintrc - лежит в корне проекта.