httprunner_接口框架问题汇总

欢迎进行接口(httprunner)、UI自动化(pytest)交流,博主微信:jiaotengfei1016


常用接口工具对比:

postman:不适合自动化,强行做也可以搞,不是最优解
jmeter:用例管理是针对性能设计的,管理case不方便,jmeter+junit完善后可以解决,不推荐
requests:推荐
httprunner:基于requests封装的国内做的比较好的接口框架。推荐

httprunner_问题1:yml转pytset用例?

解决:hmake xx.yml

httprunner_问题2:如何解决多模块的函数封装?

原理:httprunner运行用例,会对用例里面所调用的函数进行正则匹配,然后加载debugtalk.py中对应的函数。所以,只要保证函数能入dbugtalk.py即可。

(1)新建libs目录;
(2)不同的模块需要封装的函数,放在不同的文件中;
(3)在debugtalk.py中导入该模块。
在这里插入图片描述

httprunner_问题3:解决了登录后产生的十几个接口的问题?

背景:登录后各种重定向,最终产生了16个接口,将特性界面的接口cookie、token进行分析后,发现从登录用例里面传递出了3个cookies参数,加上token是4个,开启分析登录接口模式,接口间各种传参、重定向,传的我欲仙欲死,最终搞定。这几天在技术群听到说httprunner是登录后,后面的接口步骤都是基于登录产生的临时session,这样的话岂不是解决了我这十几个接口的问题,省去了每次调用接口都要跑十几个接口,跑完200多个用例,日志文件20M,我凑!
解决:
(1)直接写了登录的post接口,不进行跨脚本传参,其中的某参数是登录的get接口从返回的html文件中动态获取的,
(2)用例里面,调用登录接口,
(3)调用获取token的接口(刚进入界面的时候会出发这个接口)
(4)调用你要测的接口,其中.header()里面只需要传入token这个变量即可,cookies是自动继承上面登录的临时会话session中的cookies,

httprunner_问题4:如何在debugtalk.py中提取.env文件里面的值?

场景1:用pathlib模块提取.env文件中某个变量的值

from pathlib import Path
# 读取.env文件的最后一行的 =号后面的 值
hostname = [i for i in Path('./config.ini').open()][-1].split("=")[1]
print(hostname)

场景2:httprunner提取.env文件中某个变量的值
若还需对读取的环境变量做进一步处理,则可以在 debugtalk.py 通过 Python 内置的函数 os.environ 对环境变量进行引用,然后再实现处理逻辑。

import os
def get_user_name():
	return os.environ["UserName"]

import os
def get_user_name(index):
	return os.environ[f"{index}"]

httprunner_问题5:大量的异常场景,如何进行参数化处理?

在参数化文件中,将校验参数和对应的入参相关联即可。

class TestCaseXxx(HttpRunner):
    @pytest.mark.parametrize("param", Parameters({
        "phone-password-message": [
        ("123123", "asdfasd", "success"), 
        ("123123", "asdfasd", "failed"), 
        ],}),)
    def test_start(self, param):
        super().test_start(param)

httprunner_问题6:因登录重定向产生的json()报错。

因登录后重定向,产生了太多的接口,在用session处理,获取各种token时,发现返回的数据无法.json()处理,报错:json.decoder.JSONDecodeError:Expecting value: line1 colunm 1 (char())

def get_token(tokenname):
	hostname = [i for i in Path('./config.ini').open()][-1].split("=")[1]
	se = requests.session()
	response_execution = se.get(url=f'{host}/cas/login', verify=False)
	execution = BeautifulSoup(response_execution.text, "lxml").find(attrs={"name":"execution"})["value"]
	se.post(url=host+'/cas/login', json={xxx}, verfity=False)
	fusiongis=se.get(url=f"{host}/fusiongxxx/csrftoken.do", verify=False).json()
	# 这里报错了:json.decoder.JSONDecodeError:Expecting value: line1 colunm 1 (char()) 
	
	# 这里token在返回的json里,可以直接提取,说明我的返回有问题,并不是提取的问题。
	login_ret = s.post(login_url, headers=header, data=body)
	token = login_ret.json()["token"]	

