Как создать отчет о покрытии для интеграционных тестов на основе http? - PullRequest
0 голосов
/ 05 июня 2018

Я пишу интеграционные тесты для проекта, в котором я выполняю HTTP-вызовы и проверяю, были ли они успешными или нет.

Поскольку я не импортирую какой-либо модуль и не вызываю функции напрямую, в отчете cover.py дляэто 0%.

Я хочу знать, как создать отчет о покрытии для таких тестов HTTP-запросов интеграции?

1 Ответ

0 голосов
/ 05 июня 2018

Рецепт примерно такой:

  1. Убедитесь, что бэкэнд запускается в режиме покрытия кода
  2. Запустите тесты
  3. Убедитесь, что покрытие бэкенда записано в файл
  4. Считайте покрытие из файла и добавьте его к покрытию тестового прогона

Пример:

backend

Представьте, что у вас есть фиктивный внутренний сервер, которыйотвечает на страницу «Hello World» на запросы GET:

# backend.py
from http.server import BaseHTTPRequestHandler, HTTPServer


class DummyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/html')
        self.end_headers()
        self.wfile.write('<html><body><h1>Hello World</h1></body></html>'.encode())


if __name__ == '__main__':
    HTTPServer(('127.0.0.1', 8000), DummyHandler).serve_forever()

test

Простой тест, который выполняет HTTP-запрос и проверяет ответ, содержит «Hello World»:

# tests/test_server.py
import requests


def test_GET():
    resp = requests.get('http://127.0.0.1:8000')
    resp.raise_for_status()
    assert 'Hello World' in resp.text

Рецепт

# tests/conftest.py
import os
import signal
import subprocess
import time
import coverage.data
import pytest



@pytest.fixture(autouse=True)
def run_backend(cov):
    # 1.
    env = os.environ.copy()
    env['COVERAGE_FILE'] = '.coverage.backend'
    serverproc = subprocess.Popen(['coverage', 'run', 'backend.py'], env=env,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE,
                                  preexec_fn=os.setsid)
    time.sleep(3)
    yield  # 2.
    # 3.
    serverproc.send_signal(signal.SIGINT)
    time.sleep(1)
    # 4.
    backendcov = coverage.data.CoverageData()
    with open('.coverage.backend') as fp:
        backendcov.read_fileobj(fp)
    cov.data.update(backendcov)

cov - это прибор, предоставляемый pytest-cov ( docs ).

Запуск теста добавляет покрытие backend.py к общему охвату, хотя выбрано только tests:

$ pytest --cov=tests --cov-report term -vs
=============================== test session starts ===============================
platform linux -- Python 3.6.5, pytest-3.4.1, py-1.5.3, pluggy-0.6.0 -- 
/data/gentoo64/usr/bin/python3.6
cachedir: .pytest_cache
rootdir: /data/gentoo64/home/u0_a82/projects/stackoverflow/so-50689940, inifile:
plugins: mock-1.6.3, cov-2.5.1
collected 1 item

tests/test_server.py::test_GET PASSED

----------- coverage: platform linux, python 3.6.5-final-0 -----------
Name                   Stmts   Miss  Cover
------------------------------------------
backend.py                12      0   100%
tests/conftest.py         18      0   100%
tests/test_server.py       5      0   100%
------------------------------------------
TOTAL                     35      0   100%


============================ 1 passed in 5.09 seconds =============================
...