接口自动化测试传值处理实战,精心整理详细教程

一、前言

自动化测试要找到一个平衡点,特别是要注意与其他级别的测试相互配合,如单元测试、 UI自动化测试、人工测试等等

在测试之前,我们可以预先定义一组分层测试的规格说明,也就是哪些逻辑应该有接口自动化测试保证,哪些逻辑由用户测试来保证

当我们进行不同级别的测试时,我们可以相互合作以达到一个高的测试覆盖率

在接口自动化测试过程中不仅仅有单接口的测试,场景测试也必不可少,这就造成接口与接口之间存在传值问题,介绍一下在 pytest 框架下怎样进行接口传值处理

接口数据总体可分为前置处理和后置处理:

前置处理:一些固定值或固定方法的调用

后置处理:需要前几个请求中的body(参数)、response(响应)

二、数据准备

前置处理:

前置处理用<>和[]来标记(标记符可按自己需求进行更改)

正则匹配数据中包含这两种标记时,读取调用methlib.py或config.py中的方法,具体调用哪个固定值或方法,根据标记里面写入的参数调用,并对数据进行替换。其中 < > 用于标记固定值,[ ] 用于标记固定方法

 

后置处理:

后置处理用&&、{}、==、## 来标记(标记符可按自己需求进行更改)

正则匹配数据中包含这几种标记时,读取requestmsg.txt中数据,具体读取哪一行数据,根据关联列的数据进行判断,并对数据进行替换。其中&&用于标记取上一步的body、{ } 用于标记取上一步的response、== 用于标记取前几步的body、## 用于标记前上几步的response

 

 

注:
① excel表中的用例传参数据需要以字典形式写入

② 表格数据中加入关联列,用于判断读取第几个请求的参数或响应

③ 对于部分接口需要加密的接口,在表格数据中加入是否加密列,用于判断该接口的参数是否加密

三、测试流程

前置处理:

读取到的excel表格数据是一个模块的数据,经过pytest的处理,会将模块中的多个接口数据(列表)进行单个接口的传输,是不用经过任何请求得到的数据,所以将其放在单独的数据处理中。下面是仅经过前置处理的流程

 

后置处理:

需要经过前面几个接口的请求或响应而得到的数据,所以必须将其放在request请求之前,并且每发送一个接口请求,都需要在request.txt中写入该请求的body和response,以便给后面的接口使用。下面是仅经过后置处理的流程

 下面是经过前置和后置处理的接口测试流程

 

四、代码实现

前置处理的实现:

前置处理与其他请求的参数、响应无关,所以可以整个模块进行处理

def param_method(dic_param):
	"""
	固定值、取方法(不需要上一步的body和response)
	:param dic_param: 必须是个字典(data里面的参数)
	:return:
	"""
	temp_mobile_ = []
	temp_email_ = []
	temp_pid_ = []
	for j in dic_param.keys():
		value__ = dic_param[j]
		_ = re.findall(r'\<(.*?)>', str(value__)) # 固定值
		__ = re.findall(r'\[(.*?)]', str(value__)) # 取方法
		if _: # 判断是否存在apk固定传值
			dic_param[j] = param[f'{_[0]}']
		if __:
			if j == 'mobile' or 'phone' or 'phoneNum':
				dic_param[j] = mobile()
				temp_mobile_.append(dic_param[j])
			if j == 'email':
				dic_param[j] = email()
				temp_email_.append(dic_param[j])
			if j == 'pid':
				dic_param[j] = pid()
				temp_pid_.append(dic_param[j])
			if j == 'app_order_id':
				dic_param[j] = get_random_str(30)
	return dic_param

后置处理的实现:
后置处理与其他请求的参数、响应相关,所以必须在每个请求之前进行处理,下面展示的是后置处理的方法,由于代码过长,只展示了部分后置处理代码。

def prev_body_res(dic_param, relevance=None):
    '''
    取上步body、取上步response,当relevance不为空时取上几步body、response
    :param dic_param: 必须是字典格式
    :return:
    '''
    request_file = r'./requestsmsg.txt'
    for j in dic_param.keys():
        value__ = dic_param[j]
        ___ = re.findall(r'\&(.*?)&', str(value__))  # 取上步body
        ____ = re.findall(r'\{(.*?)}', str(value__))  # 取上步response
        _____ = re.findall(r'\#(.*?)#', str(value__))  # 取前几步的response
        ______ = re.findall(r'\=(.*?)=', str(value__))  # 取前几步的body
        if ___:
            request_res = readtxt(request_file)
            request_body = request_res[1]
            key = ___[0]
            res_data = request_body[f'{key}']
            dic_param[j] = str(res_data)
        if ____:
            request_response = readtxt(request_file)
            request_response = request_response[0]
            key = ____[0]
            res_data = request_response['data']
            if res_data:
                if isinstance(res_data, list):
                    temp_value = get_dict_value(request_response['data'][0], key)
                    dic_param[j] = temp_value[0]
                    temp_value.clear()
                else:
                    temp_value = request_response['data'][f'{key}']
                    dic_param[j] = str(temp_value)

后置处理具体应用:
由于后置处理需要前面的请求完成之后才能得到想要的数据,所以具体后置处理放在每个请求处理之前,下面展示的是具体请求的应用。

  else:  # 传值
        line_data = prev_body_res(line_data, relevance_no)
        if i['encryption'] == '0':  # 不加密
            if header['Content-Type'] == 'application/json':
                response = requests.request(f'{request_type}', url=url, headers=header, data=json.dumps(line_data))
                write_request(response.json(), no, line_data)
                logger.info(f'response:{response.json()},no:{no},body:{line_data}')

基于pytest实现的模块传值处理:以数据准备中的邮箱登录模块为例:parametrize这个装饰器可以将整个模块的数据进行逐一发送给下面定义的方法。

 @allure.story('邮箱登录')
    @pytest.mark.qa
    @pytest.mark.formal
    @pytest.mark.parametrize('excel_data', change_data(module_data('邮箱登录'), len(module_data('邮箱登录'))))
    def test_login_email(self, excel_data):
        response = decide_value_relevance(excel_data)
        judge_result(response, '邮箱登录')
        title = excel_data['title']
        allure.dynamic.title(f'邮箱登录:{title}')

五、总结

基于pytest我们可以将我们需要测试的场景以模块形式组装起来,再利用传值,就可构建出多个不同的正常、异常场景,增加关联性

利用表格来构建数据,也增加了构建脚本的灵活性

对界面进行自动化测试,可以实现对人工测试不容易进行的验证,如验证接口中大量数据的排序、多字段比较等,如果都是通过人肉进行的,则效率问题是不可接受的

功能逻辑难以由手工完全验证,一些异常、极限场景难以由手工构建,此时如果理解接口的内部逻辑,则使用脚本有目的地构造此类场景,从而触发接口的内部逻辑,从而对这些逻辑进行验证测试,这相对容易

对针对线接口采用定时自动测试,可启动一定的监控作用,当接口功能有问题时,通过定时巡检即可及时发现

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值