PlayWright(十七)- 引數化

2023-07-14 18:00:20
今天來講下引數化,具體是什麼意思呢,舉個例子
 
比如我們要測試登入功能,第一步會填寫賬號,第二步會填寫密碼,這是一條完整的操作,但是其中會有很多條用例比如賬號錯誤、密碼錯誤、賬號為空、密碼為空的各種情況,但是在輸入賬號、密碼的操作都是一樣的
 
我們不能一條用例複製很多次,然後再輸入不同的情況,所以就用到了我們的引數化,只需要寫一個用例操作,然後把全部需要的引數傳入用例操作中,只需要不同資料就可以實現不同的情況,所以我們也經常叫這種為資料驅動
 
 

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}")

 

我們直接在第二個引數中放我們的處理資料函數
執行結果:
 
沒有問題,引數化我們基本已經掌握了