美文网首页思科DevNet每天自动化
Python实现API测试自动化

Python实现API测试自动化

作者: 自如_ | 来源:发表于2019-10-26 13:50 被阅读0次

    Request使用方法快速介绍

    Request是第三方库,需要手动安装:

    pip install requests

    需要导入requests模块

    import requests

    Requests中文文档:http://docs.python-requests.org/zh_CN/latest/
    这个文档看的话从哪看起呢,大家要有技巧,下面有目录(用户指南)这个地方,安装完成的话,这里有个快速上手。

    image.png

    大家如果以后看文档,有什么快速上手,通常可以先看它,像这种章节都是让你快速的了解下这个库的一些功能。常用的方法都卸载快速上手里面,怎么发送请求、传递URL参数、响应内容、定制请求头等等,下面介绍下怎么使用requests库构建请求,接收响应

    构建各种http请求

    • http.get请求
    requests.get('https://api.github.com/events')
    

    比如列出课程的请求代码

    import requests
    
    host = 'localhost'
    requests.get(f'http://{host}/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20 ')
    

    我们打开抓包工具Fiddler,然后运行代码,包就被Fiddler抓到了

    image.png

    我们用python代码一样可以发请求。


    • http.post请求
    requests.post('http://httpbin.org/post', data = {'key':'value'})
    
    • http.put请求
    requests.put('http://httpbin.org/put', data = {'key':'value'})
    
    • http.delete请求
    requests.delete('http://httpbin.org/delete')
    

    构建URL参数

    有一点我们要注意的是URL参数,我们可以直接这样。

    image.png

    直接写在里面没有关系。如果你觉得这种写法不是很清晰的话,你可以参照这种写法:

    语法

    payload = {'key1': 'value1', 'key2': 'value2'}
    requests.get("http://httpbin.org/get", params=payload)
    

    params参数接收的是一个字典,把URL参数去掉,把他定义在一个字典一样的数据结构里面。

    比如说

    import requests
    
    host = 'localhost'
    
    p1 = {
        'action':'list_course',
        'pagenum':'1',
        'pagesize':'20'
    }
    
    requests.get(f'http://{host}/api/mgr/sq_mgr/',params=p1)
    

    这样就可以了。


    构建请求头

    如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict (字典)给 headers 参数就可以了。

    例如,在前一个示例中我们没有指定 content-type:

    >>> url = 'https://api.github.com/some/endpoint'
    >>> headers = {'user-agent': 'my-app/0.0.1'}
    
    >>> r = requests.get(url, headers=headers)
    

    假如说我们上面的请求还要有请求头的话,就是在底下再添加一个headers参数

    image.png

    然后里面填上你所要带进去的请求头所对应的字典,比如例子里面就多了个user-agent值是my-app/0.0.1

    假如我想消息体头里面带上这两个参数'username':quanlei'password':111111这两个参数,要怎么带上去?就根据例子写吧,就像这样子

    import requests
    
    host = 'localhost'
    
    p1 = {
        'action':'list_course',
        'pagenum':'1',
        'pagesize':'20'
    }
    
    h1 = {
        'username':'quanlei',
        'password':'111111'
    }
    
    requests.get(f'http://{host}/api/mgr/sq_mgr/',params=p1,headers=h1)
    

    我们发送看一下请求消息是否带上这个消息头了。

    image.png

    是不是就可以了,是不是很方便。


    定制请求体

    请求体类型:Content-Type: application/x-www-form-urlencoded

    只需简单地传递一个字典给 data 参数

    >>> payload = {'key1': 'value1', 'key2': 'value2'}
    
    >>> r = requests.post("http://httpbin.org/post", data=payload)
    >>> print(r.text)
    {
      ...
      "form": {
        "key2": "value2",
        "key1": "value1"
      },
      ...
    }
    
    

    我们以添加课程为例,因为他也是Content-Type: application/x-www-form-urlencoded(表单格式)

    我们先看去以前的文章看下添加课程的接口文档:https://www.jianshu.com/p/b7125f62dd52

    大家注意一下data这个参数值

    data 必填 存储创建课程的信息,包括名称、描述、显示次序。
    为json格式。例如:{"name":"初中化学", "desc":"初中化学课程","display_idx":"4"
    }

    大家会说{"name":"初中化学", "desc":"初中化学课程","display_idx":"4" }这不是json吗?json其实就是一个json格式的字符串。大家注意这里只是符合json格式的字符串。直接把内容传进去就行。

    代码:

    import requests
    
    host = 'localhost'
    
    h1 = {
        'username':'quanlei',
        'password':'111111'
    }
    
    payload = {
        'action':'add_course',
        'data':'''
        {
          "name":"万圣节",
          "desc":"初中化学课程",
          "display_idx":"4"
                }'''
    }
    
    requests.post(f'http://{host}/api/mgr/sq_mgr/',headers=h1,data=payload)
    

    抓包看一下,请求成功了

    image.png

    这里我们可以看到抓包的内容POST请求,url是http://localhost/api/mgr/sq_mgr/这个,这里我们并没有指定消息头是www-form-urlencoded,但是只要你有data参数传入了一个字典,他就认为你消息体是www-form-urlencoded格式。大家看下消息体

    image.png

    这就是www-form-urlencoded格式中间用&隔开,这里面的内容因为已经做了编码,如果想看里面的内容,点一下WebForms

    image.png

    因为你是form格式,他就会变成这种容易看的格式。


    如果有请求的消息不是www-form-urlencoded,比如是Json格式呢,比如我们这里有个Json格式添加课程的接口如下

    请求语法

    POST /apijson/mgr/sq_mgr/ HTTP/1.1
    Content-Type: application/json

    url请求参数
    无url请求参数

    请求体内容

    {
      "action" : "add_course_json",
      "data"     : {
        "name":"初中化学",
        "desc":"初中化学课程",
        "display_idx":"4"
      }
    }
    

    响应语法

    HTTP/1.1 200 OK
    Content-Type: application/json
    

    头部信息
    Content-Type 必填 正常情况下该值将被设为application/json,表示返回 JSON 格式的文本信息。

    响应内容
    如果请求成功,返回json格式的消息体,如下所示,retcode值为0表示添加成功

    {
        "retcode": 0
    }
    

    说明
    增加课程的名称如果已经存在,则会创建失败返回结果为

    {
        "retcode": 2,
        "reason": "同名课程已经存在"
    }
    

    请求体类型:Content-Type: application/json

    可以将字典直接传递给json参数

    payload2={
          "action" : "add_course_json",
          "data" : {
            "name":"初中化学",
            "desc":"初中化学课程",
            "display_idx":"4"
          }
        }
    
    resp=requests.post("http://localhost/apijson/mgr/sq_mgr/", json=payload2)
    

    相关文章

      网友评论

        本文标题:Python实现API测试自动化

        本文链接:https://www.haomeiwen.com/subject/wbfivqtx.html