如何自动生成正交法测试用例?

目录

引言

正交法实验

自动生成正交用例


引言

正交法测试用例是一种高效且可靠的方法,能够最大限度地减少测试工作量,同时保证覆盖所有可能的组合情况。通过了解如何优化这些测试用例的生成过程,可以提高产品的质量,降低故障率,并赢得客户的信任与好评。那么如何自动生成正交测试用例呢?一起来看看吧!

正交法实验

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

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

举个例子:

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

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

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

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

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

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

如果是普通的全面检测,则如下(2^3=8次)

如果是正交法,则如下(2^2=4次)

如果入参数量更多正交法的收益就越大

自动生成正交用例

手动将入参情况列出来总归是繁琐的,我们可以通过正交表来自动输出相关组合场景

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

结果如下

这样就可以自动生成正交用例了 


最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正交测试方是一种测试用例设计方,通过选择一组代表性的测试用例,以覆盖系统中的不同因素和因素组合,从而减少测试用例的数量,提高测试效率。正交测试方基于正交计算,将测试用例的设计转化为一个均匀而简单的正交表格。 举个例子来说明正交测试方:假设有一个注册页面,其中包含用户名、密码和邮箱三个输入字段。 我们可以使用正交测试方设计测试用例。首先,我们需要识别系统中的各个因素,并确定各个因素的取值范围。在这个例子中,我们假设用户名有3种取值,密码有4种取值,邮箱有2种取值。 根据这些因素和取值范围,我们可以使用正交计算生成一个正交表格,来决定选择哪些测试用例正交表格示例: | 用户名 | 密码 | 邮箱 | |-----------|----------|----------| | A | A | A | | B | B | B | | C | C | C | | A | D | D | | B | D | D | | C | D | D | 在这个正交表格中,每个因素的每个取值都至少出现了一次,并且每个因素的取值都与其他因素的取值进行了组合。通过选择正交表格中的测试用例,我们可以覆盖系统中不同因素的组合情况。 例如,我们可以选择以下几个测试用例: 1. 输入:用户名 A,密码 A,邮箱 A 2. 输入:用户名 B,密码 B,邮箱 B 3. 输入:用户名 C,密码 C,邮箱 C 通过设计这些测试用例,我们覆盖了系统中用户名、密码和邮箱的不同取值组合,实现了较高的测试覆盖率。正交测试方可以减少测试用例的数量,同时保持对系统各个因素和因素组合的有效覆盖,提高测试效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值