接口测试 根据接口规则自动生成基础用例

一片天地 for 杭州数云测试团队 · 2022年04月02日 · 最后由 攀爬从心开始 回复于 2022年06月07日 · 3600 次阅读

一般情况下开发在 yapi 上面写完接口文档,测试需要根据接口文档内容来准备测试,我们可以手动去写,也可以根据代码快速拉取生成,本文主要讲解拿到这些数据后怎么自动生成基础用例,如何拉取在另一篇说
这篇主要讲的是如何依据规则生成基础用例 (包含两部分:根据参数类型生成用例 + 根据是否必选项生成用例)

1.根据参数是否必选生成用例
一般我们会找到根据参数类型生成的写的比较多,但是是否根据是否必选生成这个没有,此处分享一下我写的

data = {
    "product_id": "amy",
    "skus": [
        {
            "sku_id": 123456,
            "sku_value": {
                "test1": "abc",
                "test2": "efg"
            }
        }
    ],
    "address": {
        "province": "知识",
        "town": "力量"
    }
}

required = {
    "product_id": "1",
    "skus": [
        {
            "sku_id": "1",
            "sku_value": {
                "test1": "0",
                "test2": "1"
            }
        }
    ],
    "address": {
        "province": "1",
        "town": "0"
    }
}

def generate_required_case(_source, _param):
    new_dict = {}
    for k, v in _param.items():
        if v == "0" or v == "1":
            data_cp = copy.deepcopy(_source)
            data_cp.pop(k)
            data_map = {"0": "非必选", "1": "必选"}
            param = k + ":" + data_map[v] + "删除"
            new_dict.update({param: data_cp})
        else:
            if isinstance(v, list):
                if isinstance(v[0], dict):
                    for _k, _v in generate_required_case(_source[k][0], _param[k][0]).items():
                        data_cp = copy.deepcopy(_source)
                        data_cp[k] = [_v]
                        param = k + ":" + _k
                        new_dict.update({param: data_cp})
            if isinstance(v, dict):
                for _k, _v in generate_required_case(_source[k], _param[k]).items():
                    data_cp = copy.deepcopy(_source)
                    data_cp[k] = [_v]
                    param = k + ":" + _k
                    new_dict.update({param: data_cp})

    return new_dict


a = generate_required_case(data, required)

for k, v in a.items():
    print(k)
    print(v)
--product_id:必选删除
{'skus': [{'sku_id': 123456, 'sku_value': {'test1': 'abc', 'test2': 'efg'}}], 'address': {'province': '知识', 'town': '力量'}}
--skus:sku_id:必选删除
{'product_id': 'amy', 'skus': [{'sku_value': {'test1': 'abc', 'test2': 'efg'}}], 'address': {'province': '知识', 'town': '力量'}}
--skus:sku_value:test1:非必选删除
{'product_id': 'amy', 'skus': [{'sku_id': 123456, 'sku_value': [{'test2': 'efg'}]}], 'address': {'province': '知识', 'town': '力量'}}
---skus:sku_value:test2:必选删除
{'product_id': 'amy', 'skus': [{'sku_id': 123456, 'sku_value': [{'test1': 'abc'}]}], 'address': {'province': '知识', 'town': '力量'}}
---address:province:必选删除
{'product_id': 'amy', 'skus': [{'sku_id': 123456, 'sku_value': {'test1': 'abc', 'test2': 'efg'}}], 'address': [{'town': '力量'}]}
---address:town:非必选删除
{'product_id': 'amy', 'skus': [{'sku_id': 123456, 'sku_value': {'test1': 'abc', 'test2': 'efg'}}], 'address': [{'province': '知识'}]}

data 是我们的接口中的 body 部分,required 是根据 yapi 中的参数项目映射生成的规则,比如 1 代表必填项,0 代表不必填项目,这样的话我们就可以得到必填项参数被删除,非必填项被删除的测试用例
2.根据参数类型生成基础用例
这个我是参考的https://www.cnblogs.com/twofool/p/10396710.html,写的很好,不再赘述了
一般这些是需要和测试平台接口自动化一系列联系起来的,用于快速接口测试的前置部分,分享一下我之前做的

共收到 3 条回复 时间 点赞

好奇问下,用这些生成类似随机字符串方式生成的用例,实际跑的时候不会因为不符合业务规则导致接口返回错误什么的吗?

陈恒捷 回复

会有这种情况,所以说这个是一个前置的过程,自动生成的其实相当于是一个全集合,实际过程当中需要根据实际情况删减用例
类似随机字符串方式 -- 你说的这个,代码不是随机生成的 (当然你可以写成随机的) 所有的参数返回都是根据 get_type_base_value 这个方法定义的类型参数返回来排列取值的,根据类型不同参数的定义是你自己可以设置的

社团已改为公开社团,外部可见。😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册