收下吧,学习一周就成功拿下15koffer的接口自动化测试框架教程pytest-yield与终结函数

本文主要是介绍收下吧,学习一周就成功拿下15koffer的接口自动化测试框架教程pytest-yield与终结函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

我们已经学会了fixture函数的简单用法,但其实fixture还提供了两种非常优雅高效的写法,来完成测试执行前的处理操作与执行后的处理操作,即使用yieldaddfinalizer来实现。

yield

在fixture中的关键字yield主要有两个作用:

  • yield代替return进行参数的传递
  • 起到代码的分割作用,yield之前的代码为setup的作用,yield之后的代码为teardown的作用
yield 与 return

在 pytest 的fixture函数中可以使用yield代替return进行返回,示例如下:

import pytest@pytest.fixture(autouse=True)
def fixture_one():print("执行fixture_one")yield 1def test_e(fixture_one):print("执行test_e")print(fixture_one)assert fixture_one == 1if __name__ == '__main__':pytest.main(["-s"])

运行结果如下:

test_case_4.py::test_e 
执行fixture_one
PASSED                                            [100%]执行test_e
1============================== 1 passed in 0.12s ==============================

从运行结果我们能看到fixture_one会返回1并传递给test_e,与return的作用完全一致。但如果仅仅只是这样使用的话,毫无意义,因为使用return足够了。所以,在实际的使用过程中我们一般会在yield后面加上teardown的代码。

yield 与 teardown

yield不进行参数传递

对于不需要在前置操作中返回数据的 fixture 函数,加入yield,那么yield之前的代码为用例执行之前的操作(即setup),yield之后的代码为用例执行之后的操作(即teardown)。示例如下:

import pytest@pytest.fixture()
def fixture_demo():# setupprint("\n连接数据库")yield# teardownprint("清空脏数据")def test_case(fixture_demo):print("执行test_case")assert Trueif __name__ == '__main__':pytest.main(["-s"])

运行结果如下:

从结果中我们可以看出来,先执行了setup部分,再执行测试用例,最后执行teardown部分。

yield进行参数传递

yield可以将参数传递给测试用例。

假设有这样一个场景,需要用到接口1的返回参数作为接口2的请求参数,即接口2依赖接口1,我们需要写一条测试用例对接口2进行测试,这个时候可以将接口1的请求写在前置中,如果是unittest框架则代码如下:

import unittest
import requestsclass TestDemo(unittest.TestCase):def setup(self):print("请求接口1")self.res_1 = requests.get(url=url_1, params=params_1)def test_api_2(self):print("验证接口2")# 将接口1的返回值self.res_1作为请求参数,请求接口2res = requests.post(url=url_2, data=self.res_1)# 断言self.assertEqual(res, "接口2预期的返回结果")def teardown(self):print("清空脏数据")

pytest框架中使用fixture+yield则可编写如下:

@pytest.fixture()
def get_api_1_result():# setupres_1 = requests.get(url=url_1, params=params_1)yield res_1# teardownprint("清空脏数据")def test_api_2(get_api_1_result):print("验证接口2")# 将接口1的返回值res_1作为请求参数,请求接口2res = requests.post(url=url_2, data=get_api_1_result)# 断言assert res == "接口2预期的返回结果"

其中,fixture 会先通过yield返回res_1,并传入测试用例test_api_2中,test_api_2运行完成后再去执行yield后面的代码,即执行print("清空脏数据")

通过以上对比unittestsetupteardown以及参数的传递,我们就能很直观的看出pytestyield的使用方式,此处代码仅为示例。

yield 的执行顺序

有时候我们会遇到一个fixture函数调用另一个或多个fixture函数,且这些函数中可能含有yield,我们先看示例,代码如下:

import pytest@pytest.fixture
def fixture_1():print("\n执行fixture_1")yield 1print("\n执行fixture_1的teardown代码")@pytest.fixture
def fixture_2(fixture_1):print("\n执行fixture_2")yield 2print("\n执行fixture_2的teardown代码")@pytest.fixture
def fixture_add(fixture_1, fixture_2):print("\n执行fixture_add")result = fixture_1 + fixture_2yield resultprint("\n执行fixture_add的teardown代码")def test_demo(fixture_add):print("\n执行测试函数test_demo")assert fixture_add == 3if __name__ == '__main__':pytest.main(["-s"])

