进阶高级测试专项,Pytest自动化测试框架总结(三)

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

1、pytest前置条件+后置条件的两种写法

使用yield关键字来是实现:
推荐使用这种,因为yield关键字能返回函数的值

import pytest
@pytest.fixture()
def befor_func():print('xxxxxxxxxxxxx测试用例的初始化xxxxxxxxxxxxxxxx')yield 10                            #yield后面跟的是测试用例的后置条件,支持用例执行后就执行yield里的内容print('zzzzzzzzzzzzzzzzzz测试用例的清除zzzzzzzzzzzzzz')def test_001(befor_func):print("测试用例001")res=befor_funcprint(res)if __name__ == '__main__':pytest.main(["test1.py",'-s'])

使用finc()函数来实现:
这种就不能返回返回值了

import pytest
@pytest.fixture()
def befor_func(request):print('xxxxxxxxxxxxx测试用例的初始化xxxxxxxxxxxxxxxx')def fin():                        #尾部这是后置条件,测试用例执行后就会调用这个函数      print('zzzzzzzzzzzz测试用例的清除zzzzzzzzzzz')request.addfinalizer(fin)               #回调,当我整个包运行完了后回调fin这个方法          
def test_001(befor_func):print("测试用例001")if __name__ == '__main__':pytest.main(["test1.py",'-s'])

2、pytest数据驱动(参数化)

pytest数据驱动的意义:
参数化(登录用例4条,每一个账号密码都不同,使用框架把4个用例全部执行完,不需要for循环遍历执行,采用数据驱动方案来做)

pytest内置装饰器@pytest.mark.parametrize可以让测试数据参数化,把测试数据单独管理,类似ddt数据驱动的作用,方便代码和测试数据分离

@pytest.mark.parametrize("a",[1,2,3]):        # 参数化传一组参数  @pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])    #  参数化传多组参数

登录账户密码(name和psw不同的用例组合,一个接口几十个用例怎么做----几十组数据----传的参数不同(什么请求方式和各种都一样)

可以把name和psw分别采取多组数据进行参数化,数据分离,一个接口跑4次,每次用不同的参数)

import pytest#[(1,2),(3,4),(5,6)]   [1,2,3]class Test_login():  def setup_class(self):print("执行测试类之前,我需要执行操作")@pytest.mark.parametrize("a",[1,2,3])            #("变量名",[1,2,3]),数据需要封装成一个列表,多个数据需要封装成列表嵌套元组   ----数据驱动def test_login01(self,a):                  #数据驱动,一定要把变量名a引入引来,不然无法参数化print("---test_login01----")assert 1 + 1 == a@pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])    #数据驱动传多组参数def test_login02(self,a,b):print("---test_login02----")assert a + 1 == bdef teardown_class(self):print("------该测试类的环境清除-----")if __name__ == '__main__':pytest.main(["test_func01.py","-s"])

3、pytest结合allure报告操作

pytest自带的报告框架 pytest-html;
allure环境搭建(allure是报告库不是python专属的,很全面的框架)-allure报告漂亮;

下载allure.zip(压缩包);
解压allure.zip到一个文件目录;
将allure-2.13.3\bin路径添加到环境变量path;
pip install allure-pytest -------allure报告本身不是很漂亮,通过allure-pytest这个库可以定制化报告,让报告变得很漂亮;
验证(cmd输入allure);

allure和pytest联合执行生成报告:运行两条语句

执行pytest单元测试,生成的allure报告需要的数据存在/tmp目录

pytest -sq --alluredir=../report/tmp   #pytest把allure报告的生成的中间文件放到一个临时文件里面(pytets生成报告,需要数据,所以先把数据存起来)

所有的报告需要数据支持的,数据来源pytest框架本身,结果数据存到一个文件,存在…/report/tmp文件夹;
tmp临时文件,一般json格式;

执行命令,生成测试报告

allure generate ../report/tmp -o ../report/report -clean     #allure指令生成对应报告

allure模拟代码

import pytest
import os
class Test_login():  def setup_class(self):print("执行测试类之前,我需要执行操作")@pytest.mark.parametrize("a",[1,2,3])def test_login01(self,a):  print("---test_login01----")assert 1 + 1 == a@pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])def test_login02(self,a,b):print("---test_login02----")assert a + 1 == bdef teardown_class(self):print("------该测试类的环境清除-----")if __name__ == '__main__':#需要打印对应的信息,需要在列表里面加-s#1:--alluredir ---生成临时文件,测试用例的结果数据放到目录   --alluredir   存放目录pytest.main(["test_func01.py","-s","--alluredir","../report/tmp"])  #框架自己调用函数#通过--alluredir把allure需要的数据存到../report/tmp这个路径下面#../--所在路径的父级别目录是test_case的目录隔壁邻居report文件下tmp,专门放alluer报告生成的需要的数据源# 2:临时数据没有报告的,allure generate allure才会生成报告   -----allure生成器生成allure报告--generate allure生成器,cmd指令#需要os模块os.system()调用指令可以在local的cmd里面敲os.system("allure generate ../report/tmp -o ../report/report --clean")#os.system("allure generate 报告需要的数据 -o 报告存放目录 --clean")#-o生成#allure generate生成报告指令,把../report/tmp 的文件-o生成报告out out一下,生成的报告放在../report/report#--clean把上次报告清除一下用--clean                 #allure报告生成的是一个服务,(本地服务)和jinkins结合,放在整个里面去集成,放到公共服务器里面

allure报告的优化

import pytest
import os
import allure       
@allure.feature("登录模块")                                                      #一级标题,大模块标题(类标签)
class Test_login():                                                              def setup_class(self):                                                                  print("执行测试类之前,我需要执行操作")@allure.story("登录login01")                                                  # 二级标签(每个接口的标签)@allure.title("login01")                                                     # 标题,每个用例带个标题(报告体现在每个测试用例)(一个接口有几个用例,title用例的标签)@pytest.mark.parametrize("a",[1,2,3])                                      def test_login01(self,a):                                                      print("---test_login01----")assert 1 + 1 == a@allure.story("登录login02")                                                  # 二级标签,定制allure报告层级@allure.title("login02")                                                     #标题,每个用例带个标题(报告体现在每个测试用例)@pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])                      def test_login02(self,a,b):print("---test_login02----")assert a + 1 == bdef teardown_class(self):                                               print("------该测试类的环境清除-----")@allure.feature("购物模块")
class Test_Shopping():@allure.story("shopping")@allure.title("shopping01")@pytest.mark.parametrize("a,b", [(1, 2), (3, 4), (5, 6)])def test_shopping(self, a, b):print("---test_login02----")assert a + 1 == b
if __name__ == '__main__':pytest.main(["test_func01.py","-s","--alluredir","../report/tmp"])    os.system("allure generate ../report/tmp -o ../report/report --clean")#allure报告生成的是一个服务,(本地服务)和jinkins结合,放在整个里面去集成,放到公共服务器里面

其他知识点:
测试用例一般写在excel表格文件里面,数据分离(维护好excel就行);
pytest–从头到尾到报告执行发邮件;
字典是一种存储类型,json是一种格式(完全不同);

4、pytest参数解析

pytest.main([‘test_boss.py’,‘-s’,‘-k test_modify_psw’,‘–alluredir=tmp/my_allure_results’])

说明:
test_boss.py:指定测试用例文件;
-s:显示print语句;
-k test_modify_psw:指定某个测试用例;
-n:表示用两个进程启动测试脚本

生成报告缓存文件:–alluredir=tmp/my_allure_results
os.system(‘allure serve tmp/my_allure_results’):打开测试报告,命令行需要python 的os模块调用

5、pytest的初始化和清除

