卑微小测试的一天----自动生成正交法测试用例

news2024/11/19 15:14:24

前言

工作过程中,我们接触到需求后第一要务是 熟悉需求并且输出测试用例,针对接口测试的入参测试,需要校验大量入参的组合场景,这时我们通常采用正交法来设计测试用例,在减少测试用例的数量时,同时保障测试用例的有效覆盖性。

正交法实验

正交试验法是分析多因素、多水准的一种实验法,它是借助正交表来对实验进行设计,依据少数的实验取代全面实验

在一项实验中,把影响实验结果的量称之为实验因素(因子),简称因素。因素可以理解为实验过程中的自变量,实验结果可以看成因素的函数。在实验过程中,每一个因素可以处于不同的状态或状况,把因素所处的状态或状况,称之为因素的水准,简称水准。

举个例子:

某所大学通信系共2个班级,刚考完某一门课程,想依据“性别”、“班级”和“成绩”这三个查询条件对通信系这门课程的成绩分布,男女比例或班级比例进行人员查询:

依据“性别”=“男,女”进行查询

依据“班级”=“1班,2班”查询

依据“成绩”=“及格,不及格”查询

按照传统设计——全部检测

分析上述检测需求,有3个被测元素,被测元素我们称之为因素,每个因素有两个取值,我们称之为水准值(也就是2)。

如果是普通的全面检测,则如下(2^3=8次)
全校验
如果是正交法,则如下(2^2=4次)
正交法
如果入参数量更多正交法的收益就越大

自动生成正交用例

手动将入参情况列出来总归是繁琐的,我们可以通过正交表来自动输出相关组合场景,正交表规则取自
http://support.sas.com/techsup/technote/ts723_Designs.txt

# encoding: utf-8

from itertools import groupby
from collections import OrderedDict


def dataSplit(data):
    ds = []
    mb = [sum([k for m, k in data['mk'] if m <= 10]), sum([k for m, k in data['mk'] if m > 10])]
    for i in data['data']:
        if mb[1] == 0:
            ds.append([int(d) for d in i])
        elif mb[0] == 0:
            ds.append([int(i[n * 2:(n + 1) * 2]) for n in range(mb[1])])
        else:
            part_1 = [int(j) for j in i[:mb[0]]]
            part_2 = [int(i[mb[0]:][n * 2:(n + 1) * 2]) for n in range(mb[1])]
            ds.append(part_1 + part_2)
    return ds


