簡介:
fixture區別於unnitest的傳統單元測試(setup/teardown)有顯著改進:
1.有獨立的命名,並通過聲明它們從測試函數、模塊、類或整個項目中的使用來激活。
2.按模塊化的方式實現,每個fixture都可以互相調用。
3.fixture的范圍從簡單的單元測試到復雜的功能測試,可以對fixture配置參數,或者跨函數function,類class,模塊module或整個測試session范圍。
fixture可以當做參數傳入
定義fixture跟定義普通函數差不多,唯一區別就是在函數上加個裝飾器@pytest.fixture(),fixture命名不要以test開頭,跟用例區分開。fixture是有返回值得,沒有返回值默認為None。用例調用fixture的返回值,直接就是把fixture的函數名稱當做變量名稱。
# 作者 :admin import pytest @pytest.fixture() def test_01(): a = 5 return a def test_02(test_01): assert test_01 == 5 print("斷言成功") ============================= test session starts ============================= platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: E:\daima\Project_test\test_demo, inifile: plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0 collected 1 item test_demo_pytest_fixture.py 斷言成功 . ========================== 1 passed in 0.17 seconds ===========================
使用多個fixture
如果用例需要用到多個fixture的返回數據,fixture也可以返回一個元祖,list或字典,然后從里面取出對應數據。
# 作者 :admin import pytest @pytest.fixture() def test_01(): a = 5 b = 6 return (a, b) def test_02(test_01): a = test_01[0] b = test_01[1] assert a < b print("斷言成功") Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo ============================= test session starts ============================= platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: E:\daima\Project_test\test_demo, inifile: plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item test_demo_pytest_fixture.py .斷言成功 [100%] ========================== 1 passed in 0.01 seconds =========================== Process finished with exit code 0
fixture的作用范圍(scope)
ixture里面有個scope參數可以控制fixture的作用范圍:session>module>class>function
-function:每一個函數或方法都會調用
-class:每一個類調用一次,一個類中可以有多個方法
-module:每一個.py文件調用一次,該文件內又有多個function和class
-session:是多個文件調用一次,可以跨.py文件調用,每個.py文件就是module
代碼示例:
# 作者 :admin import pytest @pytest.fixture(scope="class") def test_01(): a = 5 b = 6 return (a, b) class TestNum: def test_02(self,test_01): a = test_01[0] b = test_01[1] assert a < b print("斷言成功") Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo ============================= test session starts ============================= platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: E:\daima\Project_test\test_demo, inifile: plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item test_demo_pytest_fixture.py .斷言成功 [100%] ========================== 1 passed in 0.02 seconds =========================== Process finished with exit code 0
調用fixture的三種方法
1.函數或類里面方法直接傳fixture的函數參數名稱
注釋:代碼詳見上圖
2.使用裝飾器@pytest.mark.usefixtures()修飾需要運行的用例
# 作者 :admin import pytest @pytest.fixture(scope="class") def test_01(): a = 5 b = 6 return (a, b) @pytest.mark.usefixtures("test_01") class TestNum: def test_02(self,test_01): a = test_01[0] b = test_01[1] assert a < b print("斷言成功") Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo ============================= test session starts ============================= platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: E:\daima\Project_test\test_demo, inifile: plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item test_demo_pytest_fixture.py .斷言成功 [100%] ========================== 1 passed in 0.02 seconds =========================== Process finished with exit code 0
3.疊加usefixtures
如果一個方法或者一個class用例想要同時調用多個fixture,可以使用@pytest.mark.usefixture()進行疊加。注意疊加順序,先執行的放底層,后執行的放上層。
# 作者 :admin import pytest @pytest.fixture(scope="class") def test_01(): a = 5 b = 6 return (a, b) @pytest.fixture(scope="class") def test_02(): print("你是第二個執行") @pytest.mark.usefixtures("test_02") @pytest.mark.usefixtures("test_01") class TestNum: def test_03(self,test_01): a = test_01[0] b = test_01[1] assert a < b print("斷言成功") Launching py.test with arguments E:/daima/Project_test/test_demo/test_demo_pytest_fixture.py in E:\daima\Project_test\test_demo ============================= test session starts ============================= platform win32 -- Python 3.7.2, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: E:\daima\Project_test\test_demo, inifile: plugins: allure-adaptor-1.7.10, html-1.22.0, metadata-1.8.0, rerunfailures-7.0collected 1 item test_demo_pytest_fixture.py 你是第二個執行 .斷言成功 [100%] ========================== 1 passed in 0.02 seconds =========================== Process finished with exit code 0