Эйа, ребята,
Код этого поста можно найти на GitHub (см. здесь ).
Когда проекты выращивают хороший набор тестов, дает вам уверенность в том, что новый код, который вы добавляете, не приводят к разрыву частей приложения. Это улучшает обслуживание проекта. Сложность небольших проектов низкая, и тесты необходимы только при увеличении размера проекта. Но ради этого урока мы напишем небольшой тест, чтобы продемонстрировать использование питест
, Токс
и Действия GitHub
Анкет
Мы будем хранить тесты в отдельной папке. Вот текущая структура проекта.
├── LICENSE ├── README.md ├── setup.py ├── tihttp.py ├── tests │ ├── __init__.py │ └── test_tihttp.py
Мы размещаем test_tihttp.py
Файл в Тесты
папка. Он будет содержать тестовый набор. main ()
Функция, которая содержит логику для запуска флагов, должна быть импортирована из tihttp.py
файл.
from tihttp import main def test_GET_body(capsys): main(["-B", "http://jsonplaceholder.typicode.com/todos?userId=1"]) captured = capsys.readouterr() result = captured.out with open("tests/jsonplaceholder.json", "r") as f: output = f.read() assert result == output
Мы сравниваем ответ запроса GET с API с ожидаемыми данными JSON. Мы размещаем jsonplaceholder.json
файл в ту же папку, которая содержит наш ожидаемый выход. Тогда мы устанавливаем pytest
и пусть он выполнит тест.
$ pip install pytest $ pytest
Наши тесты проходят. Чтобы увеличить условно -v
это полезный флаг. Кроме того, мне нравится использовать -s
флаг, чтобы увидеть захваченный вывод. Далее мы добавляем Pytest к нашим дополнительным требованиям в setup.py
файл.
extras_require={ 'dev': [ 'pytest', # pip install tihttp[dev] ], },
Это дает нам возможность легко установить дополнительные зависимости (тестирование, инструменты для сжима и т. Д.), Добавляя [dev]
На имя пакета.
$ pip install .[dev] # local install $ pip install tihttp[dev] # remote install, PyPI repo
Мы проверили все это с помощью Python 3.7.3. Но как ведут себя наше приложение при выполнении в другой версии переводчика? Итак, давайте проверим его на разных версиях Python! Мы используем токс
. Это позволяет нам запускать тесты в нескольких виртуальных ENV.
$ pip install tox
Tox нужен рецепт, чтобы узнать, какие команды VirtualEnv/Commands для создания/выполнения. Этот рецепт назван tox.ini
Анкет
[tox] envlist = py36,py37,py38,py39 [testenv] deps = pytest commands = pytest
Если некоторые из переводчиков Python отсутствуют в вашей системе, установите их из архива Deadsnakes:
$ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt install python3.5 python3.6 python3.7 python3.8 python3.9
Теперь давайте проверим разных переводчиков!
$ tox
Если вы хотите проверить по конкретной среде или выполнить только один файл, введите:
$ tox -e py38 $ tox -e py38 -- test/main_test.py # executes only a single test
Хорошо, мы провели тест на локальном уровне, но при работе в команде, использующей непрерывную интеграцию, довольно удобно. Мы устанавливаем Integrate.yaml
Задайте в пределах .github/Workflows
Справочник, чтобы рассказать github actions, какие задания выполнить. Следующий файл действий GitHub будет проверять на разных платформах и версиях Python.
name: Python package on: [push] jobs: run: runs-on: ${{ matrix.os }} strategy: matrix: python-version: [3.6, 3.7, 3.8, 3.9] os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Cache pip uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- ${{ runner.os }}- - name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest pytest-cov pip install -r requirements.txt - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pytest
Не пугайтесь по длине этой работы. Это просто иллюстрирует, насколько мощными могут быть рабочие процессы GitHub. 🥰
Оригинал: “https://dev.to/niklastiede/tools-to-automate-python-tests-3394”