自动化测试中的数据驱动

news2024/11/23 18:57:41

DDT

当测试框架是unittest时,可以使用ddt。ddt 这个类装饰器必须装饰在 TestCase 的子类上,TestCase 是 unittest 框架中的一个基类,它实现了 Test Runner 驱动测试运行所需的接口(interface)。

DDT 的使用步骤如下:

  • 使用 @ddt 装饰你的测试类;

  • 使用 @data 或者 @file_data 装饰你需要数据驱动的测试方法;

  • 如一组测试数据有多个参数,则需 unpack,使用 @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表示data是直接提供的。

  2. # unpack表示,对于每一组数据,如果它的值是list或者tuple,那么就分拆成独立的参数。

@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装饰。使用外部文件方式Load数据无须使用unpack

使用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 格式的数据。但是我想使用其他数据格式怎么办?

常用的方式有如下两种:

  • 先读取其他格式的文件(例如 Excel 格式),然后创建 ddt 支持的 JSON 或者 YAML 文件,最后把获取到的数据写入这个文件,再使用 @file_data() 即可;

  • 创建一个函数,在函数中读取其他格式的文件并获取数据,将数据直接返回为 @ddt.data() 支持的格式调用即可。

Parametrize

如果使用的是pytest,则可以采用这种方法进行数据驱动。

pytest 可以通过 pytest.mark.parametrize 来实现数据驱动,而 pytest.mark.parametrize 接受的数据格式要求为:

  • 如果只有一组数据,以列表的形式存在;注意需要传入参数。

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读取后的数据都是字典嵌套字典,所以写一个方法判断文件类型采用不同模块load,处理逻辑是一样的。

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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/828471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在屏幕上输出9*9乘法口诀表

//在屏幕上输出9*9乘法口诀表 int main() {int i 0;int j 0;for (int i 1; i < 9; i) {for (int j 1; j < 9; j)printf("%d*%d%d\t ", i, j, i * j);printf("\n");}}

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色 人像留色的原理 现在人像分割技术就像当初的人脸检测算法一样,称为广泛使用的基础算法。 今天本文介绍的人像留色其实就是三年前某 AI 巨头利用 video 分割技术展示的应用场景:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关…

markdown高级写作技巧汇总

