一:conftest.py和@pytest.fixture()结合使用实现全局的前置应用主要有以下特点:
1.conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改
2.用处可以在不同的py文件中使用同一个fixture
3.原则上conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作
总结:
setup/teardown,setup_class/teardown_class,它是作用于所有用例或所有的类
@pytest.fixture(),它的作用是既可以部分也可以全部前后置
conftest.py和@pytest.fixture()结合使用,作用于全局的前后置
实现局部的前置应用
测试用例的目录结构如下:
demo1-
test_func1.py
test_func2.py
conftest.py
conftest.py
demo1文件夹下包含三个py文件,分别是两个测试用例,和一个conftest.py文件
demo1文件夹内的conftest.py的内容如下:
import pytest
@pytest.fixture(scope='function',params=['alex1','alex2'],autouse=False)
def my_fixture(request):
print('这是前置内容')
yield request.param
print('这是后置内容')
test_func1.py的内容如下:
class Testdemo3():
def test_01(self,my_fixture,all_fixture):
print('这是test01',my_fixture,all_fixture)
def test_02(self,all_fixture,my_fixture):
print('这是test02',my_fixture,all_fixture)
外部的conftest.py的内容如下:
import pytest
@pytest.fixture()
def all_fixture():
print('这是全局前置')
yield
print('这是全局后置')
运行测试用例的结果如下:
testcase/demo1/test_func3.py::Testdemo3::test_01[alex1] 这是前置内容
这是全局前置
这是test01 alex1 None
PASSED这是全局后置
这是后置内容
testcase/demo1/test_func3.py::Testdemo3::test_01[alex2] 这是前置内容
这是全局前置
这是test01 alex2 None
PASSED这是全局后置
这是后置内容
testcase/demo1/test_func3.py::Testdemo3::test_02[alex1] 这是全局前置
这是前置内容
这是test02 alex1 None
PASSED这是后置内容
这是全局后置
testcase/demo1/test_func3.py::Testdemo3::test_02[alex2] 这是全局前置
这是前置内容
这是test02 alex2 None
PASSED这是后置内容
这是全局后置
从上面test01和test02中可以看到出入的全局fixture和局部fixture的实现结果,哪个在前面,先调用哪个,所以某种程度上,也是有一定执行顺序的,并不是全局conftest或者局部conftest先执行之类的。
二:下面说下pytest中conftest.py作用范围
一个测试工程下面可以有多个conftest.py文件,一般在工程根目录放一个conftest起到全局作用,在不同的测试子目录也可以放conftest,作用范围只在该层级以及以下目录生效。
例如上述中demo1下面的conftest.py,它的作用域就是这个demo1目录下面的所有testcase,而demo1文件夹外面的conftest.py,它的作用域就可以针对所有的测试用例。
所以,具体使用局部还是全局,按照实际情况自行决定。