IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Pytest + GitLab CI 单独重跑失败的用例 -> 正文阅读

[开发测试]Pytest + GitLab CI 单独重跑失败的用例

前言

除了失败立即 retry,有时我们也需要在开发修复后单独重跑失败的用例。
介于 pytest 可以手动指定 n 条用例目录,所以实现起来并不难。

举个例子

# 执行类下面所有用例
python testcase/feat_a/test_a.py::CaseClassATest

# 多个目录用空格间隔
python testcase/feat_a/test_a.py::CaseClassATest testcase/feat_b/test_b.py::CaseClassBTest

1. 每次执行用例时,收集失败的用例路径

pytest 用例执行失败后提供了失败用例的路径,格式可以直接使用。
testcase/xxxxxxx/login/user_login_with_phone_test.py::UserLoginWithPhoneTest

conftest.py

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    每条用例运行过程中的特殊处理。执行 n 遍,每遍执行3次,分别是 setup、call、teardown。
    """
    outcome = yield
    report = outcome.get_result()
    # 用例执行阶段失败
    if report.when == "call" and report.failed:
    	''' 
    	省去其他无关代码
        '''

        # 收集失败用例路径
        failed_testcase = '::'.join(report.nodeid.split('::')[:2])
        if 'FAILED_TESTCASES' in os.environ:
        	if failed_testcase not in os.environ['FAILED_TESTCASES']:
            	os.environ['FAILED_TESTCASES'] += ' ' + failed_testcase
        else:
            os.environ['FAILED_TESTCASES'] = failed_testcase

* 这里我用了环境变量来存放,实际上用一个字符串变量来存放也可以。
* 如果要精确到函数需要注意 parametrize 注解会导致路径最后有 [] 参数部分。

2. 将收集的失败用例写入文件

这里我写入的是 output 目录,因为我gitlab ci 使用 artifacts 参数保留了这个目录
也可以放入 cache 目录,用于 ci job 之间的共享(或传递)

conftest.py

@pytest.mark.optionalhook
def pytest_html_report_title(report):
    """
    pytest-html 系列钩子
    """

   	''' 
   	省去其他无关代码
   	'''

    from common.config import Config

    # 失败用例列表存入文件
    if 'FAILED_TESTCASES' in os.environ:
        with open(f'{Config().get_root_dir()}/output/failed-testcases.txt', 'w') as f:
            f.write(os.environ['FAILED_TESTCASES'])

3. GitLab CI 执行失败用例

使用 pytest $(cat output/failed-testcases.txt) 可以动态执行文件中收集的失败测试用例
使用 artifacts 目录来存放 failed-testcaes.txt 的话,重跑 job 必须在 测试 job 后面的阶段。
使用 cache 目录来存放 failed-testcaes.txt 的话,理论上重跑 job 和测试 job 可以在同一阶段。

gitlab-ci.yml

retry-test:
  stage: report
  extends: .with-tags
  artifacts:
    name: '$CI_COMMIT_REF_SLUG'
    paths:
      - output/
    when: on_failure
  script:
    - |
      if [[ -f "output/failed-testcases.txt" ]]; then
        python3 -m poetry run pytest $(cat output/failed-testcases.txt) -s -v --env $RUN_ENVIRONMENT --reruns 1 --reruns-delay 3 --html=./output/report.html --self-contained-html
      fi
  when: on_failure

目前还有一点问题就是,我只能使用 on_failure 来触发 job。这导致 重跑 job 肯定会执行一遍。
理想情况下我希望 前置 job 失败、或者存在 failed-testcases.txt 文件,才出现 job 图标,然后 manual 方式执行。但是经过一番尝试,仍然没有实现。

  • when 参数的 on_faiulre 和 manual 不能共存。并且设置 when manual 后,如果前置 job 失败, 后置 job 就会 skip
  • rules exists 来判断文件存在也没有起效,可能判断触发条件时,测试 job 还未执行所以没有文件。

演示

测试 job 执行失败后,失败用例列表写入 failed-testcases.txt 文件,并存入 artifacts 中
在这里插入图片描述
重跑 job 每次都从 artifacts 目录中读取 failed-testcases.txt 文件中的 失败用例列表来执行
在这里插入图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:59:46  更:2021-08-18 13:01:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:44:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码