1. 接口基础知识

1.1 接口分类

接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。

(1) webservice接口:走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都要通过工具才能进行调用,测试。
(2) http api 接口:走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法。

1.2 接口请求类型

根据接口的请求方法,常用的几种接口请求方式:

(1) GET:从指定资源获取数据
(2) POST:向指定的资源请求被处理的数据(例如用户登录)
(3) PUT:上传指定的URL,一般是修改,可以理解为数据库中的 update
(4) DELETE:删除指定资源

2、Requests 快速上手

2. requests基础

  所有的数据测试目标以一个开源的接口模拟网站【HTTPBIN】为测试对象。

2.1 发送请求

  1. #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @File : requests_send_request.py
    @Time : 2019/9/2 11:54
    @Author : Crisimple
    @Github : https://crisimple.github.io/
    @Contact : Crisimple@foxmail.com
    @License : (C)Copyright 2017-2019, Micro-Circle
    @Desc : None
    """
  2. import requests
  3. # 1.requests请求方式
    # (1) GET请求方式
    httpbin_get = requests.get('http://httpbin.org/get', data={'key': 'value'})
    print('httpbin_get: ', httpbin_get.text)
  4. # (2) POST请求方式
    httpbin_post = requests.post('https://httpbin.org/post', data={'key': 'value'})
    print('httpbin_post: ', httpbin_post.text)
  5. # (3) PUT请求方式
    httpbin_put = requests.put('https://httpbin.org/put', data={'key': 'value'})
    print('httpbin_put: ', httpbin_put.text)
  6. # (4) DELETE请求方式
    httpbin_delete = requests.delete('https://httpbin.org/delete', data={'key': 'value'})
    print('httpbin_delete', httpbin_delete)
  7. # (5) PATCH亲求方式
    httpbin_patch = requests.patch('https://httpbin.org/patch', data={'key': 'value'})
    print('httpbin_patch', httpbin_patch)

2.2 参数传递

  常用的参数传递形式有四种:【GitHub示例

(1)字典形式的参数:payload = {'key1': 'value1', 'key2': 'value2'}
(2) 元组形式的参数:payload = (('key1', 'value1'), ('key2', 'value2'))
(3) 字符串形式的参数:payload = {'string1', 'value1'}
(4) 多部份编码的文件:files = {
# 显示设置文件名、文件类型和请求头
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}

  1. #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @File : requests_transfer_parameter.py
    @Time : 2019/9/2 12:39
    @Author : Crisimple
    @Github : https://crisimple.github.io/
    @Contact : Crisimple@foxmail.com
    @License : (C)Copyright 2017-2019, Micro-Circle
    @Desc : 参数传递:字典、元组、字符串、文件
    """
    import requests
  2. # 2. 参数传递
    # (1) 传参参数为字典形式: 数据字典会在发送请求时会自动编码为表单形式
    def transfer_dict_parameter():
    payload = {
    'key1': 'value1',
    'key2': 'value2'
    }
  3. transfer_dict_parameter_result = requests.post('https://httpbin.org/post', params=payload)
    print("transfer_dict_parameter_url: ", transfer_dict_parameter_result.url)
    print("transfer_dict_parameter_text: ", transfer_dict_parameter_result.text)
  4. transfer_dict_parameter()
  5. # (2) 传参参数为元组形式: 应用于在表单中多个元素使用同一 key 的时候
    def transfer_tuple_parameter():
    payload = (
    ('key1', 'value1'),
    ('key1', 'value2')
    )
  6. transfer_tuple_parameter_result = requests.post('https://httpbin.org/post', params=payload)
    print('transfer_tuple_parameter_url: ', transfer_tuple_parameter_result.url)
    print('transfer_tuple_parameter_text: ', transfer_tuple_parameter_result.text)
  7. transfer_tuple_parameter()
  8. # (3) 传参参数形式是字符串形式
    def transfer_string_parameter():
    payload = {
    'string1': 'value'
    }
  9. transfer_string_parameter_result = requests.post('https://httpbin.org/post', params=payload)
    print('transfer_string_parameter_url: ', transfer_string_parameter_result.url)
    print('transfer_string_parameter_text: ', transfer_string_parameter_result.text)
  10. transfer_string_parameter()
  11. # (4) 传参参数形式:一个多部分编码(Multipart-Encoded)的文件
    def transfer_multipart_encoded_file():
    interface_url = 'https://httpbin.org/post'
    files = {
    # 显示设置文件名、文件类型和请求头
    'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
    }
  12. transfer_multipart_encoded_file_result = requests.post(url=interface_url, files=files)
    print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.url)
    print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.text)
  13. transfer_multipart_encoded_file()

