pytest【conftest.py共享fixture及使用fixture执行配置】


fixture可以放在单独的测试文件里,但是如果我们希望共享fixture,就需要在公共目录下新建个conftest.py文件,并将fixture放在里面。
pytest【conftest.py共享fixture及使用fixture执行配置】_第1张图片
图片中我们新建的conftest.py文件,只能是test_package文件夹下的.py文件及子级的文件夹下的.py文件可以使用。最上面的绿色部分是不能使用的,这是因为作用域的问题,所以也引申出当前作用域下的.py文件是可以共享当前的conftest.py。

pytest【conftest.py共享fixture及使用fixture执行配置】_第2张图片

# 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'])

pytest【conftest.py共享fixture及使用fixture执行配置】_第3张图片
定义的 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.

小小总结可能会解决你的问题,也可能解决不了你的问题,但还是希望对您有所帮助,感谢阅读,如有疑义,欢迎来扰!未完待续…

一直都在努力变好中,希望您也是,加油!

pytest【conftest.py共享fixture及使用fixture执行配置】_第4张图片

你可能感兴趣的:(pytest,python,软件测试)