pytest——fixture中各自参数的使用
@pytest.fixture(scope=“function”, ids=None, name=None, params=None, autouse=False)
- scope:“function”(default),“class”, “module”, “package” or “session” 这个不作细述“请点击这里查看”
- ids:字符串id的列表,每个id对应于参数,是测试id的一部分,如果没有提供id,它们将从参数自动生成标识。
- params:一个可选的参数列表,它将导致对fixture函数和使用它的所有测试的多次调用。当前参数在"request.param"中可用。
- name:可以理解成为这前置函数取个别名。
- autouse:为True的话就是开启,开启后范围的方法都会自动去执行
1、ids参数
1 # conftest.py 2 3 import pytest 4 5 6 @pytest.fixture(ids=['look', 'see', 'watch'], params=[1, 2, 3]) 7 def common_login(request): 8 yield request.param
用例调用:
# test_account_login.py import pytest @pytest.mark.usefixtures('common_login') class TestUserLogin: def test_01_user_login(self): 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 3 items test_account_login.py::TestUserLogin::test_01_user_login[look] PASSED test_account_login.py::TestUserLogin::test_01_user_login[see] PASSED test_account_login.py::TestUserLogin::test_01_user_login[watch] PASSED ============================== 3 passed in 0.04s ==============================
总结:ids参数的使用,得要和params参数一起才能发挥效果。生成一个标识
2、params参数
1 # conftest.py 2 3 import pytest 4 5 6 @pytest.fixture(params=[1, 2, 3]) 7 def common_login(request): 8 yield request.param
用例调用:
# test_account_login.py import pytest @pytest.mark.usefixtures('common_login') class TestUserLogin: def test_01_user_login(self): assert 1 == 1 if __name__ == '__main__': pytest.main(['-v', '-s', 'test_account_login.py'])
运行结果:
============================= test session starts ============================= collecting ... collected 3 items test_account_login.py::TestUserLogin::test_01_user_login[1] PASSED test_account_login.py::TestUserLogin::test_01_user_login[2] PASSED test_account_login.py::TestUserLogin::test_01_user_login[3] PASSED ============================== 3 passed in 0.02s ==============================
总结:params即可以给fixture作参数化操作,也可以作标识使用
3、name参数
1 # conftest.py 2 3 import pytest 4 5 6 @pytest.fixture(name='login', params=[1, 2, 3]) 7 def common_login(request): 8 yield request.param
用例调用:
# test_account_login.py import pytest @pytest.mark.usefixtures('login') class TestUserLogin: def test_01_user_login(self): assert 1 == 1 if __name__ == '__main__': pytest.main(['-v', '-s', 'test_account_login.py'])
运行结果:
============================= test session starts ============================= collecting ... collected 3 items test_account_login.py::TestUserLogin::test_01_user_login[A] PASSED test_account_login.py::TestUserLogin::test_01_user_login[B] PASSED test_account_login.py::TestUserLogin::test_01_user_login[C] PASSED ============================== 3 passed in 0.02s ==============================
总结:更换别名(为fixture重命名),可以更容易记清楚,不会记混,再也不用担心名字太长记不住了。
4、autouse参数
1 # test_package/conftest.py 2 3 4 import pytest 5 6 7 @pytest.fixture(name='login', params=['A', 'B', 'C'], autouse=True) 8 def common_login(request): 9 yield request.param
用例调用:
# test_package/test_account_login.py import pytest class TestUserLogin: def test_01_user_login(self, login): print(login) assert 1 == 1 if __name__ == '__main__': pytest.main(['-v', '-s', 'test_account_login.py'])
运行结果:
============================= test session starts ============================= collecting ... collected 3 items test_account_login.py::TestUserLogin::test_01_user_login[A] A PASSED test_account_login.py::TestUserLogin::test_01_user_login[B] B PASSED test_account_login.py::TestUserLogin::test_01_user_login[C] C PASSED ============================== 3 passed in 0.02s ==============================
总结:在当前作用域内的测试函数都运行该fixture。
该图中的红色部分就是当前作用域内,绿色部分就用不了
小小总结可能会解决你的问题,也可能解决不了你的问题,但还是希望对您有所帮助,感谢阅读,如有疑义,欢迎来扰!未完待续…
一直都在努力变好中,希望您也是,加油!