fixture可以放在单独的测试文件里,但是如果我们希望共享fixture,就需要在公共目录下新建个conftest.py文件,并将fixture放在里面。
图片中我们新建的conftest.py文件,只能是test_package文件夹下的.py文件及子级的文件夹下的.py文件可以使用。最上面的绿色部分是不能使用的,这是因为作用域的问题,所以也引申出当前作用域下的.py文件是可以共享当前的conftest.py。
# exercise/test_package/conftest.py
import pytest
@pytest.fixture(name='login')
def common_login():
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了。
就像下面这样(当前作用域下使用):
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'])
也可以是下面这样(当前作用域下使用):
import pytest
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'])
如果你这个测试用例不需要共享中的fixture,也可以直接在.py文件中定义一个fixture共享当前的.py文件使用
# exercise/test_package/test_account_login.py
import pytest
@pytest.fixture()
def account():
yield '我是当前.py文件中的fixture'
class TestUserName:
def test_01_account_login(self, account):
print(account)
assert 1 == 1
if __name__ == '__main__':
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.
小小总结可能会解决你的问题,也可能解决不了你的问题,但还是希望对您有所帮助,感谢阅读,如有疑义,欢迎来扰!未完待续…
一直都在努力变好中,希望您也是,加油!