Python 接口自动化测试

Stella981
• 阅读 822

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 发送请求

#!/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"""import requests# 1.requests请求方式# (1) GET请求方式httpbin_get = requests.get('http://httpbin.org/get', data={'key': 'value'})print('httpbin_get: ', httpbin_get.text)# (2) POST请求方式httpbin_post = requests.post('https://httpbin.org/post', data={'key': 'value'})print('httpbin_post: ', httpbin_post.text)# (3) PUT请求方式 httpbin_put = requests.put('https://httpbin.org/put', data={'key': 'value'})print('httpbin_put: ', httpbin_put.text)# (4) DELETE请求方式httpbin_delete = requests.delete('https://httpbin.org/delete', data={'key': 'value'})print('httpbin_delete', httpbin_delete)# (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'})
}

#!/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. 参数传递# (1) 传参参数为字典形式: 数据字典会在发送请求时会自动编码为表单形式def transfer_dict_parameter():    payload = {        'key1': 'value1',        'key2': 'value2'    }    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)transfer_dict_parameter()# (2) 传参参数为元组形式: 应用于在表单中多个元素使用同一 key 的时候def transfer_tuple_parameter():    payload = (        ('key1', 'value1'),        ('key1', 'value2')    )    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)transfer_tuple_parameter()# (3) 传参参数形式是字符串形式def transfer_string_parameter():    payload = {        'string1': 'value'    }    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)transfer_string_parameter()# (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'})    }    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)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请求,服务器完成了它。

#!/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# 1. 返回接口状态码:200def 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)response_200_code()# 2.返回接口状态码:400def 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)response_400_code()

(2)响应头

#!/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# 1. 返回接口状态码:# (1). 返回接口状态码:200def 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)response_200_code()# (2).返回接口状态码:400def 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)response_400_code()# (3) 重定向接口返回状态码:301def 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)response_301_code()# ------------------------------------------------------# 2. 响应内容  响应内容的请求头、查看文本、编码方式、二进制响应、原始响应。def response_contents():    url = 'https://httpbin.org/get'    response_get = requests.get(url=url)    # 响应头    print('response_get_headers', response_get.headers)    # 响应文本    print('response_get_text: ', response_get.text)    # 文本编码方式    print('response_get_encoding: ', response_get.encoding)    # 二进制响应内容    print('response_get_content: ', response_get.content)    # 原始响应内容    origin_content = response_get.raw    origin_content_read = origin_content.read(10)    print('origin_content: ', origin_content)    print('origin_content_read: ', origin_content_read)response_contents()

2.4 接口其他处理

GitHub示例

(1) 操作cookies

import requestsimport timeurl = 'https://httpbin.org/get'def operator_cookies(): r = requests.get(url) print('r.cookies: ', r.cookies) 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)operator_cookies()

(2) 请求历史

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

(3) 超时请求

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

import requestsimport timedef timeout(): print(time.time()) url = 'https://httpbin.org/get' print(time.time()) r = requests.get(url, timeout=5) print(time.time())timeout()

(4) 错误与异常

  常见的错误异常有:

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这