• Python好酷|allpairspy一款高效的正交实验法生成用例工具


    一、问题

    想必每个tester都有测试过类似下图中需要组合多种元素的业务场景,当然我们不会把所有条件元素组合的可能性都覆盖一遍,而是采取正交实验法进行用例设计,可以在不影响业务场景覆盖的前提下大大减少用例数量,既保证用例质量又降低测试时间成本。

    image.png

    以上图为例:

    性别:男、女

    班级:一年级、二年级、三年级、四年级、五年级

    年龄区间:8岁以下、8-10岁、10-13岁

    在正交实验法中,性别、班级、年龄区间这三个被测元素称为 因素,每个因素的取值称之为水平值

    如果全量测试场景下:测试用例数量=2*5*3=30(个)。正交实验法数量远远少于全量测试用例数量,当然正交实验法原理稍微复杂,我们直接使用现成的工具生成测试用例即可。今天介绍的工具就是一个Python库:allpairspy。

    二、allpairspy实践

    1. 基础用法

    以上述测试场景为例,咱们利用工具生成测试用例。

    from allpairspy import AllPairs
    
    parameters = [
        ["男", "女"],
        ["一年级", "二年级", "三年级", "四年级", "五年级"],
        ["8岁以下", "8-10岁", "10-13岁"]
    ]
    
    print("PAIRWISE:")
    for i, pairs in enumerate(AllPairs(parameters)):
        print("用例编号{:2d}: {}".format(i, pairs))

    image.png

    哇哈,是不是很惊喜,少了一半,也就是说降低一半的测试成本。

    2. 过滤

    当然有些因素之间值的组合是无效的,这时候可以通过在AllPairs构造函数中设置过滤函数filter_func来过滤这些无效用例组。咱们举个例子:年龄区间取值10-13岁不可能对应一年级学生。

    from allpairspy import AllPairs
    
    def is_valid_combination(row):
        n = len(row)
        # 设置过滤条件
        if n > 2:
            # 一年级 不能匹配 10-13岁
            if "一年级" == row[1] and "10-13岁" == row[2]:
                return False
        return True
    
    parameters = [
        ["男", "女"],
        ["一年级", "二年级", "三年级", "四年级", "五年级"],
        ["8岁以下", "8-10岁", "10-13岁"]
    ]
    
    print("PAIRWISE:")
    for i, pairs in enumerate(AllPairs(parameters, filter_func=is_valid_combination)):
        print("用例编号{:2d}: {}".format(i, pairs))

    image.png

    很好,将不符合条件的用例直接过滤掉。

    3. OrderedDict

    如果你想用例更一目了然,使用OrderedDict,可以将结果存储到nametuple数据结构中。

    from collections import OrderedDict
    from allpairspy import AllPairs
    
    parameters = OrderedDict({
        "性别": ["男", "女"],
        "年级": ["一年级", "二年级", "三年级", "四年级", "五年级"],
        "年龄区间": ["8岁以下", "8-10岁", "10-13岁"]
    })
    
    print("PAIRWISE:")
    for i, pairs in enumerate(AllPairs(parameters)):
        print("用例编号{:2d}: {}".format(i, pairs))

    image.png

    4. 结合pytest

    更强大的是,如果你要进行单测或者接口测试,它还可以结合测试框架pytest让你的测试更高效,将生成的组合数据通过数据驱动的方式传递给待测函数/接口。示例如下。

    import pytest
    from allpairspy import AllPairs
    
    def function_to_be_tested( sex, grade, age):
        if grade == "一年级" and age == "10-13岁":
            return False
        return True
    
    class TestParameterized(object):
    
        @pytest.mark.parametrize(["sex", "grade", "age"], [
            value_list for value_list in AllPairs([
                [u"男", u"女"],
                ["一年级", "二年级", "三年级", "四年级", "五年级"],
                ["8岁以下", "8-10岁", "10-13岁"]
            ])
        ])
        def test(self, sex, grade, age):
            assert function_to_be_tested(sex, grade, age)

    image.png

    ⚠️ 结果中没做中文转码,自动忽略。

    三、总结

    组合参数测试往往是比较枯燥的,借助allpairspy可以快速生成高质量的测试用例,快捷又高效,希望每个tester都能掌握这个工具,多在项目中使用它降低测试成本。

    往期文章:

    Python编程九:代码调试

    Python编程八:异常处理

    Python编程七:如何让繁琐的工作自动化?

    Python编程六:面向对象编程

    Python编程五:数据结构

    Python编程四:认识函数

    Python编程三:语句控制

    Python编程二:变量与运算符

    Python编程一:初识Python

    image.png

  • 相关阅读:
    Nginx文件下载服务器部署
    Git分支命名规范
    ROS通信介绍
    linux环境设置默认路由的优先级
    Python日志方案
    Python threading Local()函数用法:返回线程局部变量
    Python中websocket的使用示例
    MQTT的Python使用示例
    利用systemback打包个人ISO系统镜像
    Spring Security学习笔记三
  • 原文地址:https://www.cnblogs.com/iloverain/p/16515148.html
Copyright © 2020-2023  润新知