栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pytest+ymal设计接口自动化框架过程记录(一步一步记录如何设计)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pytest+ymal设计接口自动化框架过程记录(一步一步记录如何设计)

之前也写了一个测试框架,不过用例需要用代码来编写基于pytest搭建接口自动化测试框架,提供源码 1.第一步我先写一个环境配置文件,按自己公司环境配置,我这边只有测试和生产环境,配置协议,域名和headers。后续我只有提供地址和请求参数就可以发起接口访问

2.我写一个读取文件的类,准备用于处理文件相关,现在只有读取yaml问的方法,后续准备写读取execl、execl和yaml用例数据转换,用例数据处理。


方法测试:

3.环境配置总开关,一开始我是想把环境这个参数放着请求时填写的,最后发现比较麻烦,一切以简单明了为好

4.写一个读取并处理配置文件信息的方法,使用我之前写的读取ymal的方法,把数据组合起来

5.初步封装requests方法,大部分接口都是这2个请求场景,针对公司接口格式封装


测试请求数据读取情况,读出来最终url,headers,data

6.yaml格式用例设计


测试读取,按照注释的格式来(设计时各种报错)

7.编写用例请求参数依赖方法(接口返回值提取和接口参数依赖),一个图截不下啊

data_is_replace()判断数据需不需要替换,data有可能是空,因为一些接口不需要请求参数,或者不需要提取接口返回值

搞个代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@time    : 2022/6/14 
@Author  : LL
@File    : parameter_setting.py
参数处理
'''
from jsonpath import jsonpath

class ParameterSetting:
    # 参数存放和提取
    access_value = {'b': 213, 'g': 21}
    @classmethod
    def data_is_replace(cls, data):
        '''
        :param data: 请求参数data和提取参数extract_key
        :return: 返回参数是否需要被替换
        '''
        if data is None:
            return False
        for k, v in data.items():
            if '$.' in v:
                return True
        return False
    @classmethod
    def parameter_setting(cls, data: dict, type='get'):
        '''
        :param data: 返回结果提取和参数依赖使用dict 例:{'bill': '$.bill'}
        :param type: save :把数据存到参数池里面无返回,get读取参数池数据并返回新值
        :return:
        '''
        if type == 'get':
            # {'b': '$.b','g':'$.g'} 提取格式键+提取表达式
            for k, v in data.items():
                if '$.' in v:
                    v = jsonpath(cls.access_value, v)[0]
                    data[k] = v
            print(f'最终返回参数:{data}')
            return data
        elif type == 'save':
            # {'a':44,'a1':144} 键 + 明确的值
            for k, v in data.items():
                # 把data的键值添加到参数池里面
                cls.access_value[k] = v


if __name__ == '__main__':
    # 测试参数存储
    ParameterSetting.parameter_setting({'a': 44, 'a1': 144}, 'save')
    # 测试参数读取
    ParameterSetting.parameter_setting({'b': '$.b', 'g': '$.g'})
    print(f'最终的参数池{ParameterSetting.access_value}')

测试

8.写一个读取用例数据的迭代器,可以判断是否需要执行,把请求参数表达式替换为具体的值,测试结果也截图了,但是这个方法只能读取单个文件的数据,后续处理多个文件。或者直接读取整个文件,还可以设置排除用例文件的方式运行


测试代码这里使用了生成器来一条一条的返回 生成器我之前写过一篇 python生成器+pytest实现参数化

9.设计处理断言列表的方法,这里我发现没有替换成功,i=i.replace(json_path,value)需要把值接住才可以


我把新列表(已经把json表达式替换成了值)遍历解析每一个断言元素时遇到 requires string as left operand, not int报错,大概意思就是


我在把这个12加上了单引号[“‘12’ in ‘123’”, ‘ig == $.ig’], 然后后面的 'ig == $.ig’又出现了新问题,ig变量未定义,ig本来是‘ig’为字符串,但是被eval()函数处理后就会变成ig,是一个变量

于是我又给ig加上了引号

可是被替换为值的TheShy被eval()函数处理后又成了变量,我想着给"$.ig"加上引号,可是在jsonpath提取时出现了问题
打印下我的提取表达式提取表达式格式错误了,没取到值。发现我给之前的表达式加上了引号,我提取表达式是通过符号的索引位置到最后一个索引位置,现在我只能取倒数第二个索引位置

经过我的一顿操作,勉强解决问题,需要完善一下这个方法

方法完善,大改一波,测试结果,但是这里出现的问题,不得不修改用例模板断言列表的编写格式

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@time    : 2022/6/15
@Author  : LL
@File    : assert_.py
断言格式 ["1=='1'", "cc=='dad'", "12 in '123'", 'ig in $.lpl.ig']
'''
from jsonpath import jsonpath

class Assert:
    @classmethod
    def assert_response(cls, assert_list: list, api_response: dict):
        new_assert_list = []
        for i in assert_list:
            if '$.' in i:
                # 获取$的索引位置
                wz = i.find('$')
                # 切片出表达式
                json_path = i[wz:len(i) - 1]
                # 把表达式转换为值
                value = jsonpath(api_response, json_path)
                if not value:
                    print('表达式提取失败,请检查')
                    return False
                value = value[0]
                # 用值把表达式替换掉(注意这个需要用变量接住这个替换的新值)
                i = i.replace(json_path, value)
            new_assert_list.append(i)
        print(f'断言新列表:{new_assert_list}')
        #判断每个断言的成功或者失败
        assert_result_list=[]
        for i in new_assert_list:
            assert_result = eval(i)
            print(f'断言表达式{i},断言结果{assert_result}')
            assert_result_list.append(assert_result)
        #如果断言结果列表里面有一个失败,那就断言失败
        if False in assert_result_list:
            return False
        return True

if __name__ == '__main__':
    print(Assert.assert_response(["'12' in '123'", '"ig" == "$.ig"', '1==1'], {'id': 1, 'ig': 'TheShy'}))

10.用例格式更改,还是使用原始列表格式写断言列表

到这里为止和pytest还没啥关系啊
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号