? ? ?pytest提供了豐富的插件來擴展其功能,本章介紹插件pytest-order,用于自定義pytest測試用例的執行順序。pytest-order是插件pytest-ordering的一個分支,但是pytest-ordering已經不再維護了,建議大家直接使用pytest-order。
官方文檔:
https://pytest-order.readthedocs.io/en/stable/usage.html
pytest-order官方顯示的python和pytest版本限制:
- pytest-order適用于 Python 3.7 - 3.12:
- 對于 Python 3.9 之前的所有版本,pytest 版本 >= 5.0.0
- 對于 Python >= 3.10,pytest >= 6.2.4。
默認情況下的執行順序
文件間執行順序:
pytest會首先掃描當前目錄及子目錄下的所有文件,查找以test_開頭(或包含_test)的文件以及測試模塊(如test_*.py或*_test.py)。對于找到的測試文件,它們將按照文件名的ASCII碼順序執行,即數字、大寫英文字母、小寫英文字母的順序。
文件內執行順序:
在每個測試文件中,pytest會按照測試用例(即測試函數或測試方法)定義的順序執行。如果使用了類組織測試用例,那么類內部的測試用例將按照定義的順序執行。
舉例:測試文件中函數測試用例順序是4,5,1,2,3,測試類中的測試用例順序也是4,5,1,2,3。
測試用例執行后,按照4,5,1,2,3的順序執行。
pytest-order安裝
使用pip命令安裝:?pip install?pytest-order?(安裝在pytest工程所運行的python環境,python的安裝目錄或者虛擬環境目錄,可以參考之前文章查看運行環境pycharm配置pytest運行環境)
通過pycharm安裝:打開設置,按照如下圖中安裝插件(windows系統)
pytest-order運行
使用@pytest.mark.order來裝飾用例,然后執行命令中無需增加額外的運行參數,運行時會自動化識別自定義的順序,并按照約定順序執行。
1 使用數字定義順序
使用正數或者負數定義順序,數字越小先執行。舉例@pytest.mark.order(1)或者@pytest.mark.order(index=1),可以直接填數字,也可以使用index=某個數字。
PS:該處的數字有點像python列表list的索引,0代表第一個元素,-1代表最后一個元素
- 如果全是正數或者全是負數,按照數字小到大的順序執行
- 如果既有正數又有負數,則按照正數由小到大排序,然后再按照負數由小到大排序
- 沒有標記的測試用例在所有具有正數標記的測試之后執行,并在具有負數標記的測試之前執行。
舉例:上面的用例重新定義順序如下,既有正數也有負數排序
預期結果是先執行函數級用例并且執行順序是1,2,3,4,5,再執行測試類中的用例并且執行順序是5,4,3,2,1
用例執行后結果如下:符合預期
上面的測試用例如果全部換成使用@pytest.mark.order(index=1)這種格式定義,結果也是一樣,此處不在贅述
2 使用英文代表的數字定義順序
使用英文代表的數字定義順序,數字越小先執行。
舉例@pytest.mark.order("first")或者@pytest.mark.order(index="last")
first代表第1個(相當于數字0),last代表最后1個(相當于數字-1)
如果使用不在字典中的定義會告警,舉例:定義@pytest.mark.order(index="ninth"),ninth表示第9個,執行后會告警,但是不影響使用
3 在測試類上做標記
如果order在測試類上設置標記,則該類中的所有測試將被視為具有相同的序數標記,例如,整個測試類會重新排序,而不會改變測試類內的測試順序。
舉例:標記以下類順序。
預期結果是 先執行Testcase2的test_2_1,test_2_2,然后執行Testcase1的test_1_1,test_1_2
執行結果如下:符合預期
舉例:同時標記類和類內的用例順序,以用例標記為準
預期結果是 先執行Testcase1的test_1_2,test_1_1,然后執行Testcase2的test_2_2,test_2_1
執行后結果如下:符合預期
4 相對于其他測試用例的順序
通過標記屬性before和after引用其他測試用例的名稱,before表示要在引用測試用例之前執行,after表示在引用測試用例之后執行。
引用的測試用例支持如下幾種情況:
1)本文件內函數級用例引用其他函數級用例
預期結果是先執行test_3,然后test_2,最后test_1
執行后結果:符合預期
2)本文件內函數級用例引用其他測試類中的用例
預期結果是先執行test_3,然后Testcse1.test_1_1,Testcse1.test_1_2,最后是test_1
執行結果如下:符合預期
3)本文件內用例引用其他文件中的用例
舉例: 在同一個目錄有兩個測試文件test_case1.py和test_case2.py,其中test_case1.py文件中的用例通過before和after引用了test_case2.py文件中的test_1用例,
當執行這個目錄的用例時,預期結果是:先執行test_case1.py.test_2,然后是test_case2.py.test_1,然后是test_case1.py.test_1,最后是test_case2.py.test_2
執行后結果: 符合預期
4)在測試類上標記其他測試類
使用before或?after標記屬性來引用測試類,標記類中的測試將排在引用類中的所有測試前面或者后面。
舉例:標記Testcase1類在Testcase2之后運行,并且設置Testcase2中先運行test_2_2
執行后結果:符合預期
5 絕對排序和相對排序的組合
如果將絕對順序標記和相對順序標記組合在一起,則首先對絕對標記(例如序數)進行排序,然后再對相對標記(before或者after)進行排序,這意味著相對順序始終優先。
舉例:設置如下兩條用例,test_1_1用例標記index=1和after=’tet_1_2’,雖然設置test_1_2順序為0,但按照相對順序優先的原則,預期先執行test_1_2,然后再執行test_1_1。
執行結果如下:符合預期
6 同一標記的幾種關系
如果需要相對于多個其他測試用例的順序對某個測試用例進行排序,則可以使用測試名稱列表或元組將多個測試名稱添加到before或after參數中。
舉例:設置如下4條用例,測試類Testcase.test_1_1用例標記在Testcase1.test_1_2和Testcase2.test_2_2之后執行。同時標記Testcase2.test_2_1和Testcase2.test_2_2的順序。
如果Testcase.test_1_1不做標記,執行順序為Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_1 > Testcase1.test_1_2
但是標記之后,預期執行順序是Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_2 > Testcase1.test_1_1
執行后結果: 符合預期
7 與參數化測試的關系
1)引用被參數化的測試用例,只能使用測試名稱,而不能引用某個參數。
舉例:設置2條用例,test_2用例設置3個參數,而test_1標記after=’test_2’,只能標記測試用例名稱。
預期是先執行3條test_2,然后再執行test_1
執行結果:符合預期
2) 在參數化用例上設置順序標記
舉例:設置2條用例,test_2用例設置3個參數并標記順序為0
預期是先執行3條test_2,然后再執行test_1
執行結果:符合預期
8 用例上設置多個順序標記
可以為測試設置多個順序標記,在這種情況下,測試將按照定義的順序執行多次。
舉例:設置2條用例,test_1用例標記順序0和1,test_2用例設置3個參數,標記兩個順序1和3,
預期是先執行 test_1,然后再執行3條test_2,再執行test_1,最后執行3條test_2
執行結果:符合預期
? ? ? 以上就是介紹的插件pytest-order的功能,但實際在編寫測試用例時還是要盡量避免存在過多的用例的順序依賴,如果有依賴可以參考之前文章介紹盡量使用setup或者teardown功能,總之我們要考慮盡可能減少后期維護用例的工作量。
共勉: 東漢·班固《漢書·枚乘傳》:“泰山之管穿石,單極之綆斷干。水非石之鉆,索非木之鋸,漸靡使之然也。”
-----指水滴不斷地滴,可以滴穿石頭;
-----比喻堅持不懈,集細微的力量也能成就難能的功勞。
----感謝讀者的閱讀和學習,謝謝大家。
---祝愿大家都能夠龍騰虎躍,步步高升!!!