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

news2024/11/19 8:26:04

目录:导读

    • 前言
    • 一、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_func
    print(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 == b

        def 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 == b

	def 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 == b

	def 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.coloradmin.cn/o/813348.html

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

相关文章

谈一谈缓存穿透,击穿,雪崩

缓存穿透 缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,…

04 http连接处理(上)

基础知识&#xff1a;epoll、http报文格式、状态码和有限状态机 代码&#xff1a;对服务端处理http请求的全部流程进行简要介绍&#xff0c;然后结合代码对http类及请求接收进行详细分析。 epoll epoll_create函数 #include <sys/epoll.h> int epoll_create(int size)…

深度学习实践——模型部署优化实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 源码&#xff1a; 1. 对应的github地址 https://github.com/Asionm/streamlit_demo 2. 对应的gitee地…

Session、Cookie 与 Application

目录 简介cookiecookie生命周期 sessionsession生命周期 application 简介 cookie、seesion、application三个都会缓存我们用户状态的数据&#xff0c;使得我们在浏览器访问网站时可以更快速的获取到信息。 主要原因在于HTTP协议是无状态的&#xff0c;我们每次访问服务器&…

软考05根据内存区域大小计算芯片数量

文章目录 前言一、原题二、解题思路1.计算内存区域的大小2.计算每个存储器芯片的容量3.计算芯片数量 总结 前言 从网上看题答案是有了&#xff0c;但是不知道具体的计算过程就很难受&#xff0c;不然下次还是不会&#xff0c;只能自己梳理了 一、原题 二、解题思路 1.计算内存…

ANR底层源码分析之Service篇

ANR底层源码分析之Service篇 一、前言二、Service-ANR原理2.1 Service启动ANR原理简述2.2 前台Service VS 后台Service的区别2.2.1 前台Service2.2.3 后台Service 2.3 Service启动ANR源码执行过程2.3.1 ActiveServices#bringUpServiceLocked2.3.2 ActiveServices#realStartServ…

数据安全

数据的备份与恢复 1. 数据备份技术 任何数据在长期使用过程中&#xff0c;都存在一定的安全隐患。由于认为操作失误或系统故障&#xff0c;例如认为错误、程序出错、计算机失效、灾难和偷窃&#xff0c;经常造成数据丢失&#xff0c;给个人和企业造成灾难性的影响。在这种情况…

LeetCode 刷题 数据结构 数组 27 移除元素

难度&#xff1a;简单 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

SpringBoot自动装配介绍

SpringBoot是对Spring的一种扩展&#xff0c;其中比较重要的扩展功能就是自动装配&#xff1a;通过注解对常用的配置做默认配置&#xff0c;简化xml配置内容。本文会对Spring的自动配置的原理和部分源码进行解析&#xff0c;本文主要参考了Spring的官方文档。 自动装配的组件 …

西安科技大学:励志图存,自强不息

今天就让我带着大家一起来看“采矿冶金历史悠久&#xff0c;安全工程国重学科”的西安科技大学吧&#xff01; 一、高校概况 西安科技大学&#xff08;Xi’an University of Science and Technology&#xff09;&#xff0c;简称西科大、西安科大&#xff0c;位于陕西省西安市…

算法通关村第二关——指定区间反转的问题解析

题目类型 指定区间反转 题目描述 给你单链表的头指针 head 和两个整数left 和right &#xff0c;其中left < right 。请反转从位置left到位置right的链表节点&#xff0c;返回反转后的链表 示例 输入&#xff1a;head [1,2,3,4,5] , left 2 , right 4 输出&#xff1a;[…

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(二 - 完结)[万字详解]

「前言」文章内容大致是传输层协议&#xff0c;TCP协议讲解的第二篇&#xff0c;续上篇TCP。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 二、TCP协议2.9 TCP连接管理机制2.9.1 三次握手2.9.2 四次挥手2.9.3 演示查看TIME_WAIT和CLOSE_WAIT状态2.9.…

基于SpringBoot+Vue的车辆充电桩管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

MOS管的体二极管是怎么形成的

一般MOS管的源极和漏极之间会存在体二极管&#xff0c;对于N沟道的MOS管&#xff0c;体二极管由源极指向漏极。 对于PMOS管&#xff0c;体二极管由漏极指向源极&#xff0c;那么MOS管为什么会有这个体二极管呢&#xff1f; 我们看到这个N沟道MOS管的结构&#xff0c;源极和漏极…

单片机第一季:零基础12——I2C和EEPROM

目录 1&#xff0c;EEPROM 2&#xff0c;I2C 2.1&#xff0c;I2C物理层 2.2&#xff0c;I2C协议层 3&#xff0c;AT24C02介绍 4&#xff0c;代码 1&#xff0c;EEPROM 为什么需要EEPROM&#xff1f; 单片机内部的ROM只能在程序下载时进行擦除和改写&#xff0c;但是…

西安电子科技大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 西安电子科技大学&#xff08;A-&#xff09;考研难度&#xff08;☆☆☆☆&#xff09; 西安电子科技大学计算机科学与技术学院&#xff08;国家示范性软件学院&#xff09;始于1958年中央军委批复设立的导弹系统专用…

17 反显、修改、提交图书信息功能实战

前言 上节回顾 上一节&#xff0c;我们针对图书列表做了实战练习&#xff0c;主体内容包括顶部的检索区域&#xff0c;中间的el-table数据区域&#xff0c;和底部的el-pagination分页区域&#xff0c;并针对每一块做了讲解&#xff0c;还不太明白上下文的同学可以回过头去看一…

Linux标准库API

目录 1.字符串函数 2.数据转换函数 3.格式化输入输出函数 4.权限控制函数 5.IO函数 6.进程控制函数 7.文件和目录函数 1.字符串函数 2.数据转换函数 3.格式化输入输出函数 #include<stdarg.h>void test(const char * format , ...){va_list ap;va_start(ap,format…

自监督去噪:Noise2Noise原理及实现(Pytorch)

文章地址&#xff1a;https://arxiv.org/abs/1803.04189 ICML github 代码: https://github.com/NVlabs/noise2noise 本文整理和参考代码: https://github.com/shivamsaboo17/Deep-Restore-PyTorch 文章目录 1. 理论背景2. 实验结果3. 代码实现(1) 网络结构(2) 数据加载(3) 网络…

Linux--验证命令行上运行的程序的父进程是bash

1.输入以下代码&#xff1a; #include <stdio.h> #include <unistd.h> int main() {printf("hello world: pid: %d, ppid: %d\n",getpid(),getppid());return 0; }2.编译得到可执行程序​​​ 3.运行得到ppid 4.输入指令 ps axj | head -1 &&am…