• 一步一步教你打造接口测试平台(2)


    这一节我们实现下面两个功能

    • 自动判断服务器响应的状态码,如果状态码是4xx,5xx的话则认为请求失败
    • 增加断言功能,可以判断响应的json字符串里是否包含预期的字段

    为了测试方便,我们先在main.py文件中增加2个测试的接口

    @app.route('/api')
    def api():
        return jsonify({'name': 'etf', 'version': '0.01'})
    
    @app.route('/error')
    def error():
        codes = [404, 401, 403, 500]
        random.shuffle(codes)
        abort(codes[0])
    
    • /api接口返回json字符串{"name": "etf", "version": "0.01"}
    • /error接口随机抛出401, 403, 404, 500错误中的1个

    实现状态码自动判断

    再修改handle_get()方法

    def handle_get():
        url = request.form['url']
        try:
            r = requests.get(url)
        except Exception as e:
            print(e)
            r = None
    
        resp = build_resp(r)
    
        return render_template('home.html', resp=resp)
    
    def build_resp(r):
        resp = {'success': False}
        if r is None:
            return resp
    
        if r.status_code < 400:
            resp['success'] = True
    
        resp['url'] = r.url
        resp['text'] = r.text
        resp['headers'] = r.headers
        resp['status_code'] = r.status_code
    
        return resp
    
    

    这里我们新增了build_resp(r)方法,该方法的主要作用是判断请求响应的状态码,如果小于400就将请求成功状态设置为True。

    下面修改前端页面home.html

    <div class="container">
      <h3 class="text text-center main-title">ETF接口测试平台</h3>
      <form action="/handle_get" method="post">
        <div class="form-group">
          {% if resp and resp['url'] %}
          <input type="text" name="url" id="url" placeholder="请输入URL" class="form-control" autofocus value="{{resp['url']}}">
          {% else %}
            <input type="text" name="url" id="url" placeholder="请输入URL" class="form-control" autofocus>
          {% endif %}
        </div>
        <div class="form-group">
          <input type="submit" name="submit" value="确定" class="btn btn-primary">
        </div>
      </form>
      <hr>
    
      {% if resp['success'] %}
        <p>接口地址: {{resp['url']}}</p>
        <p>状态码: {{resp['status_code']}}</p>
        <hr>
        <p>Headers</p>
        {% for key, value in resp['headers'].items() %}
          <p> <pre><code>{{key}}: {{value}}</code></pre> </p>
        {% endfor %}
    
        <hr>
        <p>Body</p>
        <pre>
          <code>
            {{resp['text']}}
          </code>
        </pre>
      {% else %}
        <p class="text text-danger">执行失败</p>
        <p class="text text-danger">状态码: {{resp['status_code']}}</p>
        <p class="text text-danger">响应: {{resp['text']}}</p>
      {% endif%}
    </div>
    

    上面主要的修改是回显get请求的url,另外如果请求是失败状态,就展示失败的信息。

    修改完成后,使用/error接口进行测试,效果如下

    实现断言

    我们使用最偷懒最不安全的方式去实现断言,使用python的eval()方法,大家有兴趣可以自行了解一下。该方法主要的作用就是动态去执行一段python代码,是黑魔法,不安全,仅仅作为演示使用,大家不要在生产环境使用。

    我们的设计是让用户在页面上输入一个断言表达式,也就是纯python代码。默认情况下我们将服务器返回的json字符串转换成python字典,并赋值给obj变量。简单理解的话就是服务器的返回会自动转成名为obj的字典对象,我们可以使用下面的语法来进行断言

    • obj['name'] == 'tfl'
    • obj['key'] == 'value'
    • obj['key1']['key2'] == 'value1'

    也就是提供1个python表达式,只要表达式返回的是boolean值就好了。

    实现后效果如下,我们使用/api接口进行测试

    上面我们测试了断言通过和失败的情况,一切如预期。

    main.py中实现的核心代码其实很简单。

    def handle_get():
        url = request.form['url']
        assertion = request.form['assert']
        assertion_success = None
        try:
            r = requests.get(url)
            if assertion is not None and assertion != '':
                obj = r.json()
                if assertion:
                    assertion_success = eval(assertion)
        except Exception as e:
            print(e)
            r = None
    
        resp = build_resp(r)
        resp['assertion'] = assertion
        resp['assertion_success'] = assertion_success
    
        return render_template('home.html', resp=resp)
    
    

    上面的代码里我们将用户输入的python表达式直接使用eval方法执行,如果表达式为真,则断言通过,否则失败。该方法很危险,大家可以去搜索一下为什么。

    前端页面的核心修改如下

    {% if resp['assertion_success'] is not none %}
      {% if resp['assertion_success'] %}
        <p><strong class="text text-success">断言成功</strong></p>
      {% else %}
        <p><strong class="text text-danger">断言失败</strong></p>
      {% endif %}
      <p><code>{{resp['assertion']}}</code></p>
      <hr>
    {% endif %}
    

    判断断言执行的状态并给予相应的显示。

    完整代码请点击这里

    总结

    • 状态码只要大于等于400我们就可以认为请求失败,大家可以去搜索一下为什么这样子?
    • 使用eval()动态执行代码非常危险,因为用户可以输入任意代码,严重情况下这些代码可能导致你的服务器被黑客攻陷,所以在生产环境一定不要使用该方法。
    • 永远不要相信用户输入,上面的代码只是演示,并没有什么实用价值。
  • 相关阅读:
    P4363 [九省联考2018]一双木棋chess 状压DP
    P5290 [十二省联考2019] 春节十二响 贪心
    P3747 [六省联考2017]相逢是问候 欧拉公式
    P5443 [APIO2019]桥梁 操作分块+可撤销并查集
    P4146 序列终结者 FHQ_TREAP
    108. Convert Sorted Array to Binary Search Tree
    神经网络中Epoch、Iteration、Batchsize相关理解
    905. Sort Array By Parity
    100. Same Tree
    538. Convert BST to Greater Tree
  • 原文地址:https://www.cnblogs.com/nbkhic/p/9279242.html
Copyright © 2020-2023  润新知