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

2024-01-05

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

由于我没有导入任何模块,也没有直接调用函数,coverage.py 报告的覆盖率是 0%。

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


食谱大致是这样的:

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

Example:

backend

假设您有一个虚拟后端服务器,它在 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()

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

Recipe

# 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 https://pytest-cov.readthedocs.io/en/latest/markers-fixtures.html#cov).

运行测试增加了覆盖范围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 =============================
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何在seaborn python中合并两个relplot?

    我想使用 sns relplot 在单个图中绘制数据帧的两个数据列 数据框如下所示 index x axis col1 col2 group group2 0 0 27 26 A C 1 1 45 27 B D 2 2 48 22 A C
  • 如何从派生类获取基类实例

    我不知道这是否可能 但我正在尝试从派生类获取基类实例 在 C 中 我可以使用base关键字来访问基类的属性和方法 当然 但我想使用base本身 尝试这样做会导致 在此上下文中使用关键字 base 无效 error 示例代码 public c
  • 当浏览器选项卡关闭时销毁会话

    我有用户登录 注销应用程序 我想销毁会话 当我关闭浏览器 所有选项卡 时它工作正常 IE Firefox 工作 但我想在用户关闭单个选项卡时销毁会话 我在用 session set cookie params 0 session start
  • Web Api GET 方法可能具有可为 null 的 Guid 吗?

    我有一个 MVC Web API get 方法 我希望能够将可为空的 Guid 作为参数传递 如果我使用 Id null 设置 GET 我会收到 400 响应 我可以传递一个空的指南 但我宁愿不这样做 无论我将 URI 更改为 id id
  • 测试应用内购买是否需要有效的付费应用程序合同?

    我正在关注一个应用内购买教程 http www raywenderlich com 21081 introduction to in app purchases in ios 6 tutorial它还展示了如何使用沙箱环境 http dev
  • 无法找到或加载程序集“tmpAssembly,

    我正在尝试使用动态生成的类型作为名为 codeeffects www codeeffects com 的业务规则编辑器的源 但是我收到此异常 Could not find or load assembly tmpAssembly Versi
  • IIS 管理器错误数据。 0x80090005

    当我尝试在 高级设置 中设置物理路径凭据时 收到如下错误消息 Internet 信息服务 IIS 管理器 坏数据 HRESULT 异常 0x80090005 它阻止我设置特定用户来访问网络共享文件夹 奇怪的是 我有另一台具有相同配置的服务器
  • APE 和 Node.js 之间的主要区别是什么?

    有谁用过的可以分享一下经验吗 主要区别是什么 您更喜欢哪一个 谢谢 socket io 与 APE 的不同之处 socket io 是用 javascript node js 编码的 而 APE 是用 C 编码的 我相信当你想做出贡献时 这
  • 根据属性将 JavaScript 中的对象数组拆分为单独的数组

    我有一个像这样的数组 var flightPlanCoordinates lat 37 772 lng 122 214 status walking lat 36 772 lng 123 214 status walking lat 21
  • 禁用“您所做的更改可能无法保存”弹出窗口

    我使用以下前端代码导出 csv文档 HTML
  • 在 Vim 中同时保存并运行

    我做了很多 Python 快速模拟工作 并且不断保存 w 然后运行 有没有办法将这些动作结合起来 也许是 保存并运行 命令 好的 您正在寻找的最简单形式是管道命令 它允许您在同一行上运行多个 cmdline 命令 在您的情况下 这两个命令是
  • PowerShell:从文本文件读取行,构造源文件名和目标文件名,然后复制文件

    I m a 电源外壳 http en wikipedia org wiki Windows PowerShell新手 我很想能够编写这个脚本 我有一个文本文件 其中每一行都是文件名的一部分 没有路径或扩展名 我想要一个单行循环遍历文件的每一
  • 将字符串添加到 ArrayList [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要确保我正在正确构建这个程序 我
  • Python 抽象类 - 如何阻止实例化?

    我有 C 背景 该语言具有一些内置的 保护开发人员 功能 我知道 Python 采用 我们都是成年人 的方法 并让开发人员有责任深思熟虑 仔细编码 也就是说 Python 建议采用约定 例如私有实例变量的前导下划线 我的问题是 除了在文档字
  • Oracle 二进制数据类型

    有没有一种类型或方法如何在oracle中以二进制级别存储数据 我对 dml at table 和 pl sql 的操作都感兴趣 目前所有二进制元素都存储为 varchar2 1000 11111 0000 1111 但操作和数据存储大小相当
  • 创建 MySQL 存储过程来更新记录

    我正在转换所有现有的 MSSQL 数据库 并且存储过程被困在一个新的存储过程中 我需要在其中更新现有记录 一旦记录插入数据库并成功发送电子邮件 或至少传递到 SMTP 服务器 就会从 Web 表单调用该过程 我在 MSSQL 中有一个工作程
  • 如何编译c程序使其不依赖任何库?

    看来即使是一个 hello world 程序也依赖于几个库 libc so 6 gt lib64 libc so 6 0x00000034f4000000 lib64 ld linux x86 64 so 2 0x00000034f3c00
  • 我可以在 PHP 中使用字符串连接来定义类 CONST 吗?

    我知道您可以使用字符串连接来创建彼此的全局常量 define FOO foo define BAR FOO bar echo BAR 将打印 foobar 但是 我在尝试使用类常量执行相同操作时遇到错误 class foobar const
  • Selenium FindElement 会阻塞,直到文件上传完成

    短篇 当我使用 SendKeys path 触发文件上传到代理元素 由 ExecuteScript 放置 然后通过 jquery fileupload 插件代理到我的隐藏元素时 文件上传正常 但是当我尝试发出FindElement 它会阻塞
  • 如何为基于http的集成测试生成覆盖率报告?

    我正在为一个项目编写集成测试 在该项目中我进行 HTTP 调用并测试它们是否成功 由于我没有导入任何模块 也没有直接调用函数 coverage py 报告的覆盖率是 0 我想知道如何为此类集成 HTTP 请求测试生成覆盖率报告 食谱大致是这