Datengesteuert in automatisierten Tests

DDT

DDT kann verwendet werden, wenn das Testframework Unittest ist. Der ddt-Klassendekorator muss in der Unterklasse von TestCase dekoriert werden. TestCase ist eine Basisklasse im Unittest-Framework, die die Schnittstelle (Schnittstelle) implementiert, die der Test Runner benötigt, um die Ausführung des Tests zu steuern.

Die Schritte zur Verwendung von DDT sind wie folgt:

  • Dekorieren Sie Ihre Testklasse mit @ddt;

  • Verwenden Sie @data oder @file_data, um Ihre datengesteuerten Testmethoden zu dekorieren.

  • Wenn ein Testdatensatz mehrere Parameter aufweist, müssen Sie ihn entpacken und mit @unpack Ihre Testmethode dekorieren.

Installation: pip install ddt

Akzeptable Datenformate für ddt.data():

Bei einem Datensatz handelt es sich bei jedem Datenwert um einen einzelnen Wert. Bei mehreren Datensätzen handelt es sich bei jedem Datensatz um eine Liste oder ein Wörterbuch

ddt stellt Daten direkt zur Verfügung

einzelner Parameter


@ddt
class TestDdt(unittest.TestCase):
    @data("Tom","Jack")
    def test_a(self,a):
        print("这次的测试数据是"+a)
if __name__ == '__main__':
    unittest.main()

mehrere Parameter

  1. # data gibt an, dass Daten direkt bereitgestellt werden.

  2. # unpack bedeutet, dass jeder Datensatz, wenn sein Wert eine Liste oder ein Tupel ist, in unabhängige Parameter aufgeteilt wird.

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

 

 Verwenden Sie Funktionen, um Daten bereitzustellen

 

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

Stellen Sie Daten mithilfe von Dateien bereit 

Sie können JSON- oder Yaml-Dateien verwenden, um Testdaten bereitzustellen

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

Beachten Sie, dass die Testfunktion hier mit @file_data dekoriert werden sollte. Verwenden Sie die externe Dateimethode, um Daten zu laden, ohne sie entpacken zu müssen

Verwenden Sie die Yaml-Datei

pip install pyyaml
​​​​new 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()

 

 Andere Formatdateien

ddt unterstützt standardmäßig nur Daten in den Formaten JSON und YAML. Was aber, wenn ich andere Datenformate verwenden möchte?

Es gibt zwei häufig verwendete Methoden:

  • Lesen Sie zuerst Dateien in anderen Formaten (z. B. im Excel-Format), erstellen Sie dann eine von ddt unterstützte JSON- oder YAML-Datei, schreiben Sie schließlich die erhaltenen Daten in diese Datei und verwenden Sie dann @file_data();

  • Erstellen Sie eine Funktion, lesen Sie Dateien in anderen Formaten, rufen Sie die Daten in der Funktion ab und geben Sie die Daten direkt in das von @ddt.data() unterstützte Format zurück.

Parametrisieren

Wenn Sie Pytest verwenden, können Sie diesen Ansatz datengesteuert nutzen.

pytest kann durch Daten über pytest.mark.parametrize gesteuert werden, und die von pytest.mark.parametrize akzeptierten Datenformatanforderungen sind:

  • Wenn es nur einen Datensatz gibt, liegt dieser in Form einer Liste vor. Beachten Sie, dass Parameter übergeben werden müssen.

import pytest


@pytest.mark.parametrize('a',["Tom","Jack"])
def test_a(a):
    print("这次的测试数据是"+a)

输出:
PASSED                                         [ 50%]这次的测试数据是Tom
PASSED                                        [100%]这次的测试数据是Jack
  • Wenn mehrere Datensätze vorhanden sind, liegen sie in Form verschachtelter Tupel von Listen vor (z. B. [0,1] oder [(0,1), (1,2)]) (Anmerkungen: Verschachtelte Listen können tatsächliche Listen sein auch verwendet werden)

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

Stellen Sie Daten mithilfe von Yaml/JSON-Dateien bereit

Sie können JSON-/YAML-Dateien zum Bereitstellen von Daten verwenden, müssen jedoch eine Methode schreiben, um die entsprechenden Daten zu analysieren.

Da es sich bei den von json und yaml gelesenen Daten um verschachtelte Wörterbücher handelt, schreiben Sie eine Methode zur Beurteilung des Dateityps, indem Sie verschiedene zu ladende Module verwenden, und die Verarbeitungslogik ist dieselbe.

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)

Stellen Sie Daten mithilfe von Excel-Dateien bereit

Definieren Sie eine Methode zum Lesen von Daten aus Excel. Beide Methoden können hier verwendet werden.

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)

Pandas

import pandas as pd
def read_excel_data3(filename,sheetname):
    s = pd.ExcelFile(filename)
    data =s.parse(sheet_name =sheetname)
    return data.values.tolist()

Acho que você gosta

Origin blog.csdn.net/seanyang_/article/details/132055714
Recomendado
Clasificación