首页 > 其他分享 >pytest---通过hooks获取用例执行结果(pytest_runtest_makereport )

pytest---通过hooks获取用例执行结果(pytest_runtest_makereport )

时间:2023-11-20 14:57:05浏览次数:37  
标签:用例 hooks format runtest print pytest report 执行

前言

测试用例在执行完成后,想要获取测试用例的执行结果,可以通过hooks(钩子函数)来进行获取,其中pytest中就存在多个hooks的函数供我们使用,或者进行二次开发,从而完成我们想要的功能

pytest_runtest_makereport

pytest_runtest_makereport 是pytest中提供的方法,我们可以通过获取用例的执行结果,我们先在conftest.py文件中进行写入该方法的,然后进行二次开发,先看下pytest_runtest_makereport 这个方法中存在哪些内容

# coding:utf-8
import pytest

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 获取钩子方法的调用结果
    out = yield
    report = out.get_result()
    print(report.__dict__)

通过执行测试用例后会发现

 

 

从上图执行结果中可以发现,可以很清楚的看到获取三次执行结果,其中分别是"setup", "call", "teardown",安静这里可以理解成,分别是执行用例前,执行测试用例,执行测试用例后

实例展示

我们通过实际案例看下,将上面的需要参数结果打印出来

# conftest.py 文件

# coding:utf-8
import pytest
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 获取钩子方法的调用结果
    out = yield
    # 获取执行结果内容
    report = out.get_result()
    print('测试报告:{}' .format(report))
    print('当前执行步骤:{}' .format(report.when))
    print('当前执行测试用例:{}' .format(report.nodeid))
    print('当前用例描述:{}' .format(report.nodeid))
    print('当前执行结果:{}' .format(report.outcome))
    print('当前报错信息:{}' .format(report.longrepr))
    print('执行时间:{}' .format(report.duration))

创建一个测试用例test01.py

# test01.py

# coding:utf-8

def test():
    '''用例描述'''
    print('测试用例1')

通过cmd进行执行pytest -s test01.py

 

可以通过上面的执行结果看到,我们的前置,用例,后置都是执行成功的,那么我们加上setup和teardown来看看执行结果如何

# test01.py
# coding:utf-8

def setup():
    print('测试执行开始')

def teardown():
    print('测试执行结束')

def test():
    '''用例描述'''
    print('测试用例1')

再次通过cmd进行执行

通过上图可以看出来,没有任何的变化,因为这里都是执行成功的

setup出现错误

上面介绍的都是setup和teardown都正确的是,这里我们将setup出现错误

# 前置代码出现错误
def setup():
    assert 1 == 0

 

可以通过上图看到,当我们的前置执行错误后,执行完测试用例后,后置内容就不在进行执行

teardown出现错误

当teardown出现错误,我们看看如何执行的

def teardown():
    assert 1 == 0

当teardown出现错误时,代码会全部执行完成

call(用例)执行错误

通过断言的情况下,将call(测试用例)执行出现错误

# test01.py
# coding:utf-8

def setup():
    print('测试执行开始')

def teardown():
    print('测试执行结束')

def test():
    '''用例描述'''
    print('测试用例1')
    assert  1 == 0

可以看到前置和用例后置都出现了错误,并将错误信息全部都打印出来了。

用例报错信息存储到log

通过上面的思路,我们可以将用例的执行报错信息,全部都获取到log中,方面后续查看,这里安静通过将报错信息存储在txt文件中,道理都是一样的

# coding:utf-8

import pytest
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 获取钩子方法的调用结果
    out = yield
    # 获取执行结果内容
    report = out.get_result()
    if report.when == 'call':   # 只获取用例的执行情况
        print('测试报告:{}' .format(report))
        print('当前执行步骤:{}' .format(report.when))
        print('当前执行测试用例:{}' .format(report.nodeid))
        print('当前用例描述:{}' .format(report.nodeid))
        print('当前执行结果:{}' .format(report.outcome))
        print('当前报错信息:{}' .format(report.longrepr))
        print('当前报错异常信息:{}' .format(call.excinfo))
        print('执行时间:{}' .format(report.duration))
        with open('error.txt', 'a+') as f:   # 将报错信息存储在log文件中
            f.write(report.nodeid)
            for i in str(report.longrepr):
                f.write(i)

