自動テストにおけるデータドリブン

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()

複数のパラメータ

  1. # data は、データが直接提供されることを示します。

  2. # 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()

おすすめ

転載: blog.csdn.net/seanyang_/article/details/132055714