import pytest
#假设启动被测app的时候需要去填写配置项信息,每个的端口号不同,多终端需要两个appim server
#这时候setup_module和teardown_module不能传参,搞不定,需要换一种方法做测试用例的初始化和清除,#setup_module以模块为作用域,不写module以测试用例(测试函数)为作用域
# def setup_module():    #测试用例之前执行,原始的setup和teardown有个缺陷,里面不能传参数,
#                      #默认test级别,每个测试用例执行的时候都会执行一次,希望当前某个模块执行的时候只执行一次(不管里面用例执行多少次)
#                      #setup初始化和tear_down升个级,升级成module模块级别的
#     print("启动被测app")
#     print('连接appium服务')
#
# def teardown_module():
#     print('关闭被测app')
#     print('断开appium服务')#定义个函数,名字随便取  使用@pytest.fixture装饰器把这个函数装饰成初始化清除函数
@pytest.fixture(scope='module')    #作用域默认test,初始化,加装饰器,初始化清除函数,autouse=True(自动执行)这种方法不建议使用                               #
def before_test():                   #初始化函数升级作用域到module模块级别print("启动被测app")print('连接appium服务')yield   #后面写清除动作,after_test()#清除函数,清除函数并不会直接被初始化函数使用,我们必须放在初始化函数yiled后面才能回被调用
def after_test():print('关闭被测app')print('断开appium服务')
#目前一共有两个port,需要测试两个手机,两个多终端,before_test需要装饰器标记#测试用例的参数化
@pytest.mark.usefixtures('before_test')                        #这表示调用某个自定义的初始化函数,括号里面的字符串写被调用函数的名字
@pytest.mark.parametrize('psw',['boss123','boss456'])
def test_app(psw):                        #测试用例,可能涉及到其他参数,比如需要一些配置信息,测试用例涉及到参数,                              #多组参数需要使用装饰器pytest.mark.parametrize(数据驱动),psw传参和形参名字对应的print('测试boss app')print(f'登录测试账号{psw}')if __name__ == '__main__':pytest.main(['pytest_ywt.py','-s'])
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

千锤百炼方成钢,一腔热血铸辉煌。奋斗是追逐梦想的征程,每一次努力都在为成功铺就坚实的基石。永不放弃,勇往直前,用汗水浇灌希望的花朵,终将开出属于自己的辉煌人生。

生命如一朵盛开的花朵,只有经历风雨的洗礼,才能绽放出光彩夺目的美丽。坚持自己的梦想,勇敢追逐,奋斗不止,你将终获辉煌的成就,因为努力是改变命运的钥匙。

人生如天空之星,只有付出坚持的努力,才能闪耀璀璨的光芒。不畏艰难困境,锲而不舍地追求梦想,奋斗的力量将引领你超越自我,驶向辉煌的彼岸。相信自己,勇往直前,成功必将属于你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题之设计模式--责任链模式

1. 概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…

【外卖系统】分类管理业务

公共字段自动填充 需求分析 对于之前的开发中,有创建时间、创建人、修改时间、修改人等字段,在其他功能中也会有出现,属于公共字段,对于这些公共字段最好是在某个地方统一处理以简化开发,使用Mybatis Plus提供的公共…

循环多个<el-button> 如何设置某一个选中

