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


前言

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做初始化

扫描二维码关注公众号,回复: 15895506 查看本文章
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性能测试

请添加图片描述

九、总结(尾部小惊喜)

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

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

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

猜你喜欢

转载自blog.csdn.net/m0_70102063/article/details/131981599