书籍来源:房荔枝 梁丽丽《pytest框架与自动化测试应用》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:pytest框架进阶自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客
fixture允许测试用例可以轻松地接收和处理特定的需要预初始化操作的应用对象,而不用过分关心导入/设置/清理的细节,这是一个典型的依赖注入的实践,其中,fixture扮演着注入者(injector)的角色,而测试用例扮演着消费者(client)的角色。
测试用例执行时,有些模块必须先执行,这样才能进行后续的测试,但并不是所有的模块都是如此。以前使用setup的方式把先执行的用例放在setup中,这样所有测试方法都先执行setup方法,但有些测试方法并不需要。fixture的依赖注入功能可以帮你灵活解决此类问题。
最典型的使用场景:
登录功能,有些功能需要登录才能使用,例如支付功能和查看购物车,而浏览商品功能不需要登录。fixture实现步骤如下:
(1)导入pytest。
(2)创建login()函数。
(3)在login()函数上加@pytest.fixture()。
(4)在要使用的测试方法中传入(登录函数名称),也就是先执行login()函数再执行本测试方法。
(5)不传入参数表明不需要登录,此时可以直接执行测试方法。
代码如下:
import pytest
@pytest.fixture()
def login():
print("\n用户名linda密码登录!")
def test_cart(login):
print('\n用例1,登录后执行查看购物车其他功能1')
def test_find_goods():
print('\n用例2,不登录,执行浏览商品功能2')
def test_pay(login):
print('\n用例3,登录后执行支付功能3')
执行结果如下:
首先login()函数没有以test_开头,所以不执行。
执行用例test_cart时,发现参数是login,就开始从本用例中查找是否有这个参数或函数。找到login()的函数后,执行它,返回值传入test_cart,之后再执行test_cart测试函数。
执行用例test_find_goods时,未发现参数,直接执行测试用例2。
执行用例test_pay时,发现参数是login,就开始从本用例中查找是否有这个参数或函数。找到login()的函数后,执行它,之后再执行test_pay测试函数。
D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture.py
Testing started at 10:59 ...
Launching pytest with arguments D:/SynologyDrive/CodeLearning/WIN/pytest-book/src/chapter-3/test_fixture.py in D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-3
============================= test session starts =============================
platform win32 -- Python 3.7.7, pytest-5.4.1, py-1.11.0, pluggy-0.13.1 -- D:\SynologyDrive\CodeLearning\WIN\pytest-book\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\SynologyDrive\CodeLearning\WIN\pytest-book
collecting ... collected 3 items
test_fixture.py::test_cart
用户名linda密码登录!
PASSED [ 33%]
用例1,登录后执行查看购物车其他功能1
test_fixture.py::test_find_goods PASSED [ 66%]
用例2,不登录,执行浏览商品功能2
test_fixture.py::test_pay
用户名linda密码登录!
PASSED [100%]
用例3,登录后执行支付功能3
============================== 3 passed in 0.02s ==============================
Process finished with exit code 0
注意:@pytest.fixture()中不带参数时范围默认scope="function",也就是共享数据为函数级,就是在本用例函数中搜索是否有需要的共享数据。“\n”是换行符。