class OAT(object):
    def __init__(self, OAFile='./ts723_Designs.txt'):
        """
        初始化解析构造正交表对象,数据来源:http://support.sas.com/techsup/technote/ts723_Designs.txt
        """
        self.data = {}

        # 解析正交表文件数据
        with open(OAFile, ) as f:
            # 定义临时变量
            key = ''
            value = []
            pos = 0

            for i in f:
                i = i.strip()
                if 'n=' in i:
                    if key and value:
                        self.data[key] = dict(pos=pos,
                                              n=int(key.split('n=')[1].strip()),
                                              mk=[[int(mk.split('^')[0]), int(mk.split('^')[1])] for mk in
                                                  key.split('n=')[0].strip().split(' ')],
                                              data=value)
                    key = ' '.join([k for k in i.split(' ') if k])
                    value = []
                    pos += 1
                elif i:
                    value.append(i)

            self.data[key] = dict(pos=pos,
                                  n=int(key.split('n=')[1].strip()),
                                  mk=[[int(mk.split('^')[0]), int(mk.split('^')[1])] for mk in
                                      key.split('n=')[0].strip().split(' ')],
                                  data=value)
        self.data = sorted(self.data.items(), key=lambda i: i[1]['pos'])

    def get(self, mk):
        """
        传入参数:mk列表,如[(2,3)],[(5,5),(2,1)]

        1. 计算m,n,k
        m=max(m1,m2,m3,…)
        k=(k1+k2+k3+…)
        n=k1*(m1-1)+k2*(m2-1)+…kx*x-1)+1

       2. 查询正交表
        这里简单处理,只返回满足>=m,n,k条件的n最小数据,未做复杂的数组包含校验
        """
        mk = sorted(mk, key=lambda i: i[0])

        m = max([i[0] for i in mk])
        k = sum([i[1] for i in mk])
        n = sum([i[1] * (i[0] - 1) for i in mk]) + 1
        query_key = ' '.join(['^'.join([str(j) for j in i]) for i in mk])

        for data in self.data:
            # 先查询是否有完全匹配的正交表数据
            if query_key in data[0]:
                return dataSplit(data[1])
            # 否则返回满足>=m,n,k条件的n最小数据
            elif data[1]['n'] >= n and data[1]['mk'][0][0] >= m and data[1]['mk'][0][1] >= k:
                return dataSplit(data[1])
        # 无结果
        return None

    def genSets(self, params, mode=0, num=1):
        """
        传入测试参数OrderedDict,调用正交表生成测试集
        mode:用例裁剪模式,取值0,1
            0 宽松模式,只裁剪重复测试集
            1 严格模式,除裁剪重复测试集外,还裁剪含None测试集(num为允许None测试集最大数目)
        """
        sets = []

        # 根据因素水平数量进行排序
        params = OrderedDict(sorted(params.items(), key=lambda x: len(x[1])))

        mk = [(k, len(list(v))) for k, v in groupby(params.items(), key=lambda x: len(x[1]))]
        data = self.get(mk)
        for d in data:
            # 根据正则表结果生成测试集
            q = OrderedDict()
            for index, (k, v) in zip(d, params.items()):
                try:
                    q[k] = v[index]
                except IndexError:
                    # 参数取值超出范围时,取None
                    q[k] = None
            if q not in sets:
                if mode == 0:
                    sets.append(q)
                elif mode == 1 and (len(list(filter(lambda v: v is None, q.values())))) <= num:
                    # 测试集裁剪,去除重复及含None测试集
                    sets.append(q)
        return sets

生成上述测试用例

if __name__ == "__main__":
    oat = OAT()
    case1 = OrderedDict([
        ("性别", ["男 ", "女"]),
        ("班级", ["1班", "2班"]),
        ("成绩", ["及格","不及格"])
    ])
    print(json.dumps(oat.genSets(case1), ensure_ascii=False))

结果如下
在这里插入图片描述
这样就可以自动生成正交用例了

示例代码参考:https://github.com/lovesoo/OrthogonalArrayTest

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

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

相关文章

Java 命名规范

包命名规范 包(Package) 的作用是将功能相似或相关的类或者接口进行分组管理&#xff0c;便于类的定位和查找&#xff0c;同时也可以使用包来避免类名的冲突和访问控制&#xff0c;使代码更容易维护。通常&#xff0c;包名使用小写英文字母进行命名&#xff0c;并使用 “.” 进…

LeetCode——半有序排列

一、题目 2717. 半有序排列 - 力扣&#xff08;Leetcode&#xff09; 给你一个下标从 0 开始、长度为 n 的整数排列 nums 。 如果排列的第一个数字等于 1 且最后一个数字等于 n &#xff0c;则称其为 半有序排列 。你可以执行多次下述操作&#xff0c;直到将 nums 变成一个 …

LeetCode_前缀树_困难_212.单词搜索 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xf…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(中)

注&#xff1a;本文由ChatGPT与Claude联合生成 51、Effective ReDoS Detection by Principled Vulnerability Modeling and Exploit Generation 正则表达式拒绝服务攻击&#xff08;ReDoS&#xff09;是一种算法复杂度攻击。对于易受攻击的正则表达式&#xff0c;攻击者可以精心…

kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun&#xff08;方法 / 函数&#xff09;函数参数默认值…

MindMapper 思维导图 21.x

MindMapper 可视化绘图软件是任何想要快速组织思想和想法的人的必备工具。MindMapper 具有易于使用的界面&#xff0c;可以轻松创建可用于头脑风暴、决策制定和项目管理的综合思维导图。MindMapper 还是一个非常强大的生产力工具&#xff0c;因为它允许用户跟踪他们在项目和任务…

Linux GCC,GDB,Shell脚本的简单使用

