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

news2024/11/16 10:52:12

目录:导读

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


前言

1、pyets种有四种级别的setup和teardown

setup_module和teardown_module,在整个测试用例所在的文件中所在的文件中所有的方法运行前和运行后运行,只运行一次—模块的

setup_class和teardown_class,在整个测试文件中的一个class中所有的用例的签后运行 ----class类

setup_method和teardown_method,在class内的每个方法运行前后运行 ---------方法的

setup_function和teardown_function,在非class下属的每个测试方法的前后运行 ----函数的
分层分级(不同级别有不同方法)

2、pytest里面的数据初始化装饰器fixture参数说明

fixture_function: Optional[_FixtureFunction] = None,
*,
scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",  --scope参数:级别
params: Optional[Iterable[object]] = None,------------------------------- params:参数
autouse: bool = False,---------------------------------------------------- autouse:是否自动化执行
ids: Optional[
	Union[
		Iterable[Union[None, str, float, int, bool]],
		Callable[[Any], Optional[object]],
	]
] = None,
name: Optional[str] = None
@pytest.fixture(scope=xxx,params=xxx,autouse=xxx) 

fiixture装饰器可以传单三个参数:
scope参数:初始化清除定义级别
params:参数
autouse:是否自动化执行

3、fixture 函数级别的初始化,环境初始化

import pytest
 
                #函数级别的@pytest.fixture()初始化操作
@pytest.fixture()       #标记函数是个初始化操作,标记后需要传给每个函数statr_func这个函数名才会执行初始化操作(函数级别的)
def statr1_func():
                #这不是测试函数,一个普通函数,pytest执行用例只能识别test开头的方法和函数,所以pytest.main不会执行(不参加pytest用例)
    print("------初始化操作1------")
 
@pytest.fixture()
def statr2_func():
    print("------初始化操作2------")
 
#fixture:有哪些操作(可以多个初始化可以一起调,需要两个初始化,需要连接,需要登录)
#这种写法很方便,函数需要statr_func1函数做一个初始化操作可以调用statr_func1这个函数,---def test_001(statr1_func):
# 需要其他初始化方法可以选择性调用其他初始化函数,传递函数名就行(灵活选择)----def test_002(statr2_func):
#函数初始化操作需要传递几个函数也可以多个函数名传递--def test_003(statr2_func,statr1_func):
#方便灵活
 
def test_001(statr1_func):
    print("-----test01------")
 
def test_002(statr2_func):
    print("-----test02 ------")
 
def test_003(statr2_func,statr1_func):
    print("-----test03 ------")
 
if __name__ == '__main__':
    pytest.main(["test_pytest.py","-s"])

4、类级别的初始化class,可以使用setup做初始化,也可以使用fixture做初始化

import pytest


@pytest.fixture(scope="class")           #类级别的初始化函数  scope="class" 就是把这个初始化定义成类级别的
def statr1_func():
	print("------初始化操作1------")

class Test_00:                  #需要执行 Test_00测试类,需要做初始化(可以setup_class)
	# def setup_class(self):
	#     print("类内部的初始化,")          #只对类有用,类级别的,类里只做一次(几个类的初始化操作一样这种不适合,需要重复写)
										   #fixture初始化类就是避免重复代码
	def test_001(self,statr1_func):
		print("-----test01------")

	def test_002(self,statr1_func):
		print("-----test02 ------")


if __name__ == '__main__':
	pytest.main(["test_pytest01.py","-s"])

类级别初始化fixture,虽然test_001和test_002都调用了statr1_func这个类级别的初始化函数,但是执行类测试用例的时候只执行statr1_func初始函数一次。

多个类都可以调用statr1_func这个类级别的初始化方法,调用的时候最好放在类里的第一个函数,后面的函数可以不传(因为对应的是类级别的初始化)

import pytest


@pytest.fixture(scope="class")         #类级别的初始化函数
def statr1_func():
	print("------初始化操作1------")
											#一个模块里面有函数用例也有类的用例怎么做:(class级别的初始化只对类有用,对函数没用)
def test_003(statr1_func):                  #测试函数,
	print("-----test03------")

class Test_00:                        #需要执行test00测试类,需要做初始化(可以setup_class)
	def test_001(self,statr1_func):
		print("-----test01------")

	def test_002(self,statr1_func):
		print("-----test02 ------")

