我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。
目录
1.fixture的模块化
1.1介绍
除了在测试函数中使用fixture,fixture函数本身也可以使用其他fixture。这有助于您的夹具的模块化设计,并允许在许多项目中重复使用特定于框架的夹具.例如:
我们可以将一些公共操作抽取出来,如我们需要用到5个用户信息,在多个地方需要用到,然后我们就可以抽取出一个fixture函数,对这5个用户信息进行管理.
再或者我们可以把大部分前置后置操作通过引入fixture的方式抽取,统一进行管理
1.2示例代码
文件结构:
fixtures
open_chrome.py
import pytest
@pytest.fixture()
def open_chrome():
print("打开浏览器")
yield
print("关闭浏览器")
test_demo.py
# 这里必须引入,不引入就会报错
from fixtures.open_chrome import open_chrome
def test_demo(open_chrome):
print("测试用例")
1.3 运行结果
1.4结果分析
我们可以看到,我们单独定义了一个fixtrues包,用于管理我们所有的fixture,讲fixture进行模块化管理,这样我们如果有公共的fixture或者函数的前置都可以提取到这个包下面进行管理.
注意:我们在使用这些包的时候需要引入,如果不引入就会报错
错误示例:
# from fixtures.open_chrome import open_chrome
def test_demo(open_chrome):
print("测试用例")
2.在类和模块中使用fixture usefixtures
2.1介绍
前面我们介绍了使用fixture的其中一个方法,就是通过参数的方式去请求fixture函数.但我们还有另外一种方法,就是不需要直接在参数中去访问fixture对象.那就是通过usefixtures的方式去请求fixtrue函数.
2.2代码示例
文件名: test_demo.py
import pytest
@pytest.fixture
def open_chrome():
print("打开浏览器")
yield
print("关闭浏览器")
@pytest.mark.usefixtures('open_chrome')
def test_demo():
print("测试用例")
@pytest.mark.usefixtures('open_chrome')
class TestDemo(object):
def test_demo01(self):
print("测试用例01")
def test_demo02(self):
print("测试用例02")
2.3运行结果
2.4结果分析
我们可以看到,我们通过usefixtures引入fixture一样可以请求成功,那么它与参数方式的引入有什么区别呢?
1.通过参数方式请求fixture是可以拿到返回值的,而通过usefixtures请求fixture是拿不到返回值的.
2.参数方式不能用在类中,只能在类中的各函数都写上请求参数,但用usefixtures是可以在类上使用的,然后根据作用域来决定执行次数,如果是函数级别的,那就是类下有多少个函数就执行多少次,如果是类级别的,那就执行一次
2.5usefixtures请求多个fixture函数
我们直接通过代码来展示
- 示例代码
文件名: test_demo.py
import pytest
@pytest.fixture()
def open_chrome():
print("打开浏览器")
yield "driver"
print("关闭浏览器")
@pytest.fixture
def login():
print("登陆")
yield "token"
print("退出登录")
@pytest.mark.usefixtures('open_chrome', "login")
def test_demo():
print("测试用例")
- 运行结果
- 分析结果
usefixtures请求多个fixture函数和参数方式差不多,有多少个fixtrue函数就写多少个字符串,但需要注意的名字必须一致,还有就是要注意顺序.执行顺序也和参数化一样,从左往右依次执行(排除执行第一个就把第二个先执行了的情况)
2.6多个usefixtures去分别调用fixture
我们直接通过代码来展示
- 示例代码
文件名: test_demo.py
import pytest
@pytest.fixture()
def open_chrome():
print("打开浏览器")
yield "driver"
print("关闭浏览器")
@pytest.fixture
def login():
print("登陆")
yield "token"
print("退出登录")
@pytest.mark.usefixtures("login")
@pytest.mark.usefixtures('open_chrome')
def test_demo():
print("测试用例")
- 运行结果
- 结果分析
执行的结果和2.5差不多,但需要注意顺序,放在最下面的先执行,最上面的后执行,执行顺序是从下往上.但更推荐使用2.5这种方式,装饰器写多了也并不太好看,查看执行顺序也麻烦.