文章目录 1 代码diff2 待办事项3 图片设置宽高4 折叠5 锚点链接实现方式① Markdown 原始写法 [名称](#id)② HTML 语法 名称 6 目录树7 换行 1 代码diff 如果你做过代码 Code Review&#xff0c;对下面这种效果肯定很熟悉 // 数组去重 const unique (arr)>{ - return A…

c语言(函数)

目录 何为函数 库函数 自定义函数 二分查找数组下标 链式访问 函数的声明 函数定义 递归 正向打印数字 打印字符个数 使用临时变量 递归(不使用临时变量) n的阶乘 一般形式 递归 斐波那契数 递归 正常做法 何为函数 在计算机科学中&#xff0c;子程序是一个…

医疗知识图谱问答——文本分类解析

前言 Neo4j的数据库构建完成后&#xff0c;现在就是要实现医疗知识的解答功能了。因为是初版&#xff0c;这里的问题解答不会涉及深度学习&#xff0c;目前只是一个条件查询的过程。而这个过程包括对问题的关键词拆解分类&#xff0c;然后提取词语和类型去图数据库查询&#xf…

pytorch学习——如何构建一个神经网络——以手写数字识别为例

目录 一.概念介绍 1.1神经网络核心组件 1.2神经网络结构示意图 1.3使用pytorch构建神经网络的主要工具 二、实现手写数字识别 2.1环境 2.2主要步骤 2.3神经网络结构 2.4准备数据 2.4.1导入模块 2.4.2定义一些超参数 2.4.3下载数据并对数据进行预处理 2.4.4可视化数…

TSINGSEE青犀视频智能视频监控EasyCVR如何将实时监控视频流分享出去?

开源EasyDarwin视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;…

【深度学习】Vision Transformer论文,ViT的一些见解《 一幅图像抵得上16x16个词:用于大规模图像识别的Transformer模型》

必看文章&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 论文名称&#xff1a; An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale 论文下载&#xff1a;https://arxiv.org/abs/2010.11929 官方代码&#xff1a;https:…

【微信小程序】保存多张图片到本地相册

<template><view class"container"><u-swiper :list"list" circular radius0 indicator indicatorModedot height950rpx></u-swiper><view class"btn btn2" click"saveFun">保存到相册</view><…

【MySQL】当前读和快照读

文章目录 当前读快照读 在学习 MVCC 多版本并发控制之前&#xff0c;必须先了解一下&#xff0c;什么是 MySQL InnoDB 下的 当前读和 快照读? 当前读 读取的是记录的最新版本&#xff0c;读取时还要保证其他并发事务不能修改当前记录&#xff0c;会对读取的记录进行加锁。对…

Rocky(centos) jar 注册成服务,能开机自启动

概述 涉及&#xff1a;1&#xff09;sh 无法直接运行java命令&#xff0c;可以软连&#xff0c;此处是直接路径 2&#xff09;sh脚本报一堆空格换行错误&#xff1a;需将转成unix标准格式&#xff1b; #切换到上传的脚本路径 dos2unix 脚本文件名.sh 2&#xff09;SELINUX …

Ubuntu18.04安装ROS

ROS 安装前的准备 &#xff08;1&#xff09;为了安装顺利使用国内下载源&#xff0c;&#xff08;我个人linux使用了代理&#xff09; 清华大学源 sudo sh -c ‘. /etc/lsb-release && echo “deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $DISTRIB_CODENA…

第四讲:利用ADO方式连接Access数据库

【分享成果&#xff0c;随喜正能量】最值得信赖的&#xff0c;其实是自己从孤独中得来的东西&#xff0c;而不是别人给予自己的东西。每个人都是一座孤岛&#xff0c;有些人一生都在想要逃离这座岛&#xff0c;有些人一生都在创造并丰富自己这座岛。。 《VBA数据库解决方案》教…

水环境地质3D可视化综合管理软件提高运维效率

谈起数字孪生技术&#xff0c;总让人兴奋不已&#xff0c;这种将物理实体的数字化模型与实际物理实体相结合、以虚控实的技术&#xff0c;是数字化转型和第四次工业革命的重要载体&#xff0c;那么在地质行业中&#xff0c;数字孪生有哪些应用场景? 在地质勘探中&#xff0c; …

潜在客户生成最实用指南,你还在等什么?

潜在客户是指对您的产品或服务表现出兴趣的人&#xff0c;它们提供个人识别信息&#xff0c;您的团队可以使用这些信息来跟进他们。随着越来越多的营销渠道涌现&#xff0c;接触新客户和开展有效的潜在客户生成活动变得越来越困难。赢得新的潜在客户听起来很困难&#xff0c;但…

【B/S手术麻醉系统源码】手术麻醉管理系统在临床中的应用

手术麻醉管理系统是临床麻醉工作中一个不容忽视的环节&#xff0c;麻醉医生必须对病人在麻醉手术过程中的情况与体征变化&#xff0c;采取的处理措施及术后随访等全过程作出及时、真实、确切的记录。麻醉记录不仅有助于确保临床麻醉准确&#xff0c;总结经验教训&#xff0c;提…

kcc呼叫中心语音转写功能

呼叫中心是客户和企业之间沟通的一个桥梁&#xff0c;也是客户服务和客户关系的一个重要组成部分。通过呼叫中心&#xff0c;企业可以建立起一个以客户为中心的服务模式&#xff0c;为客户提供高质量、高效率的服务&#xff0c;对于塑造企业形象&#xff0c;提高客户满意度&…

txt替换字符为换行

txt替换字符为换行 txt如何批量将同一个符号替换成换行符 2023-01-26 03:16:03 有时候看到网页有些排列的很整齐的文本想复制使用&#xff0c;可是复制下来放到txt后不分行&#xff0c;要么就是中间隔着一些公用的符号。那么我们怎么才能快速的让文本按原来的形式分行显示在…

一百三十九、Kettle——Linux安装Kettle8.2

一、目的 为了方便海豚调度kettle任务&#xff0c;在Linux上安装kettle 二、kettle版本与前提 版本&#xff1a;kettle8.2 pdi-ce-8.2.0.0-342 前提&#xff1a;Linux已经安装好jdk 三、安装步骤 &#xff08;一&#xff09;打开安装包所在地 [roothurys22 ~]# cd …

让SpringBoot不再需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了

Dataway 是基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具&#xff0c;使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布&#xff0c;一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中…