接口测试平台-79: 多接口之 小用例:url+header替换

上节中,我搞定了提取数据的持久化。现在来测试一下:

准备俩个步骤接口,第一个仍然是昨天例子那个可以通的x度接口。第二个可以不通,不是真接口,主要验证在url/header/body中 是否能成功接收并代入第一个接口的返回值qid和en:

注意上图,其中6处加上了替换的占位符。但是保存的时候出现了问题~:

因为这种替换规则,静态检查会误报header不符合规范,所以先暂时删除header的前端验证,然后刷新页面,再次按上图保存:

保存成功后,要在代码中加上一些输出,以便后续判断请求数据是否正常:

测试结果为:

很显然,失败了~

其实这是上节故意埋下的一个坑,原因是想让大家深刻的知道一个unittest的特性,就是各个test小用例函数之间是无法通过类变量或其他局部变量 互通数据的,这样也保证了各个小用例的独立性,符合高内聚/低耦合的价值观。这点是和普通类各个子函数之间用类变量互通数据是完全不一样的。

那么现在知道了问题所在,要怎么修复呢?其实很简单,既然类变量不行,弄成全局变量总可以了吧~

 

所以按照下面方法改这俩处:

放弃使用self. 的类变量形式,转而用全局变量来存储。然后重启服务,再次运行看看结果:

仍然报错了,不过这次的问题变了,不再是找不到qid和en了,这就说明,用全局变量保存提取结果的设计成功了。

但是现在面临的新报错是什么意思呢?

上面说,replace函数不能去替换int整形,它只能把字符串塞进去。因为前面提取的时候,用过路径法而特意提取了一个int的en。

在第二个步骤接口替换的过程中,url,header,body等地方 都是字符串,替换也是完全按照字符串替换,所以导致了这次报错,而现在应该知道,url中应该是字符串。

而header和body中,需要对其进行符合原本类型的替换,那就绝对不能简简单单用replace函数来替换了。所以,替换代码这里要 大改!

 

首先是url,全部强制变成str字符串

运行,看看结果:

可以看到,替换成功了。

 

接下来是header:header和url一样,值只能是字符串,所以如下改:

下面实际请求代码块这里要进行一个兼容性的设计:

 

最后就是body了,比较复杂,替换参数时,类型也要保持住不能丢失。

但是这里就要进行一个细分了,因为请求体类型有多种, 例子中的是这样form-data,这种情况的请求体参数值基本只是字符串,所以无论输入什么都会被当作字符串:

比如 :使用者输入的是avc

那么最终的请求体这个参数的值应该是:"avc" 才对。如果 使用者输入的是'abc',带了引号。

那么请求体最终参数值应该是:"'avc'" 才对。 一切输入都会被当作字符串的一部分。不信的可以去用postman试试看。那么代码中要怎么处理呢?

form-data这种,都要把全部内容拿过来当作字符串值,且强行转变成字符串。 后面的x-www....和raw的,处理方式都不一样。这里之后会按顺序一个一个研究如何实现。

 

所有的测试用例 预期,必须保证和postman一摸一样的效果才可以。这里大家可以多研究下postman的发送代码。

 

本节就到此结束了。最后发一下这个demo函数目前进度的完整代码:

def demo(self, step):
    time.sleep(3)
    print(step.api_url)
    # 提取所有请求数据
    api_method = step.api_method
    api_url = step.api_url
    api_host = step.api_host
    api_header = step.api_header
    api_body_method = step.api_body_method
    api_body = step.api_body
    get_path = step.get_path
    get_zz = step.get_zz
    assert_path = step.assert_path
    assert_zz = step.assert_zz
    assert_qz = step.assert_qz

    # 检查是否需要进行替换占位符的
    # # url
    rlist_url = re.findall(r"##(.+?)##", api_url)
    for i in rlist_url:
        api_url = api_url.replace("##" + i + "##", str(eval(i)))

    # # header
    rlist_header = re.findall(r"##(.+?)##", api_header)
    for i in rlist_header:
        api_header = api_header.replace("##" + i + "##", str(eval(i)))
    # 实际发送header
    try:
        api_headers = json.loads(api_header)
    except:
        api_headers = eval(api_header)

    # # body
    rlist_body = re.findall(r"##(.+?)##", api_body)
    if api_body_method == 'none':
        pass
    elif api_body_method == 'Json':
        for i in rlist_body:
            api_body = api_body.replace("##" + i + "##", repr(eval(i)))
    else:
        for i in rlist_body:
            api_body = api_body.replace("##" + i + "##", str(eval(i)))

    # 输出请求数据
    print('\n')
    print('【host】:', api_host)
    print('【url】:', api_url)
    print('【header】:', api_header)
    print('【method】:', api_method)
    print('【body_method】:', api_body_method)
    print('【body】:', api_body)

    # 发送请求
    res = views.api_send_basic(api_method, api_host, api_url, api_headers, api_body_method, api_body)

    # 对返回值res进行提取
    # # 路径提取法
    if get_path != '':  # 说明有配置
        for i in get_path.split('\n'):
            key = i.split('=')[0].rstrip()
            path = i.split('=')[1].lstrip()

            py_path = ""
            for j in path.split('/'):
                if j != '':
                    if j[0] != '[':
                        py_path += '["%s"]' % j
                    else:
                        py_path += j

            value = eval("%s%s" % (json.loads(res), py_path))
            exec('global %s\n%s = value ' % (key, key))

    # # 正则提取法
    if get_zz != '':  # 说明有配置
        for i in get_zz.split('\n'):
            key = i.split('=')[0].rstrip()
            zz = i.split('=')[1].lstrip()

            value = re.findall(zz, res)[0]
            exec('global %s\n%s = "%s" ' % (key, key, value))

    # 对返回值res进行断言

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值