自动化测试中的数据驱动

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件定时器

Q: 什么是定时器? A: 其实在单片机的学习中,已经接触过无数次定时器了,所谓定时器,简单可以理解为闹钟,到达指定一段时间后,就会响铃。 STM32 芯片自带硬件定时器,精度较高,达到定时…

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传 删除本地Git仓库 创建本地Git仓库 关联其他仓库并上传 要在IntelliJ IDEA中删除本地Git仓库并创建新的本地Git仓库,以及关联其他仓库并上传,请按照以下步骤进行操作: 删除本地G…

openSUSE安装虚拟化 qemu kvm

1) 第一种:图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装,是不是很简单呢 2)第二种: 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少,可以搜索centos7 安装qemu kvm的教程,然后…

NLP From Scratch: 生成名称与字符级RNN

NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在<cite>第一个教程< / intermediate / char_rnn_classification_tutorial ></cite> 中&#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次&#xff…

MP4如何转MP3?教你简单好用的转换方法

怎么将MP4格式的视频转换成MP3音频呢&#xff1f;相信大家在看短视频的时候&#xff0c;有的视频背景音乐非常好听&#xff0c;我们又搜不到这个音频的源声在哪里&#xff0c;这时候我们就可以将这段视频直接转换成MP3格式音频&#xff0c;用来当做铃声或者是闹钟非常合适&…

【css】解决元素浮动溢出问题

如果一个元素比包含它的元素高&#xff0c;并且它是浮动的&#xff0c;它将“溢出”到其容器之外&#xff1a;然后可以向包含元素添加 overflow: auto;&#xff0c;来解决此问题&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head> <style>…

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8 一、背景 最近使用有道云笔记时&#xff0c;遇到bug问题&#xff1a; 打不开加密的笔记&#xff0c;发现是最新版本v7.2.8&#xff0c;切换到v7.2.7后&#xff0c;一切恢复正常。 在使用有道云笔…

机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——Dropout &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 这一部…

MySQL 极速安装使用与卸载版

mysql-5.6.51 极速安装使用与卸载版 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&#xff0c;进入bin目录&#xff0c;输入mysqld --install&#xff0c;进行安装 这样&#xff…

【LeetCode】88. 合并两个有序数组

这道题我总共想了三种解法。 1.将nums2中的元素依次放入nums1有效元素的后面&#xff0c;再总体进行排序。 import java.util.*; class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j 0;for(int i m;i<mn;i){nums1[i] nums2[j];j;}Arrays…

时间复杂度为O(n2)的三种简单排序算法

1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置&#xff0c;重复n次&#xff0c;就完成了n个数据的排序工作。 /*** …

华为OD机试真题 JavaScript 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…

算法与数据结构(五)--树【1】树与二叉树是什么

一.树的定义 树是一个具有层次结构的集合&#xff0c;是由一个有限集和集合上定义的一种层次结构关系构成的。不同于线性表&#xff0c;树并不是线性的&#xff0c;而是有分支的。 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。 若n0&…

数据采集的方法有哪些?

近年来&#xff0c;国家和各大企业都在部署大数据战略。“大数据”这个词也越来越频繁地出现在我们的生活中。当我们在进行网上冲浪时&#xff0c;页面总会跳出我们想要搜索的相关产品或关联事物。大数据&#xff0c;似乎总是能够“算”出我们“心中所想”。那么&#xff0c;大…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(23)-Fiddler如何优雅地在正式和测试环境来回切换-上篇

1.简介 在开发或者测试的过程中&#xff0c;由于项目环境比较多&#xff0c;往往需要来来回回地反复切换&#xff0c;那么如何优雅地切换呢&#xff1f;今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 &#xff08;1&#xff09;已发布线上APP出…

centos系统离线安装k8s v1.23.9最后一个版本并部署服务,docker支持的最后一个版本

注意&#xff1a;我这里的离线安装包是V1.23.9. K8S v1.23.9离线安装包下载&#xff1a; 链接&#xff1a;https://download.csdn.net/download/qq_14910065/88143546 这里包括离线安装所有的镜像&#xff0c;kubeadm&#xff0c;kubelet 和kubectl&#xff0c;calico.yaml&am…

Java版本spring cloud + spring boot企业电子招投标系统源代码 tbms

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

Charles抓包工具使用(一)(macOS)

Fiddler抓包 | 竟然有这些骚操作&#xff0c;太神奇了&#xff1f; Fiddler响应拦截数据篡改&#xff0c;实现特殊场景深度测试&#xff08;一&#xff09; 利用Fiddler抓包调试工具&#xff0c;实现mock数据特殊场景深度测试&#xff08;二&#xff09; 利用Fiddler抓包调试工…

java版直播商城平台规划及常见的营销模式+电商源码+小程序+三级分销+二次开发 bbc

&#xfeff; 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、R…