Раскрути локальный флеш-сервер для тестирования с помощью pytest - PullRequest
0 голосов
/ 16 ноября 2018

У меня следующая проблема.

Я бы хотел запустить тесты на локальном сервере флеш-памяти перед развертыванием в производство.Я использую Pytest для этого.Мой conftest.py на данный момент выглядит так:

import pytest
from toolbox import Toolbox
import subprocess


def pytest_addoption(parser):
    """Add option to pass --testenv=local to pytest cli command"""
    parser.addoption(
        "--testenv", action="store", default="exodemo", help="my option: type1 or type2"
    )


@pytest.fixture(scope="module")
def testenv(request):
    return request.config.getoption("--testenv")


@pytest.fixture(scope="module")
def testurl(testenv):
        if testenv == 'local':
            return 'http://localhost:5000/'
        else:
            return 'https://api.domain.com/'

Это позволяет мне проверить производственный API, введя команду pytest и протестировать локальный сервер флеш, набрав pytest --testenv=local

Этот код работает безупречно.

Моя проблема в том, что мне приходится вручную создавать экземпляр локального колб-сервера с терминала каждый раз, когда я хочу провести локальное тестирование, например:

source ../pypyenv/bin/activate
python ../app.py

Теперь я хотел добавить прибор, который инициируеттерминал в фоновом режиме в начале тестов и закрытие сервера после завершения тестирования.После долгих исследований и испытаний я все еще не могу заставить его работать.Это строка, которую я добавил к conftest.py:

@pytest.fixture(scope="module", autouse=True)
def spinup(testenv):
    if testenv == 'local':
        cmd = ['../pypyenv/bin/python', '../app.py']
        p = subprocess.Popen(cmd, shell=True)
        yield
        p.terminate()
    else:
        pass

Ошибки, которые я получаю от пакета запросов, который говорит, что нет соединения / отказано.

E request.exceptions.ConnectionError: HTTPConnectionPool (host = 'localhost', port = 5000): превышено максимальное количество попыток с помощью url: / login (вызвано NewConnectionError (': не удалось установить новое соединение): [Errno 111] Отказано в соединении ',))

/ usr / lib / python3 / dist-packages / запросы / adapters.py: 437: ConnectionError

Это значит для менячто сервер фляги под app.py не в сети.Какие-либо предложения?Я открыт для более элегантных альтернатив

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

С помощью bash-скрипта (спасибо @ekuusela) я наконец-то добился желаемого.Я добавил прибор, который вызывает bashscript spinserver.sh в новом окне терминала.Это работает в Ubuntu, команда отличается в разных средах (см. Выполнить команду терминала из python в новом окне терминала? для других сред).

@pytest.fixture(scope="session", autouse=True)
def client(testenv):
    if testenv != 'local':
        pass
    else:
        p = subprocess.Popen(['gnome-terminal', '-x', './spinserver.sh'])
        time.sleep(3)
        yield

Здесь очень простой bashscript

#!/bin/bash
cd ..
source pypyenv/bin/activate
python app.py
  • Команда sleep необходима, поскольку для инициализации сервера требуется некоторое время.
  • Не забудьте сделать исполняемый скрипт bash (chmod u + x spinserver.sh)
  • Я пытался выполнить разбор после yield, но p.kill на самом деле не закрываетсяокно.Это приемлемо для меня, так как не имеет значения, нужно ли мне вручную закрывать окно терминала, и я даже вижу отладку фляги, если это необходимо
0 голосов
/ 18 ноября 2018

Для локального тестирования Flask test_client является более элегантным решением. См. Документы по Тестирование . Вы можете создать прибор для test_client и создать тестовые запросы с этим:

@pytest.fixture
def app():
    app = create_app()
    yield app
    # teardown here

@pytest.fixture
def client(app):
    return app.test_client()

И используйте это так:

def test_can_login(client):
    response = client.post('/login', data={username='username', password='password'})
    assert response.status_code == 200

Если единственной проблемой являются шаги вручную, возможно, стоит рассмотреть сценарий bash, который выполняет ваши ручные настройки и после этого выполняет pytest.

...