本文共 5263 字,大约阅读时间需要 17 分钟。
先看下 fixture 函数的定义:
使用装饰器标记fixture的功能 可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用 引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。 测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
def fixture(scope="function", params=None, autouse=False, ids=None, name=None): """ :arg scope: 可选四组参数:function(默认)、calss、module、package/session :arg params: 一个可选的参数列表,它将导致多个参数调用fixture函数和所有测试使用它。 :arg autouse: 如果为True,则fixture func将为所有测试激活可以看到它。如果为False(默认值),则需要显式激活fixture。 :arg ids: 每个参数对应的字符串id列表,因此它们是测试id的一部分。如果没有提供id,它们将从参数中自动生成。 :arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 “fixture_”然后使用”@ pytest.fixture(name =' ')”。 """
重点说下 scope 四组参数的意义:
function:每个方法(函数)都会执行一次。
class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
package/session:多个文件调用一次,可以跨 .py 文件。
在所需要调用的函数前面加个装饰器 @pytest.fixture()。举一个简单的例子:
1.firture相对于setup和teardown来说应该有以下几点优势:
例如这样的测试场景:宏哥这里就拿博客园举个例子:
测试用例1:需要登录博客园,发布随笔
测试用例2:不需要登录博客园,浏览文章
测试用例3:需要登录博客园,删除随笔
把一个函数定义为Fixture很简单,只能在函数声明之前加上“@pytest.fixture”。其他函数要来调用这个Fixture,只用把它当做一个输入的参数即可。
# coding=utf-8# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2020-1-09@author: 北京-宏哥Project:《带你装B,带你飞》pytest修仙之路4 - fixture简介 & yield'''# 3.导入模块# content of test_bjhg_class1.pyimport pytest# 不带参数时默认scope="function"@pytest.fixture(scope='function')def login(): print("登录博客园")def test_1(login): print('测试用例1,登录博客园之后发布随笔111')def test_2(): print('测试用例2,不需要登录博客园,浏览文章222')def test_3(login): print('测试用例2,登录博客园之后删除随笔333')if __name__ == "__main__": pytest.main(["-s", "test_bjhg_class1.py"])
运行代码后,控制台打印如下图的结果
下面是运行结果,test_1和test_3运行之前都调用了login,也就是login执行了两次。默认情况下,fixture是每个测试用例如果调用了该fixture就会执行一次的。
2.如果@pytest.fixture()里面没有参数,那么默认scope=”function”,也就是此时的级别的function,针对函数有效。
conftest.py配置脚本名称是固定的,不能改名称
conftest.py与运行的用例要在同一个pakage下,并且有init.py文件
不需要import导入 conftest.py,pytest用例会自动查找
1.上面一个测试场景是在同一个.py文件中,多个用例调用一个登陆功能,如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登陆写到用例里面去了。
此时应该要有一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置# coding=utf-8# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2020-1-09@author: 北京-宏哥Project:《带你装B,带你飞》pytest修仙之路4 - fixture简介 & yield'''# 3.导入模块# content of conftest.pyimport pytest# 不带参数时默认scope="function"@pytest.fixture(scope='function')def login(): print("登录博客园")
# coding=utf-8# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2020-1-09@author: 北京-宏哥Project:《带你装B,带你飞》pytest修仙之路4 - fixture简介 & yield'''# 3.导入模块# content of test_fix1.pyimport pytestdef test_1(login): print('测试用例1,登录博客园之后发布随笔111')def test_2(): print('测试用例2,不需要登录博客园,浏览文章222')def test_3(login): print('测试用例2,登录博客园之后删除随笔333')if __name__ == "__main__": pytest.main(["-s", "test_fix1.py"])
运行代码后,控制台打印如下图的结果
# coding=utf-8# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2020-1-09@author: 北京-宏哥Project:《带你装B,带你飞》pytest修仙之路4 - fixture简介 & yield'''# 3.导入模块# content of test_fix2.pyimport pytestdef test_4(login): print('测试用例4,登录博客园之后修改头像444')def test_5(): print('测试用例5,不需要登录博客园,浏览首页555')def test_6(login): print('测试用例6,登录博客园之后保存随笔666')if __name__ == "__main__": pytest.main(["-s", "test_fix2.py"])
运行代码后,控制台打印如下图的结果
单独运行test_fix1.py和test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来了
如果你的程序出现了下面的错误,就是开始忘记添加‘import pytest',所以不要忘记哦。
=================================== ERRORS ====================================_________________ ERROR collecting test_fixture_decorator.py __________________test_fixture_decorator.py:2: in@pytest.fixture()E NameError: name 'pytest' is not defined!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!=========================== 1 error in 0.36 seconds ===========================
好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。有问题加群交流讨论!!!
您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波 推荐 不要忘记哦!!!
别忘了点 推荐 留下您来过的痕迹
转载地址:http://uefuz.baihongyu.com/