在@pytest.fixture(scope="xxx")中,scope的可选值有5个,以下是官网的描述
(资料图片仅供参考)
2 function级别的scope添加如下代码到pytest.ini,便于输出日志新建conftest.py文件,把fixture函数写入其中,便于后面fixture可以在多个py文件中的test函数中引用conftest.pypytest的fixture默认级别就是 funtion,因此可以不写scope参数test_fixture.py
执行结果
注意,两个test函数中,list对象的id是不同的,虽然他们的内容都是相同的,这说明在这两个test函数中,他们各自独立地执行了一次fixture,拿到了各自的list对象即the default scope, the fixture is destroyed at the end of the test
3 class级别的scope执行注意,每个class里面都有2个test函数,同一个class里面的test函数,输出的list对象是相同的,说明他们拿到的都是同一个list对象,生产list对象的fixture只执行了一次不同的class的test函数,输出的list对象的id是不同的,说明在执行第2个class时,fixture又执行了一次,生成一个新的list对象
即class: the fixture is destroyed during teardown of the last test in the class.
4 module级别的scopetest_fixture.py
test_fixture_2.py执行可以看到,同一个py文件里面,所有的test输出的list对象id是相同的,说明这些test共享了一个list对象不同的py文件,test输出的id对象是不同的,说明不同的py文件各自独立执行了fixture,拿到了各自独立的list对象
5 session级别的scopetest_fixture.py test_fixture_2.py内容不变执行可以看到,不同py文件的test函数,都输出相同id的list对象,说明不同py文件的test,都共享了同一个list对象,fixture在整个测试绘画期间只执行了一次即the fixture is destroyed at the end of the test session
6 package级别的scope首先我的目录结构如下两个conftest文件的内容都是相同的注意,每个目录下添加文件__init__.py,内容不用写。所谓package,就是包含__init__.py文件的目录test_fixture_2.py test_fixyure.py内容与之前相同test02目录下test_fixture_03.py在test01 test02 同级目录下执行 pytest -k "fixture" -s -v执行结果可以看到 test01目录下所有的test输出id是相同的,test02目录下的test输出的id是不同的
这事,其他内容不变,把test02目录下的conftest.py删除,把test01下的conftest.py移动到test01 test02的同级目录中再来执行这时,你会看到所有的输出id都是相同的这就有意思了,这里牵涉到一个conftest.py的范围的问题,conftest.py放在不同的目录下,它能影响的范围也是不同的