Skip to content

136.前置条件支持HTTP请求

大家好~我是米洛
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记,获取最新文章教程!

回顾

上一节我们编写了har文件转RequestInfo相关的内容,但就在进行下一步的时候,我发现我们的前置条件还并不支持http请求,这就导致我们只能把拆出来的多个接口转为多个用例,这显然是不好的做法。

所以这一节我们需要让前置条件支持http请求,并稍微做出一些样式上的调整。

前端部分

我们这次不同于以往,由于http请求其实也是前置条件的一种,所以理论上来说,后端的增删改查接口都是有的。

我们先改造下对应的页面,再到后端支持Http执行器即可。

我们先来看看现有的前后置条件:

可以看到这个页面确实不太好看,为啥呢,我感觉主要是这样:

  • 有些表单不需要那么长的输入框,但是却独占了一行,导致整个页面很松散

所以我们需要进行一定的整合,我们来看看整合后的:

不能说好看了,但是起码一个页面内能够放下这些内容了,少了一个滚动条。

其实我做的就是,把有些字段不需要那么多输入框的,给合并到一行显示了,这样起码不会那么占高度了。

接着来看看SQL前置的对比:

  • 改造前

  • 改造后

首先是左侧的菜单拉高了,感官上会比前者好一点。

最后我们来看看新版的http请求组件,由于其他地方也有用到,所以我稍微复用了一下(总体来说组件设计的不是太好,勉勉强强改造了,后续肯定需要重新设计一番的)

前端上面的改造就介绍到这里,其实也就是复用了一下http相关的组件,我们来看看后端部分

后端部分

后端部分,我们只需要补充对应的Constructor即可。

新增app/core/constructor/http_constructor.py

import json

from app.core.constructor.constructor import ConstructorAbstract
from app.crud.config.AddressDao import PityGatewayDao
from app.middleware.AsyncHttpClient import AsyncRequest
from app.models.constructor import Constructor


class HttpConstructor(ConstructorAbstract):

    @staticmethod
    async def run(executor, env, index, path, params, req_params, constructor: Constructor, **kwargs):
        try:
            executor.append(f"当前路径: {path}, 第{index + 1}{HttpConstructor.get_name(constructor)}")
            data = json.loads(constructor.constructor_json)
            url = data.get("url")
            if data.get("base_path"):
                base_path = await PityGatewayDao.query_gateway(env, data.get("base_path"))
                url = f"{base_path}{url}"
            headers = json.loads(data.get("headers"))
            client = await AsyncRequest.client(url=url, body_type=data.get("body_type"), headers=headers,
                                               body=data.get("body"))
            resp = await client.invoke(data.get("request_method"))
            executor.append(f"当前{ConstructorAbstract.get_name(constructor)}类型为http, url: {url}")
            if constructor.value:
                params[constructor.value] = resp
            executor.append(
                f"当前{ConstructorAbstract.get_name(constructor)}返回变量: {constructor.value}\n返回值:\n {resp}\n")
        except Exception as e:
            raise Exception(
                f"{path}->{constructor.name}{index + 1}{HttpConstructor.get_name(constructor)}执行失败: {e}")

我们继承自ConstructorAbstract类,并实现里面的run方法。通过反序列化constructor_json获取http请求的相关数据:

  • url
  • request_method
  • headers
  • base_path
  • body

获取到了之后就可以发送http请求了,最后把请求结果返回写入params字典,和其他类型的数据构造器差不多

我们在获取数据构造器这里加上http类型,接着就可以嚣张地等待奇迹出现了:

可以看到,http请求已经被顺利获取并完成了,至此,除了mq相关的前后置条件,其他内容我们基本上都已经完成了。

下一节我们还是的将思绪拉回到如何提取接口间的依赖数据