if __name__ == '__main__':
	pytest.main(["test_pytest01.py","-s"])

初始化方法statr1_func定义成class类级别的,函数级别的测试测试用例test__003调用初始化函数会执行一次。

class类级别的测试用例Test_00调用初始化函数会执行一次(一共执行两次)  看级别的,整个模块的级别的化最好用module,否则有问题,fixture可以做return,会有返回值的,对应级别来做。

执行结果:

 test_pytest01.py 	    
------初始化操作1------	    
-----test03------	    
.------初始化操作1------	    
-----test01------	    
.-----test02 ------

5、类级别初始化实际代码:初始化操作是登录操作

#课程模块的测试类
import pytest
from lib.api_lib.lesson import Lesson
from lib.api_lib.lesson import Login
from tools.execlMethod import get_excelData
import json
import os

@pytest.fixture(scope="class")           #类级别的初始化函数
def start_func():
	global sessionid
	sessionid = Login().login('{"username":"auto","password":"sdfsdfsdf"}')

class Test_lesson:
	#1:课程新增接口,前置条件登录(封装完一个方法后想办法做数据驱动),课程增加需要通过excel表用例来做
	@pytest.mark.parametrize("inData,repsData", get_excelData('2-课程模块', 2, 26))
	def test_lesson_add(self,start_func,inData,repsData):
		reps=Lesson(sessionid).lesson_add(inData)
		print(reps)
		assert reps["retcode"]==json.loads(repsData)["retcode"]

if __name__ == '__main__':
	pytest.main(["test_lesson01.py", "-s", "--alluredir", "../report/tmp"])
	os.system("allure serve ../report/tmp")

6、模块级别的初始化mudule,不管是类还是方法@pytest.fixture(scope=“module”)

模块(module)级别的初始化,(整个模块所有的类所有的东西要做一步操作,可以使用module这个模式)

只在模块运行前面只做一次,后面不做了,哪怕多调用也没用,一个模块里面有test_003函数测试用例,

也有classTest_00类级别的测试用例,定义一个模块级别的初始化函数statr1_func

函数里面调用初始化方法def test_003(statr1_func):和类里面的方法调用初始化方法test_001(self,statr1_func):,test_001(self,statr1_func):

整个模块执行的时候初始化函数都只执行一次(不管你这个模块里面调用多少次)

import pytest


@pytest.fixture(scope="module")         #模块级别的初始化函数
def statr1_func():
	print("------初始化操作1------")

						  #一个模块里面有函数用例也有类的用例怎么做:(class级别的初始化只对类有用,对函数没用)
def test_003(statr1_func):            #测试函数,
	print("-----test03------")

class Test_00:                          #需要执行test00测试类,需要做初始化(可以setup_class)
	# def setup_class(self):
	#     print("类内部的初始化,")      #只对类有用,类级别的,类里只做一次(几个类的初始化操作一样这种不适合,需要重复写)
	#                                   #fixture初始化类就是避免重复代码
	def test_001(self,statr1_func):
		print("-----test01------")

	def test_001(self,statr1_func):
		print("-----test02 ------")

if __name__ == '__main__':
	pytest.main(["test_pytest01.py","-s"])
执行结果:test_pytest01.py 
------初始化操作1------
-----test03------	
.-----test01------
.-----test02 ------

7、session的级别的初始化,跨模块的,package级别的

在这个模块下面所有的都会调用(包级别的,包里面运行前做个环境清除)

需要在testcase文件夹里面创建一个conftest.py模块,这个固定名称,pytest自动识别这个名称

testcase里面:新增课程前面需要登录,增加课程前面需要清除数据,需要2个级别的初始化,登录,整个环境的清除

test_case(测试用例文件夹)创建一个:conftest.py文件  里面写包级别的初始化

conftest.py文件里也能写类级别和模块级别的初始化,而且不需要调用,这个conftest.py模块是pytest自动识别导入的

test_case              #文件夹
conftest.p


import pytest
#包级别的初始化,在运行整个包之前做个初始化,包里面不同作用域,每个包里面都可以放一个,每个包里面的操作都可以不一样
@pytest.fixture(scope="session",autouse=True)           #session级别的处于时候autouse=True默认自动执行
def start_demo(request):                                     #包的开始
	print("我是整个包的初始化")
	def fin():                             #尾部这是包级别的,整个包做完后做个环境数据的清除    包的结束
		print('---测试完成,包的数据清除---')

	request.addfinalizer(fin)                   #回调,当我整个包运行完了后回调fin这个方法

