之前我们讲到用例前后置方法 [ setup 、teardown ] Pytest测试用例之setup与teardown方法(一) Pytest测试用例之setup与teardown方法(二) 可以实现在自动化测试用例执行前或执行后进行特定的操作
但是不足之处是 [ setup 、teardown ] 只满足在全局或者每条case前、后。不能满足A测试用例执行,B测试用例不执行,那么我们还有什么方法能够实现这自定义的场景呢
来看看我们今天的猪脚fixture
01前言
fixture优势
[ firture相对于setup与teardown来说应该有以下几点优势 ]
1.命名方式灵活,不限于setup与teardown这几个命名
2.conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
3.scope="module" 可以实现多个.py跨文件共享前置
4.scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
fixture介绍
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
"""使用装饰器标记fixture的功能
可以使用此装饰器(带或不带参数)来定义fixture功能。fixture功能的名称可以在以后使用
引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
:arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".
:arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
:arg autouse: 如果为True,则为所有测试激活fixture func 可以看到它。如果为False(默认值)则显式需要参考来激活fixture
:arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
:arg name: fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名
“fixture_ ”然后使用”@ pytest.fixture(name ='')“”。
实现场景:例如我们实际项目中登录有case执行前与case执行后俩种测试用例,那么我们该用什么方法去设计这种呢?
例如第一条测试用例需要执行登录,第二条测试用例不需要执行,第三条测试用例需要执行,看看实现的代码
# coding=utf-8
# authou:shichao
# python测试社区学习记录
import pytest
# 不带参数时默认scope='function' 如果@pytest.fixture()里面没有参数,那么默讣 scope=”
# function”,也就是此时的级别的 function,针对函数有效
@pytest.fixture()
def login():
print('前置进行输入账号密码登录')
def test_a1(login):
print('执行测试用例1,继承login函数、前置登录后,继续下一步操作')
def test_a2(): # 不传login
print('用例2 不需要登录,做其他动作')
def test_a3(login): # 不传login
print('执行测试用例3,继承login函数、 前置登录后,继续下一步操作')
if __name__ == '__main__':
pytest.main(['-s', 'test_fix_0708.py'])
运行结果
rootdir: F:\python3\python_code\Study\API_AutoTest_Pytest
collecting ... collected 3 items
test_fix_0708.py::test_a1 前置进行输入账号密码登录
PASSED [ 33%]执行测试用例1,继承login函数、前置登录后,继续下一步操作
test_fix_0708.py::test_a2 PASSED [ 66%]用例2 不需要登录,做其他动作
test_fix_0708.py::test_a3 前置进行输入账号密码登录
PASSED [100%]执行测试用例3,继承login函数、 前置登录后,继续下一步操作
============================== 3 passed in 0.02s ==============================
Process finished with exit code 0
总结:如果@pytest.fixture()里面没有参数,那么默认scope=”function”,也就是此时的级别的function,针对函数有效
上面一个案例是在同一个.py文件中,多个用例调用一个登录功能,如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登录写到用例里面去了。
此时应该要有一个配置文件,单独设计管理一些预置的操作场景,在pytest里面是默认读取conftest.py里面的配置
conftest.py配置需要注意以下点:
1.conftest.py配置脚本名称是固定的,不能改名称
2.conftest.py与运行的用例要在同一个pakage下,并且有init.py文件
3.不需要import导入 conftest.py,pytest用例会自动查找
以下分别是新建三个文件conftest.py、test_fix_0708_01.py、test_fix_0708_02.py
# coding =utf-8
# authou:shichao
# python测试社区记录#
'''
conftest.py 配置需要注意以下点:
conftest.py 配置脚本名称是固定的,丌能改名称
conftest.py 不运行的用例要在同一个 pakage 下,并且有
__init__.py 文件
不需要 import 导入 conftest.py,pytest 用例会自动查找
'''
import pytest
@pytest.fixture()
def login():
print('输入账号,密码先登录')
# coding=utf-8
import pytest
def test_a1(login):
print('执行测试用例1,继承login函数、前置登录后,继续下一步操作')
def test_a2():
print('执行测试用例2,不需要登录,继续下一步操作')
def test_a3(login):
print('执行测试用例3,继承login函数、前置登录后,,继续下一步操作')
if __name__ == '__main__':
pytest.main(['-s', 'test_fix_0708_01.py'])
# coding=utf-8
import pytest
def test_a4(login):
print("用例4:继承login函数、前置登录后,继续下一步操作")
def test_a5(): # 不传login
print("用例5:不需要登录,继续下一步操作")
if __name__ == "__main__":
pytest.main(["-s", "test_fix_0708_02.py"])
总结:单独运行test_fix1.py与test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来
fixture之conftest.py本期分享到这里简单告一段落,后期再总结分享,关注小编查看更多测试好文,学到各种测试小知识点
从0到1, 将APP自动化测试入个门 /《Linux 命令行大全》测试必备