运行结果如下:

rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 1 itemtest_case_4.py::test_demo 
执行fixture_1执行fixture_2执行fixture_add
PASSED                                         [100%]
执行测试函数test_demo执行fixture_add的teardown代码执行fixture_2的teardown代码执行fixture_1的teardown代码============================== 1 passed in 0.12s ==============================

从结果可以看出:

test_demo 测试函数执行之前:先执行了 fixture_1,再执行fixture_2,最后执行fixture_add,注意此时都是执行yield之前的的代码;

test_demo 测试函数执行之后:先执行了 fixture_add,再执行fixture_2,最后执行fixture_1,注意此时都是执行yield之后的的代码。

因此,当一个fixture函数调用另一个或多个fixture函数,且fixture函数中含有yield时,被测试函数调用时有如下执行顺序:

  • 测试函数执行之前,pytest会根据fixture函数之间的线性关系顺序调用,即依次执行yield之前的代码

  • 而测试函数执行结束后,pytest会根据之前的顺序反方向执行fixture函数中yield之后的代码

finalizer

finalizer即终结器 (终结函数),与unittest中的teardown作用一样,测试用例执行完成后再执行终结器代码。

在pytest中,fixture除了使用 yield 进行 teardown 之外,还可以使用request.addfinalizer()定义finalizer来进行后置操作。

使用addfinalizer,需要在定义 fixture 函数时传入request,并以内嵌函数的形式进行定义。终结函数可以定义一个或多个。

定义单个终结函数

示例如下:

import pytest@pytest.fixture
def fixture_demo(request):print("\nsetup:每个case开始前执行一次")# 定义终结函数def finalizer_demo():print("\nteardown:每个case完成后执行一次")# 将finalizer_demo注册为终结函数request.addfinalizer(finalizer_demo)def test_2(fixture_demo):print("\n执行test_2")def test_1(fixture_demo):print("\n执行test_1")if __name__ == '__main__':pytest.main()

运行结果如下:

rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 2 itemstest_module_02\test_case_3.py::test_2 
setup:每个case开始前执行一次
PASSED                             [ 50%]
执行test_2teardown:每个case完成后执行一次test_module_02\test_case_3.py::test_1 
setup:每个case开始前执行一次
PASSED                             [100%]
执行test_1teardown:每个case完成后执行一次============================== 2 passed in 0.03s ==============================

从结果可以看出来,在测试用例执行完后会执行addfinalizer函数,效果与执行yield后的代码一致。

定义多个终结函数

示例如下:

import pytest@pytest.fixture
def fixture_demo(request):print("\nsetup:每个case开始前执行一次")# 定义终结函数def finalizer_demo_1():print("\nteardown1:每个case完成后执行一次")def finalizer_demo_2():print("\nteardown2:每个case完成后执行一次")# 注册为终结函数request.addfinalizer(finalizer_demo_1)request.addfinalizer(finalizer_demo_2)def test_2(fixture_demo):print("\n执行test_2")def test_1(fixture_demo):print("\n执行test_1")if __name__ == '__main__':pytest.main()

运行结果如下:

rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 2 itemstest_module_02\test_case_3.py::test_2 
setup:每个case开始前执行一次
PASSED                             [ 50%]
执行test_2teardown2:每个case完成后执行一次teardown1:每个case完成后执行一次test_module_02\test_case_3.py::test_1 
setup:每个case开始前执行一次
PASSED                             [100%]
执行test_1teardown2:每个case完成后执行一次teardown1:每个case完成后执行一次============================== 2 passed in 0.02s ==============================

从结果可以看出,上面示例中测试函数执行完成后,先执行了finalizer_demo_2,后执行finalizer_demo_1

所以, 当有多个终结函数被执行时,执行顺序与注册顺序是相反的

总结

实际项目中,可以视情况进行选择,但一般情况下,推荐使用yield,因为这样代码更加简洁高效,且阅读性更强更容易维护。

 自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

这篇关于收下吧,学习一周就成功拿下15koffer的接口自动化测试框架教程pytest-yield与终结函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464570

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模