本篇接上一篇【python-pytest使用2-fixture】,在pytest中还有一种方式可以完成实现数据共享、测试用例的数据驱动等场景,这就是conftest.py,那么conftest怎么使用呢?
1. conftest.py 说明
conftest.py里可以实现数据的共享,包括参数、方法等,而在使用时不需要通过import来导入conftest,pytest会自动在用例py文件中识别同目录下的conftest.py里的通过@pytest.fixture装饰的方法。conftest使用时候需要配合fixture一块使用。
2.要知道conftest的用法,首先先得从目录结构看起,如下目录结构:
说明:
当根目录下的conftest.py中有fixture装饰器方法时,此装饰器将作用域整个项目;
当testDir目录下有conftest.py时,只作用于当前目录,即test_demo.py模块中的所有测试用例。
由目录可见:
A.test_case1.py可以用conftest.py-1、conftest.py-3、conftest.py-1中的fixture装饰方法,但不能用conftest.py-2
B.test_demo.py可以使用所有的conftest.py中fixture装饰方法
C.根据A.B示例可知这种使用关系是树结构继承的子孙可以用父辈的方法,父辈不能用子孙的。
3.Fixture和conftest的区别:
fixture适用于在同一个py文件中多个用例执行时的使用;
而conftest.py方式适用于多个py文件之间的数据共享。
4.代码案例
conftest.py文件:
import pytest
@pytest.fixture(scope="module",
params=([{"id":10,"name":"mike"},
{"id":20,"name":"bill"}]),name="test1") #
def funGlobal1(request):
print('这里是funGlobal1-别名test1的初始化')
id=request.param['id']
name=request.param['name']
# print("这里是funGlobal()")
return id,name
@pytest.fixture(scope="session",
params=([{"username":'admin',"pw":"111111"},
{"username":'root',"pw":"222222"},
{"username":'test',"pw":"333333"}]),name="login") #
def funGlobal2(request):
print('开始session全局初始化...')
username=request.param['username']
password=request.param['pw']
# print("这里是funGlobal()")
yield username,password
print('最后的销毁,运行结束了') @pytest.fixture(scope="function",
params=([{"id":10,"name":"globl3.1"}]),name="test2")
def funGlobal3(request):
print('这里是funGlobal3-别名test2的初始化')
id=request.param['id']
name=request.param['name']
# print("这里是funGlobal()")
def myteardown():
print('这里是funGlobal3-别名test2的销毁操作')
request.addfinalizer(myteardown)
return id,name
test_case.py文件:
import pytest,os
def testcase1(test1):
print("\n这里是类外部方法testcase1,调用了funGlobal()====={}".format(test1))
def testcase2():
print("这里是类外部方法testcase2\n")
class TestClass():
def testcase3(self,login):
print("这里是类内部方法testcase3----id:{}".format(login[0]))
print("这里是类内部方法testcase3----name:{}".format(login[1]))
@pytest.mark.usefixtures("test2")
def testcase4(self):
#testcase4 用了usefixtures打标签装饰,则运行时,有几个参数,就运行几次
print("这里是类内部方法testcase4")
if __name__=="__main__":
pytest.main(["-s", __file__])
文中为自己学习时笔记记录,有不恰当之处,欢迎大家指正,进行修改。