首页 > 编程问答 >Pytest:测试运行后如何显示生成的报告?

Pytest:测试运行后如何显示生成的报告?

时间:2024-07-26 15:31:54浏览次数:11  
标签:python report pytest pytest-html

我将 pytest 与 pytest-html 插件结合使用,该插件在测试运行后生成 HTML 报告。

我使用自动连接的会话固定装置自动打开生成的 HTML 报告浏览器:

@pytest.fixture(scope="session", autouse=True)
def session_wrapper(request):
    print('Session wrapper init...')
    yield

    # open report in browser on Mac or Windows, skip headless boxes
    if platform.system() in ['Darwin', 'Windows']:
        html_report_path = os.path.join(request.config.invocation_dir.strpath, request.config.option.htmlpath)
        open_url_in_browser("file://%s" %html_report_path)

上面的代码可以工作,但不一致,因为有时浏览器会在创建文件之前尝试加载文件,这会导致文件未找到错误,并且需要手动刷新浏览器才能显示报告.

我的理解是 scope="session" 是最广泛的可用范围,我的假设是 pytest-html 应该在会话结束之前完成生成报告,但显然情况并非如此。

问题是:挂钩浏览器报告自动启动代码的正确方法是什么?难道 pytest-html 也挂接到会话终结器作用域中?在这种情况下,如何确保 HTML 文件仅在创建文件后才在浏览器中打开?


你对 pytest-html 的行为的理解是正确的。它确实挂接到会话范围,但是报告生成在会话结束时异步发生。这就是为什么你的浏览器试图在报告准备就绪之前加载它的原因。

你可以通过以下几种方式解决此问题:

1. 使用 pytest-html on_report_generation 挂钩:

pytest-html 插件提供了一个 on_report_generation 挂钩,它在报告生成 之后 被调用。你可以在你的 conftest.py 文件中使用这个挂钩来可靠地打开报告:

```python from pytest_html import plugin as html_plugin

@html_plugin.on_report_generation def on_report_generation(report, config): if platform.system() in ['Darwin', 'Windows']: html_report_path = os.path.join(config.invocation_dir.strpath, config.option.htmlpath) open_url_in_browser("file://%s" % html_report_path) ```

这个方法确保浏览器仅在报告完全生成后才会尝试打开它。

2. 使用 time.sleep 引入延迟(不推荐):

虽然这不是最优雅的解决方案,但你可以添加一个小的延迟来为报告生成提供时间,然后再尝试打开它:

```python import time

@pytest.fixture(scope="session", autouse=True) def session_wrapper(request): # ... 你的现有代码 ...

   # 在尝试打开之前,短暂等待报告生成
   if platform.system() in ['Darwin', 'Windows']:
       time.sleep(5)  # 等待 5 秒
       html_report_path = os.path.join(request.config.invocation_dir.strpath, request.config.option.htmlpath)
       open_url_in_browser("file://%s" % html_report_path)

```

这个方法有效,但不准确,并可能导致不必要的延迟。

3. 使用独立的进程打开报告:

你可以使用 subprocess 模块在一个单独的进程中打开报告。这确保在尝试打开浏览器之前你的测试会话完全关闭:

```python import subprocess

@pytest.fixture(scope="session", autouse=True) def session_wrapper(request): # ... 你的现有代码 ...

   if platform.system() in ['Darwin', 'Windows']:
       html_report_path = os.path.join(request.config.invocation_dir.strpath, request.config.option.htmlpath)
       subprocess.Popen(["open", html_report_path])  # 在 macOS 上使用 "open",在 Windows 上使用 "start"

```

此方法避免了计时问题,并确保报告在浏览器中正确打开。

我建议使用 on_report_generation 挂钩(选项 1) 来获得最可靠和最优雅的解决方案。它保证浏览器仅在报告准备好后才会打开,并且不会引入不必要的延迟或进程管理开销。

标签:python,report,pytest,pytest-html
From: 52032885

相关文章

  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
    1.简介在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。2.上传文件的API(input控件)Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员和......
  • python requests 报错 Caused by ProxyError ('Unable to connect to proxy', OSError
    背景:访问https接口,使用http代理版本:requests:2.31.0 从报错可以看出,是proxy相关的报错调整代码,设定不使用代理,将http与https对应的proxy值置空即可(尝试过proxies={},但此写法不生效)proxies={'http':'','https':''}response = requests.get('https://xxx......
  • python基础函数
    1.为什么使用函数使用函数的目的是去减少代码的冗余性,简化代码的复杂度2.如何去定义一个函数以def开头去进行相关的定义在def的后面我们就去以见明知意的方式去定义一个函数的名称在函数名称后面的括号中去添加参数值,可以是多个参数,也可以是无餐的3.函数的调用无参多......
  • 不使用 + 或 - 运算符 | 添加 2 个数字Python
    我一直在尝试编写逻辑,但测试用例失败。如何改进我的代码?代码:#Giventwointegersaandb,returnthesumofthetwointegerswithoutusingtheoperators+and-.a=-1b=1min_val=min(a,b)max_val=max(a,b)ifmin_val==max_val:pr......
  • python 中的智能 Cisco IOS 差异
    之前:hostnameFoo!interfaceGigabitEthernet1/1switchportmodetrunkswitchporttrunkallowedvlan10,20,30!interfaceGigabitEthernet1/2ipaddress192.0.2.1255.255.255.128noipproxy-arp!之后:hostnameFoo!interfaceGigabitEt......
  • 无法编译 Arduino ESP32 代码:.../python3: exec 格式错误
    昨天我使用MacOSArduinoIDE或VSCode编译Arduino草图没有任何问题。但今天什么也编译不了。我尝试在ArduinoIDE或带有Arduino扩展的VSCode中编译的任何草图都会出现此错误:fork/exec/Library/Frameworks/Python.framework/Versions/3.11/bin/python3:exec......
  • 用Python解析邮件日志
    我的任务有点困难。我有一个邮件日志,如:Oct315:30:18mail1postfix/lmtp[5369]:DB10242054:to=<XXXXX>,orig_to=<XXXXXX>,relay=ip[ip]:port,delay=1.4,delays=0.04/0/0.01/1.4,dsn=2.0.0,status=sent(2502.0.0fromMTA(smtp:[iP]:port):2502.0.0Ok:queueda......
  • Python,Pyinstaller打包含taichi模块的程序
    Python版本3.9、taichi版本1.7.1,pyinstaller版本6.9.0问题描述:正常Pyinstaller打包后报错[Taichi]version1.7.1,llvm15.0.1,commit0f143b2f,win,python3.9.19[Taichi]Startingonarch=x64Traceback(mostrecentcalllast):File"taichi\lang\_wrap_inspec......
  • Python,运行Yolo项目,报错AttributeError: ‘ImageDraw‘ object has no attribute ‘te
    Python3.9问题描述:其他电脑已经运行成功的Python,YOLO代码到我电脑上运行报错Traceback(mostrecentcalllast): File"C:\Users\Administrator\Desktop\20240725\识别项目\predict.py",line122,in<module>  frame=np.array(yolo.detect_image(frame)) Fil......
  • Python从零开始制做文字游戏(荒岛求生)
    文章目录前言开发游戏《荒岛求生》游戏大纲背景内容通关条件游戏过程探索荒岛购买物资休息总结代码开发定义变量当前代码引入背景故事当前代码循环问题解决:函数当前代码制作延时当前代码制作a函数(探索荒岛阶段)展示数......