#fixture的参数autouse: bool = False,---自动执行参数    #session的级别,包里面有很多模块,很多模块需要对整个包进行初始化在conftest.py里面做模块的数据初始化和清除(conftest.py只对当前包有用)

8、两种调用初始化和清除函数的方式+初始化清除函数的返回值的使用

方式一:

import pytest
@pytest.fixture()
def befor_func():
    print('xxxxxxxxxxxxx测试用例的初始化xxxxxxxxxxxxxxxx')
    yield 10
    print('zzzzzzzzzzzzzzzzzz测试用例的清除zzzzzzzzzzzzzz')

def test_001(befor_func):                #调用初始化和清除方式一:直接在测试用例里传递初始化清除函数的函数名来调用
    print("测试用例001")
    res=befor_func                    #如果初始化清除函数有返回值,可以直接这样接收参数来使用
    print(res)

@pytest.mark.usefixtures('befor_func')        #调用初始化和清除方

方式二:使用usefixtures放在测试用例前面直接调用初始化清除函数

def test_002():
    print("测试用例002")

if __name__ == '__main__':
    pytest.main(["test1.py",'-s'])
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

梦想是航向未来的指南针,坚持努力是拨开迷雾的利剑。勇敢追逐,脚踏实地,用心与汗水创造无限可能。磨砺意志,超越自我,让奋斗的火焰燃亮人生的每一个角落,绽放绚烂的辉煌!

心怀梦想,追逐自由,奋斗是破茧成蝶的力量。坚持不懈,超越极限,用汗水谱写人生的华章。相信奇迹,勇往直前,让每一天都成为决定命运的关键时刻,绽放自己独特的光芒!

不畏风雨,追逐梦想,奋斗是燃烧内心的力量。放眼未来,脚踏实地,用努力铺就通往成功的道路。每一次努力都是成长的催化剂,相信自己,勇往直前,创造属于自己的辉煌人生!

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

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

相关文章

【2023.7.29】浅谈手办——新人入坑指南

目录 前言入坑指南1.声明2.介绍3.树状图 总结参考文章 前言 出于对动漫的热爱,相信很多人都会买手办,本人在大一时开始入手了第一个手办,超大猿王路飞(高约50cm),当时对手办还不是很了解,只知道…

mapboxGL中楼层与室内地图的结合展示

概述 质量不够,数量来凑,没错,本文就是来凑数的。前面的几篇文章实现了楼栋与楼层单体化的展示、室内地图的展示,本文结合前面的几篇文章,做一个综合的展示效果。 实现效果 实现 1. 数据处理 要实现上图所示的效果…

Java-数组的定义和使用

