前言
1、這是一個pytest第三方插件,主要解決用例之間的依賴關系。如果依賴的上下文測試用例失敗后續的用例會被標識為跳過執行,相當於執行了 pytest.mark.skip
2、dependency可作用的范圍有:session
、package
、module
、class
3、安裝 pip install pytest-dependency
4、官方示例:pytest-denpendency
基本用法
在TestCase類下面編寫的用例:
1、首先在用例開始的位置打上一個裝飾器 @pytest.mark.dependency() ,這是代表這條用例作為主條件,如果這條用例失敗,關聯它的用例會跳過執行。
2、在被關聯的用例上,也打上帶參數的裝飾器@pytest.mark.dependency(),depends
接受的參數是關聯的依賴用例名。
3、在 depends 也可以用別名的方式指定用例名。
①Test類下函數路徑實現方式【通過指定測試類下面的測試用例方法(相當於使用nodeid即測試用例路徑的方式)】
運行結果:
②函數名依賴實現方式【通過指定需要依賴測試函數的測試方法名】
③通過別名指定方式【通過為指定的依賴設置依賴名name(即為被依賴的用例設置別名)】
定義依賴范圍
官方API詳解
我們可以看到scope可接受四種參數定義的類型('session','package','module'或'class')
scope='class'
- 作用於所屬的類,外部類不會被關聯。
運行結果:
scope='module'
- 不傳遞 scope參數即默認參數是 module ,作用於當前py文件。
- 只會查找當前文件的符合條件的文件名,類里同名的方法不會被依賴
運行結果:
scope='package'
- 作用於當前目錄同級的依賴函數,跨目錄無法找到依賴的函數。
運行結果:
scope='session'
- 作用域全局,可跨目錄調用。但被依賴的用例必須先執行,如例子中的test01,否則用例會執行跳過!!!!
運行結果:
注意
①如果依賴的上下文測試用例使用 @pytest.mark.parametriz 進行用例參數化后,使用測試函數的方法名依賴方式無法實現測試用例的依賴。【因為通過 .pytest_cache 文件我們知道測試用例的nodeid為 路徑+用例參數化的參數 ,當依賴的上下文測試用例中使用用例參數化時,用例的nodeid已經不在單純的只是具體到測試方法,而是具體到改用例的參數】
②我們在使用測試方法依賴的時候,可以在依賴參數化用例的同時,將被依賴測試方法的完整的nodid傳到依賴測試方法的depnds入參中,如下正常①。
③或者為依賴和被依賴的測試方法使用指定別名的方式進行上下文用例的依賴,如下正常②。
④用例之間的依賴情況一般出現於類似業務主流程的測試腳本中(即一個模塊里面可能有多個測試方法,並且測試方法之間具有業務關聯關系),所以一般來說用例的參數化中只有一個用例(即該測試方法雖然進行了用例參數化,但還是相當於只是一條用例:例如產生一條具體的測試數據)。
⑤當然,如果被依賴的測試方法中用例參數化后形成了多條測試用例,那么就有多條測試用例被依賴,且被依賴的測試用例的執行結果全部為PASSED時,依賴的測試方法才會執行,否則依賴的測試方法仍然會被跳過。
例如:
非正常:
test_d測試用例依賴test_a測試用例,test_b測試用例依賴test_d測試用例,test_c測試用例依賴test_b測試用例。
import pytest from tools.common.log_process import * @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency() @pytest.mark.parametrize('data', [1]) def test_a(data): # data = 1 assert data == 1 @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_a']) def test_d(): assert True @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_d']) def test_b(): assert 'ooo' == 'oo' @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_b']) def test_c(): assert 'lll' is 'lll'
運行結果:
正常①:
# -*- encoding:utf-8 -*- import pytest from tools.common.log_process import * @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency() @pytest.mark.parametrize('data', [1]) def test_a(data): # data = 1 assert data == 1 @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_a[1]']) def test_d(): assert True @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_d']) def test_b(): assert 'ooo' == 'oo' @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['test_b']) def test_c(): assert 'lll' is 'lll'
運行結果:
正常②
# -*- encoding:utf-8 -*- import pytest from tools.common.log_process import * @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(name='a') @pytest.mark.parametrize('data', [1]) def test_a(data): # data = 1 assert data == 1 @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(name='b', depends=['a']) def test_d(): assert True @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(name='c', depends=['b']) def test_b(): assert 'ooo' == 'oo' @record(os.path.basename(__file__).split('.')[0]) @pytest.mark.dependency(depends=['c']) def test_c(): assert 'lll' is 'lll'
運行結果: