今天來講下引數化,具體是什麼意思呢,舉個例子
比如我們要測試登入功能,第一步會填寫賬號,第二步會填寫密碼,這是一條完整的操作,但是其中會有很多條用例比如賬號錯誤、密碼錯誤、賬號為空、密碼為空的各種情況,但是在輸入賬號、密碼的操作都是一樣的
我們不能一條用例複製很多次,然後再輸入不同的情況,所以就用到了我們的引數化,只需要寫一個用例操作,然後把全部需要的引數傳入用例操作中,只需要不同資料就可以實現不同的情況,所以我們也經常叫這種為資料驅動
1、引數化怎麼用
那Pytest使用引數化功能使用的是什麼呢?
答:是一個裝飾器
@pytest.mark.parametrize(self,argnams,argvalues,indirect=False,ids=None)
分析下引數
- argnams 引數名,是一個字串,若有多個引數中間用逗號分隔
- argvalue 引數值,是一個列表,列表中有幾個元素,便會生成幾個用例
- indirect 預設為False,若為True則表示引數名是一個函數
- ids 可以將用例重新命名
大概意思就是第一個引數填一個字串,第二個引數填一個列表,列表裡放引數
好,我們還是直接實戰。
2、傳一個引數
import pytest
"""
引數化的使用
"""
@pytest.mark.parametrize('num', [1, 2, 3, 4, 5])
def test_01(num):
print(f"傳入的引數是:{num}")
我們定義函數,這裡得主要有引數,所以必須在函數裡先傳入這個引數,之後才能使用,列表裡放我們的引數[1,2,3,4,5],所以結果應該也是分別傳入這幾個數
執行結果:
2、傳多個引數
@pytest.mark.parametrize('a,b,c', [(1, 2, 3), (4, 5, 6)])
def test_01(a, b, c):
print(f"傳入的引數分別是:{a},{b},{c}")
這裡我們傳入了多個引數,用了列表包著元祖的形式傳入引數
執行結果:
那有人會問,列表包著元祖可以,那列表包著字典不能使用嗎?我們試一下就知道了
@pytest.mark.parametrize('a,b,c', [{1, 2, 3}, {4, 5, 6}])
def test_01(a, b, c):
print(f"傳入的引數分別是:{a},{b},{c}")
看結果:
可以看到,是沒有問題的,我們之後做資料驅動經常會用到此種資料
3、資料驅動
多個引數也沒問題了,那很多很多資料呢,我們在接著放到引數裡就會太長了,程式碼很不優雅,所以我們選用單獨檔案儲存資料,這個檔案形式呢?有yaml格式、json格式、excel格式,這些我們都可以用,然後我們選用讀取檔案資料的方式,然後再放在引數裡就可以了
這樣程式碼還更簡潔了,如果要更換資料,直接在對應的資料檔案裡更換資料就可以了
下邊直接看例子:
資料放到了JSON檔案裡
這時候就需要我們讀取用例了,這裡可以單獨寫一個函數
json_file = '具體的json檔案路徑' # 這裡我們填寫json的絕對路徑
def get_data():
"""
封裝處理json資料的
"""
test_data = [] # 先定義一個資料記憶體,讀取的資料要往這裡填
# 開啟檔案載入
with open(json_file, encoding="utf-8") as f: # 開啟json資料夾
case = json.load(f) # 將JSON字串轉換為字典存放到case中
for case_data in case.values(): # 將資料迴圈拆開,變成元祖格式在放到我們之前的容器中
test_data.append(tuple(case_data.values()))
return test_data
這是我們的資料處理,呼叫這個函數就返回資料了,我們可以先看結果,資料對不對
執行結果:
好了,我們可以在函數中使用了
import pytest
# 匯入了處理資料的檔案,方便之後呼叫函數
from tools.get_data import get_data
@pytest.mark.parametrize("name,age", get_data())
def test01(name, age):
print(f"傳入的引數分別是:{name},{age}")
我們直接在第二個引數中放我們的處理資料函數
執行結果:
沒有問題,引數化我們基本已經掌握了