视频来源:B站《冒死上传!pytest接口自动化测试框架(基础理论到项目实战及二次开发)教学视频【软件测试】》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:pytest接口自动化测试框架 | 汇总_COCOgsta的博客-CSDN博客


  1. 插件优化案例展示之pytest-html
  1. 为什么哟啊做pytest插件的二次开发pytest是主流自动化框架,因此能够基于这个框架进行开发优化,推广更方便,企业使用成本更低pytest拥有海量的插件可以基于现有的pytest插件进行二次开发,并且插件一般有api文档,提供案例指导进行开发,学习起来非常方便 插件pytest-html API文档 https://pytest-html.readthedocs.io/en/latest/user_guide.html编写自己的Pytest插件
  1. pytest执行测试原理

【conftest、fixture】

conftest也是pytest特有的本地测试配置文件,既可以用来设置项目级的fixture,也可以用来导入外部插件,还可以指定钩子函数。conftest.py文件名称是固定的,pytest会自动设别该文件,只作用在它的目录以及子目录。

通过装饰器@pytest.fixture来告诉pytest某个特定的函数是一个fixture,然后用例可以直接把fixture当参数来调用

【pytest可以通过Hook函数(pytest_runtest_makereport)获取用例执行的结果】

源码:

def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport:return TestReport.from_item_and_call(item, call)

这里的item是测试用例,call是测试步骤,具体执行过程如下:

*先执行when="setup"返回setup的执行结果

*再执行when="call"返回call的执行结果

*最后执行when="teardown"返回teardown的执行结果

钩子函数=HOOK函数=海盗船长的钩子

conftest.py

import pytest"""hook装饰器明天,今天先看他的运行过程
"""@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):print('-------------------------------')# 获取常规的钩子方法的调用结果,返回一个result对象out = yieldprint('用例的执行结果', out)# 获取调用结果的测试报告,返回一个report对象,report对象的属性# 包括when(setup, call, teardown三个值)、nodeid(测试用例的名字)、# outcome(用例执行的结果 passed, failed)report = out.get_result()print('测试报告: %s' % report)print('步骤:%s' % report.when)print('nodeid: %s' % report.nodeid)# 打印函数注释信息print('description: %s' % str(item.function.__doc__))print('运行结果: %s' % report.outcome)

test_case01.py

import pytestdef test_01():""" 用例描述:展昭的用例"""print("用例运行时》》》》》")print("我是展昭")print("用例运行时》》》》》")if __name__ == '__main__':pytest.main(['-s'])

运行结果:

从运行结果可以看出,运行用例的过程会经历三个阶段:setup-call-teardown,每个阶段都会返回result对象和TestReport对象,以及对象属性

通过钩子函数pytest_runtest_makereport可以捕捉到用例执行中的相关数据,这些数据就是我们用来对pytest-html测试报告插件二次开发的基础。

【setup-call-teardown 3个环节失败的影响】

fixture实现项目级的前置后置

scope=session这个fixture这个项目只会启动一次,一般用来做项目级的环境的初始化和清理操作

autouse=True代表自动运行,不需要用例主动去调用

setup失败情况

当setup执行失败了,setup的执行结果failed,后面的call用例不会再执行,teardown还是会执行

此时,用例状态是error,也就是用例call都还没开始执行,就异常了

call失败情况

setup正常执行,但是测试用例call失败了,运行结果是failed

teardown失败情况

setup正常执行,测试用例call正常执行,teardown失败了

运行结果:1 passed,1 error

只取call的结果

如果保证setup和teardown不报错情况,只关注测试用例本身的运行结果,可以加个判断:

if report.when == "call"

conftest.py

import pytest"""hook装饰器明天,今天先看他的运行过程
"""@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):print('-------------------------------')# 获取常规的钩子方法的调用结果,返回一个result对象out = yieldprint('用例的执行结果', out)# 获取调用结果的测试报告,返回一个report对象,report对象的属性# 包括when(setup, call, teardown三个值)、nodeid(测试用例的名字)、# outcome(用例执行的结果 passed, failed)report = out.get_result()# 只关注用例本身结果if report.when == "call":print('测试报告: %s' % report)print('步骤:%s' % report.when)print('nodeid: %s' % report.nodeid)# 打印函数注释信息print('description: %s' % str(item.function.__doc__))print('运行结果: %s' % report.outcome)@pytest.fixture(scope="session", autouse=True)
def fix_a():print("setup 前置操作")# print("setup操作失败")yieldprint("teardown 后置操作 ")# assert 1==2

  1. 如何理解钩子函数(HOOK)