一、数组的基本概念 1.1 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩,并对其进行输出,则可有 public static void main(String[] args){ int score1 70; int score2 80; int score3 85; int score4 60; …

学C的第三十一天(上)【通讯录的实现】

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求: 实现一个通讯录, 通讯录中存放保存人的信息&#xff1…

C# PaddleInference.PP-HumanSeg 人像分割 替换背景色

效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInference 包含4个分割模型 modnet-hrnet_w18 modnet-mobilenetv2 ppmatting-hrnet_w18-human_512 ppmattingv2-stdc1-human_512 部分代码 using OpenCvSharp; using Sdcb.PaddleInference; using System; using System.…

aop实现方式及基本使用

aop实现方式 aspectj 编译器增强,直接修改源码可以不借助Spring实现 也没有用代理对象 (ajc编译器) aop 的原理并非代理一种, 编译器也能玩出花样(直接修改源码) 运行时需要在 VM options 里加入 -javaagent:D:/envir…

阿里云服务器CPU大全_处理器主频性能说明

阿里云服务器CPU型号是什么?处理器主频多少?云服务器ECS和轻量应用服务器CPU处理器性能如何?阿里云服务器网分享阿里云服务器CPU型号大全、处理器主频性能型号汇总: 目录 阿里云服务器CPU处理器大全 通用型云服务器CPU 计算型…

【动态规划刷题 2】使⽤最⼩花费爬楼梯 解码⽅法

使⽤最⼩花费爬楼梯 746 . 使用最小花费爬楼梯 链接: 746 . 使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 …

《向量数据库指南》:向量数据库Pinecone如何集成hugging-face-endpoints

目录 端点 创建嵌入 Vector DB 创建和索引嵌入向量 拥抱面推理端点允许访问简单的模型推理。结合Pinecone,我们可以轻松生成和索引高质量的向量嵌入。 让我们通过初始化生成向量嵌入的推理端点来开始吧。 端点 我们首先前往拥抱面推理端点主页,如果需要,注册一个账…

某厂生产三种产品 I, II, III。 每种产品要经过 A、 B两道工序加工。 设该厂有两种规格的设备能完成 A 工序, 它们以A1、 A2表示; 有三种规格的设备能完成 B 工序, 它们以B1、

数学建模算法与应用习题1-3 通俗解析 一.题干二.解答2.1 先读懂题干2.2 解体思路 一.题干 某厂生产三种产品 I, II, III。 每种产品要经过 A、 B两道工序加工。 设该厂有两种规格的设备能完成 A 工序, 它们以A1、 A2表示; 有三种…

TreeMap的底层实现

0. 你需要知道的TreeMap的内置属性 0.1 节点属性 K key; // 键 V value; // 值 Entry<K,V> left; // 左子节点 Entry<K,V> right; // 右子节点 Entry<K,V> parent; // 父节点 boolean color; // 节点的颜色0.2 成员变量 //比较器对象private f…

Spring Boot配置加密实践

Spring Boot配置加密实践 使用Java技术栈的时候&#xff0c;Spring Boot几乎已经成为了标配。Spring Boot帮助我们简化了各种技术的整合&#xff0c;我们只需要在application.yml配置文件中增加一点点的配置即可。 虽然Spring Boot简化了我们的工作&#xff0c;但是也隐藏了底…

draw up a plan

爱情是美好的&#xff0c;却不是唯一的。爱情只是属于个人化的感情。 推荐一篇关于爱情的美文&#xff1a; 在一个小镇上&#xff0c;有一家以制作精美巧克力而闻名的手工巧克力店&#xff0c;名叫“甜蜜之爱”。这家巧克力店是由一位名叫艾玛的年轻女性经营的&#xff0c;她对…

【Git】版本回退与撤销修改案例

目录 一、版本回退 二、撤销修改案例 案例1&#xff1a;仅在工作区进行了修改还未进行add操作 案例2&#xff1a;仅进行了add 操作还未进行commit操作 案例3&#xff1a;进行了add与commit操作无其他操作 三、版本库中删除文件 一、版本回退 在进行版本回退之前我们需要…

类加载机制与类加载器

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的&#xff0c;类文件又是如何加载到虚拟机的&#xff0c;类加载有哪些机制和原则呢&#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件…

音乐编曲软件FL Studio21中文免费版新功能及下载

FL Studio21是一款数字音频工作站软件&#xff0c;用于音乐制作和混音。它具有广泛的音频编辑和处理功能&#xff0c;可以帮助你创建出专业的音乐和音频内容。它还支持多个音频和效果轨道&#xff0c;可以帮助你创建更加复杂和高质量的音频内容。FL Studio是一款著名的DAW音频制…

1300*C. A Cookie for You

Example input 6 2 2 1 2 0 100 0 1 12 13 25 1 27 83 14 25 0 0 1 0 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 output Copy Yes No No Yes No Yes 解析&#xff1a; 因为第二种人只能吃少的那种蛋糕&#xff0c;所以优先满足他…

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 &#x1f525; Android Studio 版本更新 &#x1f525; Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…

spring boot 2 配置上传文件大小限制

一、起因&#xff1a;系统页面上传一个文件超过日志提示的文件最大100M的限制&#xff0c;需要更改配置文件 二、经过&#xff1a; 1、在本地代码中找到配置文件&#xff0c;修改相应数值后交给运维更新生产环境配置&#xff0c;但是运维说生产环境没有这行配置&#xff0c;遂…

Java那些“锁”事 - 死锁及排查

死锁是两个或者两个以上的线程在执行过程中&#xff0c;因争夺资源而造成的一种互斥等待现象&#xff0c;若没有外界干涉那么它们将无法推进下去。如果系统资源不足&#xff0c;进程的资源请求都得到满足&#xff0c;死锁出现的可能性就很低&#xff0c;否则就会因为争夺有限的…