pytest(17):pytest-ordering:指定pytest的case執行順序的外掛
阿新 • • 發佈:2021-08-09
背景
在寫介面或功能自動化case的時候,會遇到一些case有先後執行順序的場景。比如:註冊->登陸,先呼叫註冊介面在資料庫裡面生成使用者名稱和密碼,然後使用登陸介面驗證登陸。
在pytest裡,如果註冊和登陸分別是兩個testcase,預設執行執行順序是從前到後的。
例子
有一個pytest的測試case用例:test_login.py
import pytest
import os
if __name__ == '__main__':
a=os.path.dirname(__file__)
# print(a)
# print(os.path.exists(a))
pytest.main(["-v","-s",a])
執行:pytest test_login.py
可以看到test_login在test_reg之前執行,這和我們的期望相悖。
解決方法:
1. 可以在編寫testcase指令碼時候,把test_reg放到test_login前面。
2.使用pytest-ordering外掛
第一種方式屬於硬編碼的方式,在後續維護過程中很容易出現維護的混亂性(比如後續有人要新加case和註冊登入相關,可能改起來就比較麻煩了)。
第二種的好處就是可以通過pytest-ordering外掛,使用裝飾器的方式寫清楚這種先後順序,方便閱讀和維護。
pytest-ordering使用
安裝pytest-ordering
sudo pip3(pip) install pytest-ordering
使用pytest-ordering修飾符
1. 通過指定序數詞指定,比如first,second,third...second-to-last(倒數第二), last(最後)。這種含義比較直接(不過容易寫錯單詞)
#/usr/bin/env python3
import pytest
@pytest.mark.run('second')
def test_login():
assert True
@pytest.mark.run('first')
def test_reg():
assert True
2. 通過指定序號指定,比如1,2,3...-2(倒數第二), -1(最後)。這種寫錯的機率小,也比較直接。
#/usr/bin/env python3
import pytest
@pytest.mark.run(order=2)
def test_login():
assert True
@pytest.mark.run(order=1)
def test_reg():
assert True
3. 通過指定函式名指定,比如test_login和test_order都要在test_reg後執行,這種用法就比較適合此類場景。
#/usr/bin/env python3
import pytest
@pytest.mark.run(after='test_reg')
def test_login():
assert True
def test_reg():
assert True
@pytest.mark.run(after='test_reg')
def test_order():
assert True