钩子函数:

1)是个函数,在系统消息触发时被系统调用

2)不是用户自己触发的

3)使用时直接编写函数体

4)钩子函数的名称是确定的,当系统消息触发、自动会调用

例如:pytest_runtest_makereport

插件与Hook函数的关系:

插件就是用1个或者多个Hook函数,也就是钩子函数构成的。如果要编写新的插件,或者是改进现有插件,都必须通过hook函数来进行。所以想掌握Pytest插件二次开发,必须搞定Hook函数。

官网API地址:
https://docs.pytest.org/en/latest/reference/reference.html?highlight=hooks#hooks

5.python的yield的用法详解

yield:return + generator的一部分

PS:带yield的函数才是真正的生成器

"""1. 程序开始执行以后,因为test函数中有yield关键字,所以test函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)2. 直到调用next方法,test函数才正式开始执行,先执行test函数中的print方法,然后进入while循环3. 程序遇到yield关键字,然后把yield想成return,return一个8以后,程序停止,并没有执行赋值给a的操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print函数,第二个是return出的结果)4.程序执行print("*********************")5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行的a的赋值操作,这个时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候,a赋值是None,所以接着下面输出的就是a:None6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出8,然后程序停止,print函数输出的8就是这次return出的8"""def tes():print("begin....")while True:a = yield 8print("a:", a)g = tes()
print(next(g))
print("**************************")
print(next(g))

运行结果:

C:\Users\guoliang\AppData\Local\Programs\Python\Python36\python.exe D:/SynologyDrive/SourceCode/pytest/apitest/test_yield/test.py
begin....
8
**************************
a: None
8Process finished with exit code 0

总结:yield和return的关系和区别,带yield的函数是一个生成器,而不是一个函数了。这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数, 这一次的next开始的地方是接着上一次next停止的地方执行的,所以调用next的时候是,生成器,并不会从test函数开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

生成器的send函数

"""1. 程序开始执行以后,因为test函数中有yield关键字,所以test函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)2. 直到调用next方法,test函数才正式开始执行,先执行test函数中的print方法,然后进入while循环3. 程序遇到yield关键字,然后把yield想成return,return一个8以后,程序停止,并没有执行赋值给a的操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print函数,第二个是return出的结果)4.程序执行print("*********************")5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行的a的赋值操作,这个时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候,a赋值是None,所以接着下面输出的就是a:None6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出8,然后程序停止,print函数输出的8就是这次return出的8"""
"""7.程序执行g.send(7),程序会从yield关键字那一行继续往下运行,send会把7这个值赋给变量a8.由于send方法中包含next()方法,所以程序会继续向下运行执行print方法。然后再次进入while循环9.程序执行再次遇到yield关键字,yield会返回后面的值,程序再次暂停,直到再次调用next方法或者send方法
"""def tes():print("begin....")while True:a = yield 8print("a:", a)g = tes()
print(next(g))
print("**************************")
print(g.send(7))

运行结果:

C:\Users\guoliang\AppData\Local\Programs\Python\Python36\python.exe D:/SynologyDrive/SourceCode/pytest/apitest/test_yield/test.py
begin....
8
**************************
a: 7
8Process finished with exit code 0

为什么用yield?

例子:取0,1,2,3,....,1000

节省内存,python3中range也改为了class(迭代器),不是一次性把所有数据都装到内存中

conftest中的yield

