xUnit style 結構的 fixture用於初始化測試函數, pytest fixture是對傳統的 xUnit 架構的setup/teardown功能的改進。pytest fixture爲測試準備一個良好的測試環境,測試函數使用的每一個 fixture一般有一個參數(以 fixture 命名),測試函數經過參數訪問它們。本文將介紹pytest fixture的一些基本用法。html
import pytest @pytest.fixture() def login(): print("登陸") return 8 class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n開始執行測試用例2") print(login) assert 2 + login == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
test_case2須要調用login方法(或者獲取login的返回值),pytest 將會尋找並調用@pytest.fixture
標記的login() 方法。python
結果:session
PASSED [ 33%] 開始執行測試用例1 登陸 PASSED [ 66%] 開始執行測試用例2 8 PASSED [100%] 開始執行測試用例3
在測試過程當中,多個測試文件可能都要調用 fixture 函數,能夠將其移動到 conftest.py 文件中。conftest.py 文件中的 fixture 函數不須要在測試函數中導入,能夠被 pytest 自動識別,查找順序從測試類開始,而後是測試模塊,而後是 conftest.py 文件,最後是內置插件和第三方插件。架構
conftest.py :框架
import pytest @pytest.fixture() def login(): print("登陸") return 8
測試用例:函數
import pytest class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n開始執行測試用例2") print(login) assert 2 + login == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:測試
PASSED [ 33%] 開始執行測試用例1 登陸 PASSED [ 66%] 開始執行測試用例2 8 PASSED [100%] 開始執行測試用例3
使用yield關鍵字能夠實現setup/teardown的功能,在yield關鍵字以前的代碼在case以前執行,yield以後的代碼在case運行結束後執行插件
import pytest @pytest.fixture() def login(): print("登陸") yield print("退出登陸") class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n開始執行測試用例2") assert 2 + 8 == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:code
PASSED [ 33%] 開始執行測試用例1 登陸 PASSED [ 66%] 開始執行測試用例2 退出登陸 PASSED [100%] 開始執行測試用例3
addfinalizer也能夠實現環境的清理,實現與yield方法相同的效果,跟yield不一樣的是須要註冊做爲終結器使用的函數。htm
import pytest @pytest.fixture() def login(request): print("登陸") def demo_finalizer(): print("退出登陸") # 註冊demo_finalizer爲終結函數 request.addfinalizer(demo_finalizer) class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n開始執行測試用例2") assert 2 + 8 == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:
PASSED [ 33%] 開始執行測試用例1 登陸 PASSED [ 66%] 開始執行測試用例2 退出登陸 PASSED [100%] 開始執行測試用例3
fixture 做用範圍能夠爲module、class、session和function,默認做用域爲function。
import pytest @pytest.fixture(scope="function") def login(): print("登陸...") class Test_Demo(): def test_case1(self, login): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self, login): print("\n開始執行測試用例2") assert 2 + 8 == 10 def test_case3(self, login): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:
登陸... PASSED [ 33%] 開始執行測試用例1 登陸... PASSED [ 66%] 開始執行測試用例2 登陸... PASSED [100%] 開始執行測試用例3
一個class裏面多個用例都調用了此fixture,那麼只在class裏全部用例開始前執行一次
import pytest @pytest.fixture(scope="class") def login(): print("登陸...")
結果:
登陸... PASSED [ 33%] 開始執行測試用例1 PASSED [ 66%] 開始執行測試用例2 PASSED [100%] 開始執行測試用例3
autouse設置爲True時,自動調用fixture功能。因爲默認做用域爲function,不指定scope則每一個方法都會調用fixture方法。
import pytest @pytest.fixture(autouse=True) def login(): print("登陸...") class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self): print("\n開始執行測試用例2") assert 2 + 8 == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:
登陸... PASSED [ 33%] 開始執行測試用例1 登陸... PASSED [ 66%] 開始執行測試用例2 登陸... PASSED [100%] 開始執行測試用例3
在測試方法上加@pytest.mark.usefixtures()
import pytest @pytest.fixture() def login(): print("登陸...") @pytest.mark.usefixtures("login") class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 1 + 1 == 2 def test_case2(self): print("\n開始執行測試用例2") assert 2 + 8 == 10 def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:
登陸... PASSED [ 33%] 開始執行測試用例1 登陸... PASSED [ 66%] 開始執行測試用例2 登陸... PASSED [100%] 開始執行測試用例3
若是多條用例都須要調用相同參數,能夠將fixture函數參數化。fixture 函數將執行每一個參數值,fixture經過固定參數request傳遞。
import pytest @pytest.fixture(scope="module", params=[ [1, 1, 2], [2, 8, 10], [99, 1, 100] ]) def data(request): yield request.param class Test_Demo(): def test_case1(self): print("\n開始執行測試用例1") assert 2 + 8 == 10 def test_case2(self, data): print("\n開始執行測試用例2") assert data[0] + data[1] == data[2] def test_case3(self): print("\n開始執行測試用例3") assert 99 + 1 == 100 if __name__ == '__main__': pytest.main()
結果:
PASSED [ 20%] 開始執行測試用例1 PASSED [ 40%] 開始執行測試用例2 PASSED [ 60%] 開始執行測試用例2 PASSED [ 80%] 開始執行測試用例2 PASSED [100%] 開始執行測試用例3
文章標題:Pytest測試框架(三):pytest fixture 用法
本文做者:hiyo
本文連接:https://www.cnblogs.com/hiyong/p/14163280.html 歡迎關注公衆號:「測試開發小記」及時接收最新技術文章!