DDT
DDT は、テスト フレームワークがunittest の場合に使用できます。ddt クラス デコレータは、TestCase のサブクラスで装飾する必要があります。TestCase は、テスト ランナーがテストを実行するために必要なインターフェイス (インターフェイス) を実装する、unittest フレームワークの基本クラスです。
DDT を使用する手順は次のとおりです。
-
テストクラスを @ddt で装飾します。
-
@data または @file_data を使用して、データ駆動型テスト メソッドを修飾します。
-
テスト データのセットに複数のパラメーターがある場合は、解凍する必要があり、@unpack を使用してテスト メソッドを修飾します。
インストール: pip install ddt
ddt.data() で許容されるデータ形式:
データのセット、各データは単一の値、複数のデータのセット、データの各セットはリストまたはディクショナリ
ddt はデータを直接提供します
単一パラメータ
@ddt
class TestDdt(unittest.TestCase):
@data("Tom","Jack")
def test_a(self,a):
print("这次的测试数据是"+a)
if __name__ == '__main__':
unittest.main()
複数のパラメータ
-
# data は、データが直接提供されることを示します。
-
# unpack は、データの各セットについて、その値がリストまたはタプルの場合、独立したパラメーターに分割されることを意味します。
@ddt
class TestDdt(unittest.TestCase):
@data(["Tom1","Tom2"],["Jack1","Jack2"])
@unpack
def test_a(self,a,b):
print("这次的测试数据是"+a+b)
if __name__ == '__main__':
unittest.main()
関数を使用してデータを提供する
import unittest
from ddt import ddt, data, unpack
def get_test_data():
data=(["Tom1","Tom2"],["Jack1","Jack2"])
return data
@ddt
class TestDdt(unittest.TestCase):
@data(*get_test_data())
@unpack
def test_a(self,a,b):
print("这次的测试数据是"+a+b)
if __name__ == '__main__':
unittest.main()
ファイルを使用してデータを提供する
json または yaml ファイルを使用してテスト データを提供できます
新しい test_a.json
{
"case1": {
"a": "Tom",
"b":"Jack"
},
"case2": {
"a": "Tom2",
"b":"Jack2"
}
}
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDdt(unittest.TestCase):
@file_data('test_a.json')
def test_a(self,a,b):
print("这次的测试数据是"+a+b)
if __name__ == '__main__':
unittest.main()
ここでのテスト関数は @file_data で修飾する必要があることに注意してください。外部ファイル方式を使用して、アンパックを使用せずにデータをロードします
yamlファイルを使用する
pip install pyyaml
新しいtest_a.yml
"case1":
"a": "Tom1"
"b": "Jack1"
"case2":
"a": "Tom2"
"b": "Jack2"
test_demo.py
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDdt(unittest.TestCase):
@file_data('test_a.yml')
def test_a(self,a,b):
print("这次的测试数据是"+a+b)
if __name__ == '__main__':
unittest.main()
その他の形式のファイル
ddt はデフォルトで JSON 形式と YAML 形式のデータのみをサポートします。しかし、他のデータ形式を使用したい場合はどうすればよいでしょうか?
一般的に使用される方法は 2 つあります。
-
最初に他の形式 (Excel 形式など) のファイルを読み取り、次に ddt がサポートする JSON または YAML ファイルを作成し、最後に取得したデータをこのファイルに書き込み、 @file_data() を使用します。
-
関数を作成し、他の形式でファイルを読み取り、関数内のデータを取得し、データを @ddt.data() でサポートされている形式に直接返します。
パラメータ化
pytest を使用している場合は、このアプローチをデータ駆動型にすることができます。
pytest は、pytest.mark.parametrize を介してデータによって駆動できます。pytest.mark.parametrize で受け入れられるデータ形式の要件は次のとおりです。
-
データのセットが 1 つしかない場合、それはリストの形式で存在します。パラメーターを渡す必要があることに注意してください。
import pytest
@pytest.mark.parametrize('a',["Tom","Jack"])
def test_a(a):
print("这次的测试数据是"+a)
输出:
PASSED [ 50%]这次的测试数据是Tom
PASSED [100%]这次的测试数据是Jack
-
複数のデータセットがある場合、それはリストのネストされたタプル ([0,1] または [(0,1), (1,2)] など) の形式で存在します (注、実際のリストのネストされたリストは可能です)も使用されます)
import pytest
@pytest.mark.parametrize('a,b',[("Tom","Jack"),("Tom1","Jack1")])
def test_a(a,b):
print("这次的测试数据是"+a+b)
输出PASSED [ 50%]这次的测试数据是TomJack
PASSED [100%]这次的测试数据是Tom1Jack1
yaml/json ファイルを使用してデータを提供する
json/yaml ファイルを使用してデータを提供できますが、対応するデータを解析するメソッドを記述する必要があります。
jsonとyamlで読み込むデータは辞書の中に入れ子になっているため、ファイルの種類を判定するメソッドを書くと読み込むモジュールが異なり、処理ロジックは同じです。
import json
import os.path
import pytest
import yaml
def yaml_data(filename):
file_path=os.path.abspath(filename)
print(file_path)
with open(filename,"r") as f:
if file_path.endswith((".yml", ".yaml")):
data=yaml.load(f,Loader=yaml.FullLoader)
elif file_path.endswith(("json")):
data=json.load(f)
else:
print("文件类型错误,仅支持yaml和json")
raise
result=[]
for key,value in data.items():
case_data = []
for k,v in value.items():
case_data.append(v)
result.append(tuple(case_data))
return result
@pytest.mark.parametrize('a,b',yaml_data(r'F:\接口自动化\pytest-auto-api2\test_a.json'))
def test_a(a,b):
print("这次的测试数据是"+a+b)
Excelファイルを利用したデータ提供
Excel からデータを読み取るメソッドを定義します。ここでは両方のメソッドを使用できます。
import openpyxl
def read_excel_data(filename,sheetname):
if not os.path.exists(filename):
raise ValueError("File not exists")
workbook = openpyxl.load_workbook(filename)
worksheet = workbook.get_sheet_by_name(sheetname)
datas = list(worksheet.iter_rows(values_only=True)) # 获取Excel表中的所有数据,每一行组成元组,整个数据组成列表
case_datas = datas[1:] # 获取表数据
cases_list = []
for case in case_datas:
cases_list.append(case)
return cases_list
def read_excel_data2(filename, sheetname):
workbook = openpyxl.load_workbook(filename)
cases_list = []
worksheet = workbook.get_sheet_by_name(sheetname)
for row in worksheet.rows:
cases_list.append([col.value for col in row])
return cases_list[1:]
@pytest.mark.parametrize('a,b',read_excel_data(r'C:\Users\Administrator\Desktop\test1.xlsx','Sheet1'))
def test_a(a,b):
print("这次的测试数据是"+a+b)
パンダ
import pandas as pd
def read_excel_data3(filename,sheetname):
s = pd.ExcelFile(filename)
data =s.parse(sheet_name =sheetname)
return data.values.tolist()