Рубрики
Без рубрики

Инструменты для автоматизации тестов Python

Эйа, ребята, Код этого поста можно найти на GitHub (см. Здесь). Когда проекты становятся хорошими … Tagged с помощью тестирования, питона, производительности, DevOps.

Эйа, ребята,

Код этого поста можно найти на 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”