全网最详细,pytest测试框架fixture应用实战总结,彻底打通封装框架......


前言

fixtrue修饰器标记的方法通常用于在其他函数、模块、类或者整个工程调用时会优先执行,通常会被用于完成预置处理和重复操作。

例如:登录,执行SQL等操作。

Pytest自动化框架:https://www.bilibili.com/video/BV18K411m7FH/

完整方法如下:

fixture(scope='function',params=None,autouse=False,ids=None,name=None)

参数说明:

1.scope参数:标记方法的作用域。有4个可选值:function(默认,函数)、class(类)、module(模块)、package/session(包)

(1)作用域为函数实例

import pytest


@pytest.fixture(scope='function',autouse=True)
def login():
	print('登录系统')

def test_01():
	print('测试用例一')

class TestCase:

	def test_03(self):
		print('测试用例三')

	def test04(self):
		print('测试用例四')


if __name__ == '__main__':

pytest.main(['-s','pytest-demo.py'])

注意:该模块中所有的函数在执行之前都会执行login函数。

(2)作用域为类实例一:

import pytest

 
@pytest.fixture(scope='class',autouse=True)
def login():
	print('登录系统')

def test_01():
	print('测试用例一')

class TestCase1:
	def test_03(self):
		print('测试用例三')

	def test04(self):
		print('测试用例四')

class TestCase2:
	def test_05(self):
		print('测试用例五'')

	def test06(self):
		print('测试用例六')

if __name__ == '__main__':

pytest.main(['-s','pytest-demo.py'])

注意:在TestCase1类和TestCase2类中,login方法都只会被执行一次。函数test_01也会执行一次。

(2) 作用域为类实例二:

import pytest

@pytest.fixture()
def login():
	print('登录系统')

def test_01():
	print('测试用例一')

@pytest.mark.usefixtures('login')
class TestCase:
	def test_03(self):
		print('测试用例三')
	
	def test04(self):
		print('测试用例四')

if __name__ == '__main__':

pytest.main(['-s','pytest-demo.py'])

注意:此方式函数不会被执行,但是被作用的类中的每个函数执行之前都会执行一次,在测试类前面添加:@pytest.mark.usefixtures(‘login’) 其中login为函数名。

(3)作用域为module时表示整个模块中都只会执行一次。这里不在累述。

(4)作用域为package时表示整个包都只会执行一次。这里不在累述。

(5)在N个用例中指定某一个用例执行

import pytest

@pytest.fixture()
def login():
	print('登录系统')

def test_01():
	print('测试用例一')

class TestCase1:
	def test_03(self):
		print('测试用例三')

	def test04(self,login):
		print('测试用例四')

if __name__ == '__main__':

pytest.main(['-s','pytest-demo.py'])

注意:test04以参数的形式传入了执行的方法login,这样来指定只有test04方法在执行时才执行login方法。

特别注意:如果在login函数中加入reutrn ‘success’,在test04方法中加入print(login),那么print(login)打印的值就是返回的success.

Fixture参数之params参数可实现参数化:(可以为list和tuple,或者字典列表,字典元祖等)

实例如下:

import pytest

def read_yaml():
    return ['1','2','3']

@pytest.fixture(params=read_yaml())
def get_param(request):
    return request.param
	
def test01(get_param):
    print('测试用例:'+get_param)
	
if __name__ == '__main__':
    pytest.main(['-s','pytest-demo.py'])

注意:

1.此例中test01方法被执行了三次,分别使用的数据为’1′,’2′,’3’,此结果类似于ddt数据驱动的功能。特别注意:这里的request参数名是固定的,然后request.param的param没有s哦。

2.可以把return request.param改成yield request.param,yield也是返回的意思,它和return的区别在于return返回后后面不能接代码,但是yield返回后,后面还可以接代码。

Fixture其他参数:

1.autouse参数:自动执行,上面的示例已经用到了。

2.ids参数:ids参数是给每一项params参数设置自定义名称用的,意义不大。

3.name参数:相对于把被fixture标记的方法重命名,意义不大。
如下图所示案例:

@pytest.fixture(name='mashang')   #name参数给fixture设置名称
def login():
    print('登录方法')
    
def testcase(mashang):      #使用name参数名来引用,还用login报错
    print('测试用例')

使用@pytest.mark.parametrize()方法实现参数化

方法详情:

parametrize(argnames,argvalues,indirect=False,ids=None,scope=None)

常用参数:

argnames:参数名

argnames:参数值(可以为list和tuple,或者字典列表,字典元祖等),参数值有N个,用例就会执行N次。

(1)使用方式一

import pytest

lis = [{
    
    'name':'zhangsan'},{
    
    'age':'18'},{
    
    'sex','男'}]

@pytest.mark.parametrize('caseinfo',lis)
def test01(caseinfo):
    print(caseinfo)
	
if __name__ == '__main__':
    pytest.main(['-s','pytest-demo.py'])

(2)使用方式二类似于@unpack解包功能实现参数化

import pytest

lis = [('admin','123'),('admin1','123456')]
@pytest.mark.parametrize('username,password',lis)

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

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只站在树上的鸟儿,从来不会害怕树枝断裂,因为它相信的不是树枝,而是它自己的翅膀。与其每天担心未来,不如努力现在。成功的路上,只有奋斗才能给你最大的安全感。

努力是会上瘾的,特别是尝到甜头的时候,不努力也会上瘾,特别是习惯懒散了以后,把时间用在努力上才是正事。

最大的对手,往往不是别人,而是自己的懒惰。别指望撞大运,运气不可能永远在你身上,任何时候都要靠本事吃饭。你必须拼尽全力,才有资格说自己的运气不好。

猜你喜欢

转载自blog.csdn.net/shuang_waiwai/article/details/129497331