2.3 接口响应

  给接口传递参数,请求接口后,接口会给我们我们响应返回,接口在返回的时候,会给我们返回一个状态码来标识当前接口的状态。

(1)状态码

GitHub示例
| 状态码 | 状态 | 描述 |
---------- | ----- | ------ 
1xx | ---- |信息类的状态码 **
| 100 | Continue | 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
| 101 | Switching Protocols | 服务器转换协议,服务器将遵从客户的请求转换到另外一种协议
**2xx | ---- |*成功类的状态码 *
| 200 | OK | 请求成功(是对 GET 或 POST 的请求应答文档)
| 201 | Created | 请求被创建完成,同时信的资源被创建
| 202 | Accepted | 供处理的请求已被接收,但是处理未完成
| 203 | Non-authoritative Information | 文档已正常地返回,但一些应答头可能不正确,以为使用的式文档的拷贝
| 204 | No Content | 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
| 205 | Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
| 206 | Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它。

  1. #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @File : response_code.py
    @Time : 2019/9/2 15:41
    @Author : Crisimple
    @Github : https://crisimple.github.io/
    @Contact : Crisimple@foxmail.com
    @License : (C)Copyright 2017-2019, Micro-Circle
    @Desc : None
    """
    import requests
  2. # 1. 返回接口状态码:200
    def response_200_code():
    interface_200_url = 'https://httpbin.org/status/200'
    response_get = requests.get(interface_200_url)
    response_get_code = response_get.status_code
    print('response_get_code: ', response_get_code)
  3. response_200_code()
  4. # 2.返回接口状态码:400
    def response_400_code():
    interface_400_url = 'https://httpbin.org/status/400'
    response_get = requests.get(interface_400_url)
    response_get_code = response_get.status_code
    print('response_get_code: ', response_get_code)
  5. response_400_code()

(2)响应头

  1. #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @File : response_content.py
    @Time : 2019/9/2 15:41
    @Author : Crisimple
    @Github : https://crisimple.github.io/
    @Contact : Crisimple@foxmail.com
    @License : (C)Copyright 2017-2019, Micro-Circle
    @Desc : None
    """
    import requests
  2. # 1. 返回接口状态码:
    # (1). 返回接口状态码:200
    def response_200_code():
    interface_200_url = 'https://httpbin.org/status/200'
    response_get = requests.get(interface_200_url)
    response_get_code = response_get.status_code
    print('response_get_code: ', response_get_code)
  3. response_200_code()
  4. # (2).返回接口状态码:400
    def response_400_code():
    interface_400_url = 'https://httpbin.org/status/400'
    response_get = requests.get(interface_400_url)
    response_get_code = response_get.status_code
    print('response_get_code: ', response_get_code)
  5. response_400_code()
  6. # (3) 重定向接口返回状态码:301
    def response_301_code():
    interface_url = 'https://butian.360.cn'
    response_get = requests.get(interface_url)
    response_get_code = response_get.status_code
    print('response_get_code: ', response_get_code)
  7. response_301_code()
  8. # ------------------------------------------------------
    # 2. 响应内容
      响应内容的请求头、查看文本、编码方式、二进制响应、原始响应。
    def response_contents():
    url = 'https://httpbin.org/get'
  9. response_get = requests.get(url=url)
  10. # 响应头
    print('response_get_headers', response_get.headers)
  11. # 响应文本
    print('response_get_text: ', response_get.text)
  12. # 文本编码方式
    print('response_get_encoding: ', response_get.encoding)
  13. # 二进制响应内容
    print('response_get_content: ', response_get.content)
  14. # 原始响应内容
    origin_content = response_get.raw
    origin_content_read = origin_content.read(10)
    print('origin_content: ', origin_content)
    print('origin_content_read: ', origin_content_read)
  15. response_contents()

2.4 接口其他处理

GitHub示例

(1) 操作cookies

  1. import requests
    import time
  2. url = 'https://httpbin.org/get'
  3. def operator_cookies():
    r = requests.get(url)
    print('r.cookies: ', r.cookies)
  4. jar = requests.cookies.RequestsCookieJar()
    jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
    jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
    r2 = requests.get(url=url, cookies=jar)
    print('r2.text', r2.text)
  5. operator_cookies()

(2) 请求历史

  1. import requests
  2. url = 'https://httpbin.org/get'
  3. def request_history():
    r = requests.get(url=url)
    print('r.history: ', r.history)
  4. request_history()

