pytest——conftest.py共享fixture及使用fixture执行配置
fixture可以放在单独的测试文件里,但是如果我们希望共享fixture,就需要在公共目录下新建个conftest.py文件,并将fixture放在里面。
图片中我们新建的conftest.py文件,只能是test_package文件夹下的.py文件及子级的文件夹下的.py文件可以使用。最上面的绿色部分是不能使用的,这是因为作用域的问题,所以也引申出当前作用域下的.py文件是可以共享当前的conftest.py。
1 # exercise/test_package/conftest.py 2 3 import pytest 4 5 6 @pytest.fixture(name='login') 7 def common_login(): 8 yield '我是conftest的fixture...'
# exercise/test_package/test_account_login.py import pytest @pytest.mark.usefixtures('login') class TestAccountLogin: def test_01_account_login(self, login): print(login) assert 1 == 1 if __name__ == '__main__': pytest.main(['-v', '-s', 'test_account_login.py'])
D:\python_env\Scripts\python.exe F:/TESTING/exercise/test_package/test_account_login.py ============================= test session starts ============================= collecting ... collected 1 item test_account_login.py::TestAccountLogin::test_01_account_login 我是conftest的fixture... PASSED ============================== 1 passed in 0.07s ==============================
上面的一段代码就是引用了当前作用域下的conftest.py后运行的结果。
需要注意的一点是,代码在运行时会自动去找fixture,先从自身开始找(当前运行的.py文件),找不到就会再去上一层找,你引用的fixture实在是找不到了,就会抛出错误在控制台。
conftest.py虽然是python的模块,但它是不能被测试文件导入的,也就是说import conftest.py或者from conftest.py import xxx是不被允许的,这就时候我们就要使用usefixtures(xx)来调用fixture了。
就像下面这样(当前作用域下使用):
1 import pytest 2 3 4 @pytest.mark.usefixtures('login') 5 class TestAccountLogin: 6 7 def test_01_account_login(self, login): 8 print(login) 9 assert 1 == 1 10 11 12 if __name__ == '__main__': 13 pytest.main(['-v', '-s', 'test_account_login.py'])
也可以是下面这样(当前作用域下使用):
1 import pytest 2 3 4 class TestAccountLogin: 5 6 def test_01_account_login(self, login): 7 print(login) 8 assert 1 == 1 9 10 11 if __name__ == '__main__': 12 pytest.main(['-v', '-s', 'test_account_login.py'])
如果你这个测试用例不需要共享中的fixture,也可以直接在.py文件中定义一个fixture共享当前的.py文件使用
1 # exercise/test_package/test_account_login.py 2 3 4 import pytest 5 6 7 @pytest.fixture() 8 def account(): 9 yield '我是当前.py文件中的fixture' 10 11 12 13 class TestUserName: 14 15 def test_01_account_login(self, account): 16 print(account) 17 assert 1 == 1 18 19 20 if __name__ == '__main__': 21 pytest.main(['-v', '-s', 'test_account_login.py'])
定义的 account 只能被红色箭头所指的 test_account_login.py 使用, 如果绿色箭头所指的 test_user_name.py 使用就会报下面的错误:
D:\python_env\Scripts\python.exe F:/TESTING/exercise/test_package/test_user_name.py ============================= test session starts ============================= collecting ... collected 1 item test_user_name.py::TestUserName::test_01_user_name ERROR =================================== ERRORS ==================================== ______________ ERROR at setup of TestUserName.test_01_user_name _______________ file F:\TESTING\exercise\test_package\test_user_name.py, line 15 def test_01_user_name(self, account): E fixture 'account' not found > available fixtures: _verify_url, base_url, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, cov, doctest_namespace, extra, login, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory > use 'pytest --fixtures [testpath]' for help on them.
小小总结可能会解决你的问题,也可能解决不了你的问题,但还是希望对您有所帮助,感谢阅读,如有疑义,欢迎来扰!未完待续…
一直都在努力变好中,希望您也是,加油!