如果您想在一个循环中的多个el-button中选择一个按钮并将其设置为选中状态,可以使用一个变量来标识选中的按钮索引。以下是一种实现方式: 1. 在Vue组件中定义一个selectedButton变量,用于存储选中按钮的索引值: data() {return …

【FPGA/D7】

2023年7月26日 串口传图到RAM并TFT显示 视频25note要求:接收两个字节数据合并为一个16位数据并写入ram: FIFO模型与应用场景 视频26 串口传图到RAM并TFT显示 视频25 note 存储器的使用,在开始读写或者结束读写的位置非常容易出现数据错误或…

不等式的证明方法

文章目录 不等式的证明方法比较法例例作商法 综合法例 分析法例小结 反证法例例 放缩法例例 几何法例例 不等式的证明方法 比较法 主要指作差构造与0比较 因为 a > b a>b a>b ⇔ \Leftrightarrow ⇔ a − b > 0 a-b>0 a−b>0 所以若要证明 a > b a>…

小程序新渲染引擎 Skyline 发布正式版

为了进一步提升小程序的渲染性能和体验,我们推出了一套新渲染引擎 Skyline,现在,跟随着基础库 3.0.0 发布 Skyline 正式版。 我们知道,小程序一直用 WebView 来渲染界面,因其有不错的兼容性和丰富的特性,且…

PM2.5传感器(PMS5003)STM32代码

PM2.5传感器型号:PMS5003 PMS5003简介如下: 详情:PMS5003资料链接 PM2.5传感器代码下载,本人所写,亲测有效,基于STM32F407(其他STM32型号皆可移植,只需修改UART参数即可),UART打印数据

Git的常用命令以及使用场景

文章目录 1.前言2.工作区,暂存区,版本库简介3.Git的常用命令4.版本回退5.撤销修改6.删除文件7.总结 1.前言 在学习Git命令之前,需要先了解工作区,暂存区和版本库这三个概念 2.工作区,暂存区,版本库简介 在使用Git进行版本控制时,有三个重要的概念:工作…

基于Truss+Docker+Kubernetes把开源模型Falcon-7B送上云端(译)

背景 到目前为止,我们已经看到了ChatGPT的能力及其所能提供的强大功能。然而,对于企业应用来说,像ChatGPT这样的封闭源代码模型可能会带来风险,因为企业自身无法控制他们的数据。尽管OpenAI公司声称用户数据不会被存储或用于训练…

【1.1】Java微服务:初识微服务

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…

维护自己电脑浅析

作为一名计算机用户,维护自己的电脑是非常重要的,这可以保证电脑的正常运行、数据的安全、提高电脑的性能等。在本文中,我将分享一些我个人维护电脑的经验和技巧。 定期清理电脑 电脑在使用过程中会产生大量的临时文件、垃圾文件、缓存文件等…

Mycat分片函数详解

Mycat新一代Mysql分布式集群,大数据处理中间件,中国第一开源软件 Checkout项目 可以用eclipse的svn插件来进行项目检出,也可以用Tortoise SVN等工具检出,由于maven(M2)中的buildnumber-maven-plugin 中的SVNkit最高支持1.7的SVN仓库,因此当你用Tortoise SVN 1.8的工具或版…

c# 函数中可选参数太多,想设置最后一个参数,又不想修改前面默认参数

C#中,你可以使用命名参数来指定你想要设置的可选参数,而保留其他参数的默认值不变。通过使用命名参数,你可以根据需要选择要为哪些参数提供值,而无需按照它们在函数签名中的顺序提供参数值。 以下是一个示例,演示如何…

LinuxC语言-网络通信tcp/ip errno获取错误描述字符串

目录 服务端代码&#xff1a; 获取errno错误码&#xff1a; 客户端代码&#xff1a; 运行结果: 服务端代码&#xff1a; #include <stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/in.h> #in…

刷题 21-25

二十一、数组中两元素最大乘积 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释&…

Arcis中三维面转二维面

1、如何查看面是三维面 打开面属性表&#xff0c;查看SHAPE字段&#xff0c;是带“ZM”的就是三维面 不带”ZM“的就是二维面 2、三维面转二维面 在转换的过程中&#xff0c;通过设置环境下的参数&#xff0c;可以转换

MySQL数据库——DML基本操作

MySQL数据库——DML基本操作 1. 引言 MySQL是一种开源的关系型数据库管理系统&#xff0c;被广泛应用于Web开发、企业应用和数据分析等领域。DML&#xff08;Data Manipulation Language&#xff09;是MySQL中用于查询、插入、更新和删除数据的一组基本操作。 2. DML基本操作…

Ansible部署MariaDB galera集群(多主)

文章目录 Ansible部署MariaDB galera集群(多主)介绍节点规划基础环境准备编写剧本文件执行剧本文件查看集群状态测试 Ansible部署MariaDB galera集群(多主) 介绍 MariaDB Galera集群是一套基于同步复制的、多主的MySQL集群解决方案&#xff0c;使用节点没有单点故障&#xff…

react native web RN webpack nginx 部署

# nginx配置 location /app {root html;index index.html;# url 切换时始终返回index.htmltry_files $uri /app/index.html; } # 图片样式缓存1年 location ~* /app.*\.(js|css|png|jpg)$ {access_log off;expires 365d; } # html/xml/json 文件不缓存 location ~* /app.…

ChatGPT 实现前一天

提出需求 个人输入需求&#xff1a; Java实现键盘输入日期 输出前一天&#xff0c;需要考虑润年和非润年&#xff0c;2月是否有29号&#xff0c;大月小月的区分等细节处理&#xff0c;不符合的有对应提示&#xff0c;不使用java包里的封装好的类 ChatGPT4分析出的语义&#xff…