pytest接口自动化测试框架 | 为什么要做pytest插件的二次开发相关推荐

  1. pytest接口自动化测试框架 | 汇总

    视频来源:B站<冒死上传!pytest接口自动化测试框架(基础理论到项目实战及二次开发)教学视频[软件测试]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  2. pytest接口自动化测试框架 | 用python代码测试接口

    视频来源:B站<冒死上传!pytest接口自动化测试框架(基础理论到项目实战及二次开发)教学视频[软件测试]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  3. pytest接口自动化测试框架搭建

    文章目录 一. 背景 二. 基础环境 三. 项目结构 四.框架解析 4.1 接口数据文件处理 4.2 封装测试工具类 4.3 测试用例代码编写 4.4 测试用例运行生成报告 一. 背景 Pytest目 ...

  4. 浅谈Python+requests+pytest接口自动化测试框架的搭建

    框架的设计思路 首先要明确进行接口自动化需要的步骤,如下图所示: 然后逐步拆解需要完成的工作: 1)了解分析需求:了解接口要实现的功能 2)数据准备:根据开发文档确定接口的基本情况,知晓接口的url. ...

  5. 接口自动化测试框架:python+requests+pytest+allure实现

    接口自动化测试框架 一.接口自动化测试框架需要解决的问题 二.接口自动化测试框架目录结构 三.日志监控文件的信息 四.搭建具有企业Logo的定制化报告.    今年是以往10年中最坏的一年,是未来10 ...

  6. pytest接口自动化测试框架+项目实例

    python pytest (或许以后加上django) 一.基础框架:测试用例:测试数据:测试报告------------实现逻辑和数据分离,后期可以增加日志.公用配置.封装完善 1.  项目背景: ...

  7. python自动化测试框架开发_Postar 接口自动化测试框架 基于python+requests+pytest实现...

    Postar 接口测试工具,基于python+requests+pytest实现. 特点 Postar makes it easier to interface testing more quickl ...

  8. python+requests+pytest 接口自动化框架(一)

    目录 一.Pytest详解以及常用的插件安装 二.Pytest默认的测试用例的规则 三.Pytest用例运行方式以及参数 1.命令行模式运行 命令:pytes 2.主函数模式运行 3.基于pytest ...

  9. 最全最新pytest接口自动化框架

    pytest接口自动化框架介绍: Python+pytest+allure+log+yaml(默认数据和动态传参)+数据驱动+关键字驱动+pymysql(数据清理尽量接口清理)+一键切换环境+多角色随 ...

  10. Python+unittest+requests 接口自动化测试框架搭建 完整的框架搭建过程 实战

    一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm ...

最新文章

  1. chrdev字符设备几种注册方式的差异
  2. 如何在无人机上部署YOLOv4
  3. PostgreSQL 8.3 以上的中文全文索引使用介绍
  4. 一个关于php使用pdo方式进行数据库连接和处理的类
  5. Windows系统USB转CDC串口驱动限制说明
  6. Django应用部署 - 上线指南
  7. Django常用命令
  8. vmware workstation 12安装ubuntu kylin 16.04虚拟机
  9. 随机数练习1,和电脑比roll点
  10. biopython中文指南_Biopython学习笔记
  11. Inverting Generative Adversarial Renderer for Face Reconstruction
  12. 留学生的英文期刊论文怎么写?
  13. COM ---- Inside COM Note
  14. css3图片放大溢出,用canvas调整图像大小 - css溢出问题
  15. 图片二维码,如何将图片制作成二维码
  16. 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)
  17. java设计模式总结之六大设计原则(有图有例子)
  18. 管出来的老公嘴服,疼出来的老公心服
  19. mac win7 计算机,苹果电脑win7单系统更换OS X系统
  20. Power BI 通过Treatas函数自由切换坐标轴

热门文章

  1. discuz template 模板文件说明
  2. 什么是全文搜索引擎?
  3. 中国的比尔·盖茨-不得不令我佩服了
  4. U3D Shader
  5. springboot微服务使用Feign远程调用失败
  6. java图片缩放工具类_JAVA操作图片裁切与缩放的一个工具类(个人收藏)
  7. Centos7重置密码后采用密钥登陆
  8. 微博上面好看的跳舞美女蛮多的,【Python爬虫】采集微博视频数据(附代完整代码)
  9. [技术解读]英伟达NVIDIA的3D-VISION和AMD-HD3D主动快门立体方案
  10. Ring3与Ring0的通信