如何为基于http的集成测试生成覆盖率报告?

Ami*_*thi 6 python unit-testing coverage.py pytest

我正在为进行HTTP调用的项目编写集成测试,并测试它们是否成功。

由于我没有导入任何模块,也没有直接调用函数,所以为此报告为0%。

我想知道如何为此类集成HTTP请求测试生成覆盖率报告?

hoe*_*ing 7

食谱差不多是这样的:

  1. 确保后端以代码覆盖模式启动
  2. 运行测试
  3. 确保后端覆盖范围已写入文件
  4. 从文件中读取覆盖率并将其附加到测试运行覆盖率

例:

后端

假设您有一个虚拟的后端服务器,该服务器在GET请求上响应一个“ Hello World”页面:

# 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()
Run Code Online (Sandbox Code Playgroud)

测试

发出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
Run Code Online (Sandbox Code Playgroud)

食谱

# 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)
Run Code Online (Sandbox Code Playgroud)

covpytest-covdocs)提供的装置。

运行测试会将的覆盖率添加backend.py到总体覆盖率中,尽管仅tests选择了以下选项:

# 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()
Run Code Online (Sandbox Code Playgroud)