(3) 超时请求

  requests 在经过 timeout 参数设定的秒数时间之后停止等待响应。

  1. import requests
    import time
  2. def timeout():
    print(time.time())
    url = 'https://httpbin.org/get'
    print(time.time())
    r = requests.get(url, timeout=5)
    print(time.time())
  3. timeout()

(4) 错误与异常

  常见的错误异常有:

· 遇到网络问题(如:DNS 查询失败、拒绝连接等时),requests 会抛出一个 ConnectionError 异常。
· 如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError异常。
· 若请求超时,则超出一个 Timeout 异常。
· 若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
· 所有 Requests 显式抛出的异常都继承自 requests.exceptions.RequestsException。

Python 接口自动化测试的更多相关文章

  1. python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为

    python接口自动化测试二十七:密码MD5加密   ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...

  2. python接口自动化测试七:获取登录的Cookies

    python接口自动化测试七:获取登录的Cookies,并关联到下一个请求   获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cooki ...

  3. Python接口自动化测试框架实战 从设计到开发

    第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...

  4. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  5. python 接口自动化测试(三)

    1.WriteIni.py import ConfigParser cf = ConfigParser.ConfigParser() cf.add_section("PC_WSDL" ...

  6. 记录python接口自动化测试--简单总结一下学习过程(第十目)

    至此,从excel文件中循环读取接口到把测试结果写进excel,一个简易的接口自动化测试框架就完成了.大概花了1周的时间,利用下班和周末的时间来理顺思路.编写调试代码,当然现在也还有很多不足,例如没有 ...

  7. python接口自动化测试框架实现之字符串插入变量(字符串参数化)

    问题: 在做接口自动化测试的时候,请求报文是json串,但是根据项目规则必须转换成字符串,然后在开头拼接“data=” 接口中很多入参值需要进行参数化. 解决方案: 1.Python并没有对在字符串中 ...

  8. python - 接口自动化测试 - RunTest - 测试用例加载执行/测试报告生成

    # -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: run_test.py @ide: PyCharm Com ...

  9. python - 接口自动化测试实战 - case1 - 再次优化版

    本次优化: 1.  各级分Package 2.  封装[ReadExcel]类 3.  封装[ReadConfig]类 4.  封装[GetLog]类 5.  引入ddt数据驱动测试,优化测试用例代码 ...

  10. python接口自动化测试(一)

    本节开始,开始介绍python的接口自动化测试,首先需要搭建python开发环境,到https://www.python.org/下载python 版本直接安装就以了,建议 下载python2.7.1 ...

随机推荐

  1. JavaScript之预编译

    javascript是一种解释性弱类型语言,在浏览器中执行时,浏览器会先预览某段代码进行语法分析,检查语法的正确与否,然后再进行预编译,到最后才会从上往下一句一句开始执行这段代码,简单得来说可以表示为 ...

  2. 高德局部刷新标记点,bug解决

    将接口返回的经纬集合点在高德地图上标记展示, 如果实时刷新地图标记点,不加优化,则会造成过多的带宽消耗 所以,地图只需加载一次,局部更新标记点就好了 代码: <template> < ...

  3. phpcms 后台分页

    php 代码public function init() { $where='';//条件 $page = $_GET['page'] ? intval($_GET['page']) : '1'; $ ...

  4. phpcms模块安装

    工作中需要用到 phpcms开源框架,借鉴了   http://www.cnblogs.com/benpaodelulu/p/6874201.html这个地址,搞定的 ,非常实用 如果有用到的朋友们可 ...

  5. SQLI-LABS学习笔记(三)

    第十一关   这一关是POST注入   先利用bp抓包抓到post传输的参数数据     抓到传递的表单为   uname=admin&passwd=admin&submit=Subm ...

  6. Python(10)

    如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? # 注意是三重循环 for a in range(0, 1001): for b i ...

  7. CTR学习笔记&代码实现4-深度ctr模型 NFM/AFM

    这一节我们总结FM另外两个远亲NFM,AFM.NFM和AFM都是针对Wide&Deep 中Deep部分的改造.上一章PNN用到了向量内积外积来提取特征交互信息,总共向量乘积就这几种,这不NFM ...

  8. 使用react脚手架create-react-app创建react应用

    Create React App是一种官方支持的创建单页React应用程序的方法.它提供了一个没有配置的现代构建设置. 一.全局安装脚手架: npm install -g create-react-a ...

  9. JSON Introduction

    理解 JSON(JavaScript Object Notation),一种轻量级的数据交换格式,基于JS的一个子集,但其数据格式与语言无关. 通俗来说,如果你是PHP,要和JS互相发送信息,那么这时 ...

  10. 无向图求割点(找桥)tarjan

    本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ...