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.

 

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

 

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

 

posted @ 2020-09-25 20:16  一名小测试  阅读(514)  评论(0编辑  收藏  举报