这里写目录标题 GCC命令GDB命令Shell脚本 GCC命令 GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由GNU开发的编程语言译器 编译一个简单的.c程序&#xff1a; 四步分开写&#xff1a; gcc -E -o hello.i hello.c // 预处理 gcc -S -o he…

49、基于51单片机无刷电机调速系统设计(程序+原理图+PCB图+英文文献+参考论文+开题报告+元器件清单等)

摘 要 由于电机的发展&#xff0c;电动机由之前的带有刷子变换为无刷子直流电动机&#xff0c;其内部结构是电子换向器&#xff0c;而不是传统的机械式换向器&#xff0c;电动机的组成为永磁材料制造的转子和带有线圈绕组的定子组成。 所以本论文思路在全面分析无刷直流电机…

Tuleap ,一个用于软件项目管理的平台

Eclipse 基金会使用 Tuleap 取代了 Bugzilla,Tuleap 是一个独特的开源项目管理工具&#xff0c;目前发展势头很好&#xff0c;现在&#xff0c;每个月它会出一个大版本。它还被列在2015 年五大开源项目管理工具和 2016 年十一个名列前茅项目管理工具中。 Manuel Vacelet 是开发…

【MySQL】一文带你了解MySQL的基础知识

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …

51单片机读取DS18B20温度传感器

1.首先我们知道DS18B20是单总线协议&#xff0c;只有一根数据线。所以Data数据线即使发送端又是接收端&#xff0c;同时DS18B20内部接了弱上拉电阻&#xff08;如图一所示&#xff09;&#xff0c;数据线默认为高电平。有了这些概念&#xff0c;我们就能进行下一步。 图一&…

1738_创建自己的simulink模块库

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

随着网络犯罪策略的转变,暗网威胁瞄准能源行业

根据 Searchlight Cyber 的一份报告&#xff0c;能源行业越来越多地通过暗网上的活动成为恶意行为者和威胁组织的目标。 该报告详细介绍了威胁行为者出售全球能源组织初始访问权的众多实例。 其中包括美国、加拿大、英国、法国、意大利和印度尼西亚的流行暗网论坛&#xff08…

使用AIGC工具巧用Linux系统

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【Python爬虫开发基础③】Python基础(文件操作方法汇总)

友情提示&#xff1a;由于本专栏的文章偏向于爬虫&#xff0c;所以对于python的介绍不可能面面俱到&#xff0c;在这里只讲重点。 如果大家觉得有没讲到的地方&#xff0c;欢迎补充~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&…

黑马Redis视频教程高级篇(三:最佳实践)

目录 一、Redis键值设计 1.1、优雅的key结构 1.2、拒绝BigKey 1.2.1、BigKey的危害 1.2.2、如何发现BigKey 1.2.3、如何删除BigKey 1.3、恰当的数据类型 例1&#xff1a;比如存储一个User对象&#xff0c;我们有三种存储方式&#xff1a; 例2&#xff1a;假如有hash类…

5.部署LVS-DR群集

文章目录 部署LVS-DR群集LVS-DR数据包流向分析LVS-DR中的ARP问题问题一问题二 LVS-DR部署调度器配置节点服务器配置NFS服务器配置 ipvsadm 部署LVS-DR群集 LVS-DR数据包流向分析 为方便进行原理分析&#xff0c;将Client与群集机器放在同一网络中&#xff0c;数据包流经的路线…

2000-2019年280多个地级市就业人数数据(全市)/城市就业数据

2000-2019年280多个地级市就业人数数据&#xff08;全市&#xff09; 1、时间范围&#xff1a;2000-2019年 2、范围&#xff1a;包括280多个地级市 3、来源&#xff1a;城市NJ 4、统计口径&#xff1a;全市 5、单位&#xff1a;万人 6、缺失情况&#xff1a;与城市年鉴缺失情况…

python学习笔记20230611

python语言的特点 python是脚本语言&#xff0c; 采用解释方式执行。 解释是将源代码逐条转换成目标代码同时逐条运行目标代码的过程。执行解释的计算机程序就是解释器。 解释执行方式是逐条运行用户编写的代码&#xff0c;执行性能略低&#xff0c;但他支持跨硬件或操作系统…