Time will tell.
一、fixture 简介
fixture
是 pytest 的精髓所在,类似 unittest 中setup/teardown
这种前后置东西。但比它们要强大、灵活很多,它的优势是可以跨文件共享。
fixture
的目的是提供一个固定基线,在该基线上测试可以可靠地和重复地执行。fixture
提供了区别于传统单元测试有显著改进:
- 有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
- 按模块化的方式实现,每个
fixture
都可以互相调用。 fixture
的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture
和测试用例进行参数化,或者跨函数 function 、类class、模块 module 或整个测试会话 sessio 范围。
二、用途
1、做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture
来实现。
2、测试用例的前置条件可以使用fixture
实现。
3、支持经典的xunit fixture
,像 unittest 使用的setup
和teardown
。
4.、fixture可以实现 unittest 不能实现的功能,比如 unittest 中的测试用例和测试用例之间是无法传递参数和数据的,但是
fixture`却可以解决这个问题。
三、fixture 作为参数传入
1、定义fixture
跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture()
,fixture
命名不要用test_
开头,跟用例区分开。用例才是test_
开头的命名。
2、fixture
是可以有返回值的,如果没return
默认返回None
。用例调用fixture
的返回值,直接就是把fixture
的函数名称当成变量传入。
3、fixture
装饰器里的scope
有四个级别的参数:function(默认)、class、module or session 。
4、除scope
之外,还有 params、autouse、ids、name 等。
5、fixture
可以有返回值,如果没有return
,默认会是None
;用例调用fixture
的返回值,就是直接把fixture
的函数名称作为参数传入。
6、fixture
可以返回一个元组、列表或字典。
7、test_
用例可传单个、多个fixture
参数。
8、fixture
与fixture
间可相互调用。
'''
fixture可以返回一个元组、列表或字典
'''
@pytest.fixture()
def user():
print("=====打印装饰器函数=====")
username='wangli'
psw=123456
assert username=="wangli"
assert psw == 123456
return username,psw
def test_login(user):
print(user)
assert user[0]=="wangli"
assert user[1] == 123456
if __name__=="__main__":
pytest.main(["-s","test03.py"])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 1 item
test03.py =====打印装饰器函数=====
('wangli', 123456)
.
============================== 1 passed in 0.16s ==============================
Process finished with exit code 0
'''
test_用例可传单个、多个fixture参数
'''
@pytest.fixture()
def username():
print("=====打印username装饰器函数=====")
username='wangli'
assert username=="wangli"
return username
@pytest.fixture()
def psw():
print("=====打印psw装饰器函数=====")
psw=123456
assert psw==123456
return psw
def test_login(username,psw):
print(username,psw)
assert username=="wangli"
assert psw == 123456
if __name__=="__main__":
pytest.main(["-s","test03.py"])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test