httprunner_问题7:下载文件的接口报错505?

(1)排查入参,初步判定是入参哪里的问题
(2)通过比较:har2case 转换其他下载文件的脚本,对比后发现是with_data()这里写成了with_json()。

httprunner_问题8:在多边形配置界面点击导出多边形,可在“异步报告导出界面”下载导出的文件,问题是:下载导出的文件返回200,body为空?

(1)返回200,初步判定入参没问题,
(2)body为空,是因为导出接口和下载文件的接口,没有做等待设置,
(3)解决办法:下载文件的接口前添加测试前置:setup_hook(“hook_sleep(5)”)。

httprunner_问题9:跑导出多边形,并在异步报告导出界面下载多边形的性能用例失败?报错:not found testcases

跑接口性能脚本注意事项:
(1)执行命令:locusts -f testcases/xxx/xxxtest.py【必须从testcases目录出发,文件以test结尾】
(2)脚本不能使用parameters做初始的参数化

httprunner_问题10:调测接口经常报错,针对不同响应码,如何排查?

302:接口重定向,意思就是访问了该接口后,没有返回200,直接又去访问当前接口里的refer的参数。这个参数是个新的地址。
400:请求的语法错误 >>> body题哪里错了 >>> 开发悄悄改了参数
404:url错了 >>> 少复制了字母,空格等
409:cookie传递错误 >>> 查询cookie的整个传递过程
505:body哪里错了,1个单词1个单词的排查 >>> 多复制少复制了内容,多写了个{ 等。

httprunner_问题11:如何利用pytest创建测试套(用于升级环境准备测试数据的测试套)?

1、pytest.ini配置文件中,添加标签markers = data
在这里插入图片描述
2、在写好的httprunner用例里面,class前面直接添加

import pytest
@pytest.mark.data()

这里注意:运行的话使用debug不会报错,标记完所需要的用例后
3、suiit.py文件执行,这里会自动执行所有标记为data的测试用例:

pytest.main(["-s", "test_webtest.py", "-m=data"])

httprunner_问题12:新拿到一个项目,接口自动化如何顺利开展工作?

在这里插入图片描述

httprunner_问题13:测试用例描述里面不能使用符号 $,本地运行不会报错,但是在linux中运行如下报错:

里面包含**$**符号的测试用例名:

@pytest.mark.skipif(read_ini_config("Header", "accept-language") == "zh-CN", reason="仅适用于xxx环境")
class TestCaseTest001CreateCouponGroup(HttpRunner):

    config = (
        Config(
            "添加优惠券,规则如下:xxx,价格是$50,xxx"
        )
        .base_url("${read_ini_config(Host, rem_host_001)}")
        .verify(False)
    )
httprunner.exceptions.VariableNotFound: 50 not found in {'orderNo': '1535341211049725953', 'checkToken': 'e4085c9dfe8442329b4830c45593c49b', 'quoteId': '1535341215009148929', 'reason': 'Others'}
variable_name = '50'
variables_mapping = {'checkToken': 'e4085c9dfe8442329b4830c45593c49b', 'orderNo': '1535341211049725953', 'quoteId': '1535341215009148929', 'reason': 'Others'}

    def get_mapping_variable(
        variable_name: Text, variables_mapping: VariablesMapping
    ) -> Any:
        """ get variable from variables_mapping.
    
        Args:
            variable_name (str): variable name
            variables_mapping (dict): variables mapping
    
        Returns:
            mapping variable value.
    
        Raises:
            exceptions.VariableNotFound: variable is not found.
    
        """
        # TODO: get variable from debugtalk module and environ
        try:
>           return variables_mapping[variable_name]
E           KeyError: '50'

/usr/local/Python-3.7.9/lib/python3.7/site-packages/httprunner/parser.py:229: KeyError

# httprunner_问题14:hrp pytest xxtest.py后,报错:E ModuleNotFoundError: No module named ‘pymysql’

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值