Fixture 特点及优势
1、命令灵活:相当于setup,teardown,但是可以自定义命名
2、数据共享:在 conftest.py 配置⾥写⽅法可以实现数据共享,不需要 import 导⼊。可以跨⽂件共享
3、scope 的层次及神奇的 yield 组合相当于各种 setup 和 teardown
4、实现参数化
Fixture 在自动化中的应用- 基本用法
- 场景:
测试⽤例执⾏时,有的⽤例需要登录才能执⾏,有些⽤例不需要登录。
setup 和 teardown ⽆法满⾜。fixture 可以。默认 scope(范围)function - 使用步骤:
1.导⼊ pytest
2.在登陆的函数上⾯加@pytest.fixture()
3.在要使⽤的测试⽅法中传⼊(登录函数名称),就先登陆
4.不传⼊的就不登录直接执⾏测试⽅法。
import pytest
@pytest.fixture()
def login():
print("登录")
def test_search():
pass
def test_cart(login):
print("加购")
def test_order(login):
print("下单")
Fixture 在自动化中的应用 - 作用域
定义某功能的fixture,尽量避免test_开头
import pytest
@pytest.fixture(scope="module")
#@pytest.fixture(scope="class")
def login():
print("登录")
def test_search():
pass
def test_cart(login):
print("加购")
def test_order(login):
print("下单")
class TestDemo:
def test_case1(self, login):
print("case1")
Fixture 在自动化中的应用 - yield 关键字
- 场景:
你已经可以将测试⽅法【前要执⾏的或依赖的】解决了,测试⽅法后销毁清除数据的要如何进⾏呢? - 解决:
通过在fixture 函数中加⼊ yield 关键字,yield 是调⽤第⼀次返回结果,第⼆次执⾏它下⾯的语句返回。 - 步骤:
1.在@pytest.fixture(scope=module)。
2.在登陆的⽅法中加 yield,之后加销毁清除的步骤
"""
@pytest.fixture()
def fixture_name():
setup操作
yield返回值
teardown操作
"""
@pytest.fixture(scope="module")
def login():
print("登录")
yield
print("退出")
def test_order(login):
print("下单")
@pytest.fixture(scope="module")
def login():
print("登录")
token = "212332ewee"
name = "zizi"
yield token,name# 相当于return,可以一个或多个参数,逗号分隔
print("退出")
def test_cart(login):
token,name = login
print(f"token:{login},name:{name}")
print("加购")
Fixture 在自动化中的应用 - 数据共享conftest.py
- 场景:
你与其他测试⼯程师合作⼀起开发时,公共的模块要在不同⽂件中,要在⼤家都访问到的地⽅。 - 解决:
使⽤ conftest.py 这个⽂件进⾏数据共享,并且他可以放在不同位置起着不同的范围共享作⽤。 - 前提:
conftest ⽂件名是不能换的
放在项⽬根目录下,全局数据共享 - 执⾏:
系统执⾏到参数 login 时先从本模块中查找是否有这个名字的变量,之后在 conftest.py 中找是否有引用。
使用时conftest.py时不需要导包,直接用
Fixture 在自动化中的应用 - 自动应用
- 场景:
不想原测试⽅法有任何改动,或全部都⾃动实现⾃动应⽤,没特例,也都不需要返回值时可以选择⾃动应⽤ - 解决:
使⽤ fixture 中参数 autouse=True 实现 -
步骤:
在⽅法上⾯加 @pytest.fixture(autouse=True)
Fixture 在自动化中的应用 -参数化
- 场景:
测试离不开数据,为了数据灵活,⼀般数据都是通过参数传的 - 解决:
fixture 通过固定参数 request 传递(request内置的) - 步骤:
在 fixture 中增加@pytest.fixture(params=[1, 2, 3, ‘linda’])
在⽅法参数写 request,方法体里面使用 request.param 接收参数
import pytest
@pytest.fixture(params=["selenum","appium"])
def login(request):
print(f"用户名{request.param}")
return request.param
def test_case1(login):
print(f"test1数据为{login}")