"用例獨立。用例相互之間沒有依賴,隨便拉出一條用例就能執行。"

這是我在文章《接口自動化框架設計漫談V1.0》提到的,也是我一直堅持的接口自動化用例設計方式。

這麼做的依據是某些開源測試框架是這樣設計的,某些公司測試平台也是這麼設計的,自然而然就這樣認為了。最近公司平台做了升級,能夠支持用例複用了,讓我重新思考接口自動化的用例,到底是獨立還是複用。

為什麼用例獨立?我個人理解,用例獨立,可能有點受限於技術實現,比如YAML編寫用例,或者平台編寫用例,實現成本和取得收益對比來看,用例獨立是一種均衡的選擇。當然用例獨立也有好處:隔離性、可維護性、並行執行、錯誤定位、數據隔離、報告清晰。

其實從代碼複用角度來看,用例複用能提高編寫效率,把相對穩定的步驟組裝成用例,再複用給其他用例,減少重複代碼的編寫與維護。

如果使用tep測試框架,個人推薦使用fixture來實現用例複用,藉助依賴注入技術,避免循環import等問題。

舉例,有1條用例case_hello,打招呼,name是變量,代碼如下:

# fixture/fixture_case_hello.py
import pytest
from tep import v


@pytest.fixture(scope='session')
def case_hello():
    def main():
        msg = 'Hello ${name}'
        msg = v(msg)
        print(msg)

    return main

case_hello定義為fixture,放在fixture目錄下並以fixture_開頭命名文件,tep框架會自動識別為pytest fixture。其中變量處理使用了函數v()

新建1條用例test_case_reuse,複用case_hello,代碼如下:

# test_case_reuse.py
from tep import v, step


def test(case_hello):
    v({
        "name": "Gang"
    })
    case_hello()
    step('welcome', step_welcome)


def step_welcome():
    print('Welcome to tep')

case_hello內部包裝了1個內部函數main,返回的是函數引用,所以在用例中進行函數調用case_hello()就能實現用例複用。變量name使用函數v()定義,在用例之間共享。函數v()可以理解為內部變量池,跟JMeter的vars類似,詳情可以參考文章《Python處理接口數據,這個函數太香了》。

總結,用例儘量保持獨立,如果需要複用,把重複代碼封裝為用例,在用例級別進行復用。