这里通过运行cmd执行测试用例,执行完成后,我们看到当前目录下生成了一个error的文件,文件信息也是我们的报错信息

笔记

目前安静收集到pytest_runtest_makereport钩子函数中常用到的几个方法:

首先通过yield方法获取到执行结果测试报告

report = yield(返回值).get_result()

当前执行步骤:report.when

当前执行测试用例:report.nodeid

当前用例描述:report.nodeid

当前执行结果:report.outcome

当前报错信息:report.longrepr

当前报错异常信息:call.excinfo

执行时间:report.duration

 

标签:用例,hooks,format,runtest,print,pytest,report,执行
From: https://www.cnblogs.com/qican/p/17102802.html

相关文章

  • pytest日志配置
    pytest默认输出日志如下: 为了让日志看起来更加舒服,我们可以在pytest.ini文件中增加如下配置#是否开启日志true/falselog_cli=true#过滤日式级别log_cli_level=info#输出信息log_cli_format=%(asctime)s[%(levelname)s]%(message)s(%(filename)s:%(lineno)s......
  • 解决执行pytest -vs test.py报错问题
    报错如下:解决方案:在终端中执行python-mpytest+后面你想运行的命令,如下:python-mpytesttest.py......
  • 软件测试|详解 Pytest 参数化:简化测试用例的编写
    简介Pytest是一个广泛使用的Python测试框架,它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化,它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例,从而减少冗余的代码。本文将详细介绍Pytest的参数化功能以及如何使用它来简化测试用例的编写。......
  • 软件测试|Windows系统配置pytest+allure环境教程
    前言allure可以输出非常精美的测试报告,也可以和pytest进行完美结合,不仅可以渲染页面,还可以控制用例的执行。本文我们将介绍Windows系统中如何配置allure环境。第一步:配置Java环境因为allure的运行依赖于Java环境,所以我们需要先配置好Java环境,allure需要的Java环境为:JDK1.8+,配置......
  • Python+PlayWright+ Pytest + Allure 自动化学习路线
    前言对于自己写过文章的总结,并不代表最好的学习路线还未完结,努力更新中ing建议把每节的实战演练做一下 PlayWrightPlayWright-环境安装PlayWright-如何使用playwrighPlayWrigh-同步和异步运行PlayWright-深入异步PlayWright-元素定位PlayWright-文本输......
  • Python+PlayWright+ Pytest + Allure 自动化学习路线
    前言对于自己写过文章的总结,并不代表最好的学习路线还未完结,努力更新中ing建议把每节的实战演练做一下 PlayWrightPlayWright-环境安装PlayWright-如何使用playwrighPlayWrigh-同步和异步运行PlayWright-深入异步PlayWright-元素定位PlayWright-文本输......
  • Pytest框架使用教程
    Pytest框架使用教程Pytest介绍Pytest是一个基于python的测试框架,用于编写和执行测试代码。Pytest的优点:pytest可以并行运行多个测试,从而减少测试套件的执行时间。如果没有明确提及,Pytest有自己的方法来自动检测测试文件和测试函数。Pytest允许我们在执行期间跳过测试......
  • pytest使用allure生成测试报告
    安装:pipinstallallure-pytest使用:修改pytest的ini文件:指定allure报告文件和生成的测试文件目录:在命令行中:alluregeneratereport/result--clean-oreport/html--clean是覆盖,如果这个目录已存在,就会覆盖,-o是指定生成的目录位置在使用时,导入allure,然后给测试用例加上......
  • 【python自动化】pytest系列(中)
    书接上文:【python自动化】pytest系列(上)本篇为中篇,后面还有两篇,从本篇开始,知识点会增加,难度会一丢丢的一次递增。本章知识点文章目录1、上节内容知识点回顾2、Pytest的前置后置操作3、断言assert4、运行和报告命令行执行相关插件allure报告安装pytest-allure如何使用通过allure命令......
  • 2023码尚教育接口自动化框架的实现源码分享pytest+allure+jenkins几乎零代码少量的代
    本框架适合对Pytest有大概认识(比如看完X站3天课程的水平),职场新人没有雄厚的资本去参加专业的培训、功能测试转自动化测试、开发转测试的小伙伴们。首先介绍下这个框架的使用,看看是不是你所需要的。第一步、添加模块PY文件,编写接口代码。classTestJuhe: #upwei:fanfanzb2023......