• 《上海悠悠接口自动化平台》1.新增API 与 各参数的描述 上海


    前言

    每个API 对应一个接口,每个API 的关键字参数根据httprunner2 框架来定义的

    API 描述

    我们先看一个简单的登录接口,接口描述如下

        访问地址:/api/v1/login/
        请求类型:POST
        请求头部:application/json
        请求参数:{"username":"test", "password":"123456"}
    

    需注意的是接口地址,只需要写相对路径,比如http://127.0.0.1:8000/api/v1/login/
    前面的http://127.0.0.1:8000 这部分是环境地址,因为环境是可变的,
    环境会有多套:

    • 开发环境
    • 测试环境
    • 联调环境
    • 预发布环境。

    所以不要在接口地址里面把环境地址写死了

    小笔记
    如果你的接口地址里面带有 `http/https` 前缀的绝对地址, 那么你选运行环境的时候,环境会无效,运行的时候根据你写死的地址运行
    如果你的接口地址是相对地址`/api/v1/login/`, 那么可以选不同环境运行
    

    对照api的yaml文件

    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
         - eq: [status_code, 200]
    

    参数解释:

    参数 是否必须 作用
    name 必选 接口的名称
    request 必选 requests库的request 对象
    validate 可选 校验结果,api层只做接口基本校验,比如状态码

    request 参数

    request 参数对应 requests 库里面的 Request 对象

    import requests
    
    
    s = requests.Session()
    r = s.request()
    

    可以点进去request 看源码可以支持哪些参数

    def request(
            self,
            method,
            url,
            params=None,
            data=None,
            headers=None,
            cookies=None,
            files=None,
            auth=None,
            timeout=None,
            allow_redirects=True,
            proxies=None,
            hooks=None,
            stream=None,
            verify=None,
            cert=None,
            json=None,
        )
    

    创建一个Request

    # Create the Request.
            req = Request(
                method=method.upper(),
                url=url,
                headers=headers,
                files=files,
                data=data or {},
                json=json,
                params=params or {},
                auth=auth,
                cookies=cookies,
                hooks=hooks,
            )
    

    如果你对requests有过一些基本的使用,结合上面的源码,那就很清楚每个参数是干什么的了

    参数解释:

    参数 是否必须 作用
    method 必选 请求方式:GET/POST/PUT/DELETE
    url 必选 尽量写相对路径: /api/v1/login/
    type 可选 这个是区分参数类型:params/json/data
    Query Params 可选 url上的查询参数,如:/api/data?page=1&size=10
    json 可选 POST 请求的JSON 类型参数,application/json 格式
    data 可选 POST 请求的data 类型参数,application/x-www-form-urlencoded 格式
    headers 可选 请求头部参数

    前面的登录接口示例

    这里headers 参数可以不用加,type类型选了json,会自动在请求头部加上application/json 格式 (这是requests框架自带的功能)

    变量的声明与使用

    账号和密码不能写死了,因为可能在其它地方会用其它账号登录,需要复用API接口

    变量的声明格式$varname,需注意的是变量必须放在字符串中声明,如上图。

    声明变量后,必须要设置变量,不然用例转换不通过

    这里的变量值给个初始值,方便调试通过

    Validate 校验结果

    接下来就是断言的使用,当用例运行完之后,我们需要添加检查点,校验返回结果。
    API 层我们不需要加业务逻辑校验,只做接口基本校验,这里的接口还不涉及业务逻辑,简单的判断是200 OK就行了,或者校验结果返回的是JSON格式

    Response 对象

    那么校验的时候,有哪些对象可以使用呢?如果check地方写的语法不正确,那么会有以下报错

    available response attributes: status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url.
    

    可以接收的 response 对象
    status_code: 状态码200, 404 等
    cookies: cookies
    elapsed: 响应时间
    headers: 返回头部
    content: 响应内容的bytes数据
    text: 响应内容的文本数据
    json: 响应内容的json数据
    encoding: 响应编码
    ok: 返回bool值,状态码小于400为True
    reason: 状态码对应的描述,如:OK, NOT FOUND等
    url: 完整url地址

    如果你对requests框架熟悉,那么跟Response定义是一一对应的

    class Response:
        """The :class:`Response <Response>` object, which contains a
        server's response to an HTTP request.
        """
    
        __attrs__ = [
            "_content",
            "status_code",
            "headers",
            "url",
            "history",
            "encoding",
            "reason",
            "cookies",
            "elapsed",
            "request",
        ]
    

    提取返回结果

    我们在提取返回结果的时候,经常会用到

    • status_code 响应状态码
    • body或content 响应body内容
    • headers 响应头部

    比如我们响应的头部内容

    返回的头部以字典方式返回

    { "Date": "Thu, 20 Oct 2022 14:21:09 GMT", "Server": "WSGIServer/0.2 CPython/3.6.8", "Content-Type": "application/json", "Allow": "POST, OPTIONS", "X-Frame-Options": "SAMEORIGIN", "Content-Length": "110", "Vary": "Cookie", "Set-Cookie": "sessionid=in28ks6u92r7bvreklxcysdkuhklff3w; expires=Thu, 03-Nov-2022 14:21:09 GMT; HttpOnly; Max-Age=1209600; Path=/" }
    

    于是可以通过点的方式取值

    headers.Content-Type
    

    这样就能取到对应的值"application/json"

    如果是需要提取body内容

    { 
    "code": 0, 
    "msg": "login success!", 
    "username": "test1", 
    "token": "eeefb5f49316d9ecba367473fae6130b595cb7be" 
    }
    

    于是可以这样取值

    body.code
    body.token
    

    注意:并不是所有的token取值,都是body.token, 还有一种情况,token可能嵌套在data里面

    { 
        "code": 0, 
        "msg": "login success!", 
        "data": {
            "token": "eeefb5f49316d9ecba367473fae6130b595cb7be" ,
            "username": "test1"
        }
    }
    

    那么token取值是这样的

    body.data.token
    
    小笔记
    1.body 和 content 通用
    2.字典取值body.key名称,如果有嵌套:body.key.嵌套的key, 继续点取值
    

    学到这里一些基础的概念差不多的都掌握了,还有一些复杂场景:hooks 和extrat 功能没有讲到。

  • 相关阅读:
    093孤荷凌寒自学第179天区块链093天Dapp048
    092孤荷凌寒自学第178天区块链092Dapp047
    091孤荷凌寒自学第177天区块链091天Dapp046
    090孤荷凌寒自学第180天区块链090天Dapp045
    089孤荷凌寒自学第175天区块链089天Dapp044
    088孤荷凌寒自学第174天区块链088天Dapp043
    087孤荷凌寒自学第173天区块链087天Dapp042
    孤荷凌寒自学第172天区块链086天Dapp041
    孤荷凌寒自学第171天区块链085天Dapp040
    iOS开发——高级篇——内存分析,Instruments
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16811599.html
Copyright © 2020-2023  润新知