利用python进行接口测试及类型介绍

前言

其实我觉得接口测试很简单,比一般的功能测试还简单(这话我先这样说,以后可能会删O(∩_∩)O哈!),现在找工作好多公司都要求有接口测试经验,也有好多人问我(也就两三个人)什么是接口测试,本着不懂也要装懂的态度,我会说:所谓接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求。

我为啥说接口测试比功能测试简单呢,因为功能测试是从页面输入值,然后通过点击按钮或链接等传值给后端,而且功能测试还要测UI、前端交互等功能,但接口测试没有页面,它是通过接口规范文档上的调用地址、请求参数,拼接报文,然后发送请求,检查返回结果,所以它只需测入参和出参就行了,相对来说简单了不少。

正好最近在做接口测试,之前公司的方案是使用postman进行接口测试。但是伟大的墙导致我们只能用离线版postman。。然后一个很长很长的接口列表,一个接一个的访问。我的天哪。。所以萌生了一个想法,使用python编写一套接口测试脚本,设置接口列表,然后逐条访问,输出日志。

接口测试的坑

第一个坑:

POST 和 GET----GET一般用于获取/查询资源信息,而POST一般用于更新资源信息|Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

做过接口测试或者做过前端的人都知道,接口的访问方式是不一致的,所以才会使用postman来进行接口测试,因为它可以设置post和get方式。使用python模拟这俩种访问方式是重中之重。先说GET方式。GET方式就比较简单了,把接口放进浏览器地址栏,点下回车就完成了一次GET。所以就需要使用python访问URL就可以模拟一次GET 测试。

1

2

3

4

5

6

7

8

9

 import urllib2

 url_save = 'http://www.baidu.com/'

 try:

 s_save = urllib2.urlopen(url_save).read()

print s_save  

except urllib2.HTTPError, e:

 print e.code

 except urllib2.URLError, e:

 print str(e)

如上所示就完成了一次GET请求,调用urllib2库,然后将一个字符串形式的URL传给urllib2.urlopen函数,最后使用read()方法将GET回来的数据存储起来。

然后说说POST。其实在python的urllib2库中,我们刚刚所使用的urlopen函数还有其他几样不是必选的入参,因为这些入参给定了初始化的值:

1

2

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,

 cafile=None, capath=None, cadefault=False, context=None):

如上代码,urllib库有一个很智能的毛病。data不给值,访问方式就是GET,data给了值,方式就会变成POST;所以模拟POST 方式的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

import urllib 

import urllib2 

url = 'http://www.example.com' 

# values的形式:name:value

values = {'**' '***'

          '**' '***'

          '**' '***' 

#使用urllib.urlencode函数对values字典进行处理,最终形式为:**=***&**=***

data = urllib.urlencode(values) 

#如果对data顺序有要求,建议自己拼接data

req = urllib2.Request(url, data) 

response = urllib2.urlopen(req) 

the_page = response.read()

就像如上代码,把POST方式所需要的数据写到data参数中去,POST方式就模拟成功了。

第二个坑:cookie的使用

用python获取cookie所需要的库叫做cookielib。获取cookie的例子:

1

2

3

4

5

6

7

8

9

10

11

# 这里有四种CookieJar,CookieJar是最原始的

cookie_use = cookielib.CookieJar()

 handler = urllib2.HTTPCookieProcessor(cookie_use)

 # 使用绑定好CookieJar的handler创建一个opener

 opener = urllib2.build_opener(handler)

 # 将opener安装到urllib2中

 urllib2.install_opener(opener)

# 使用安装好的urllib2访问某一网站获取cookie

 urllib2.urlopen('https://....../login')

 #这个时候cookie已经被CookieJar获取到了

 print cookie_use

在下一步,将获取到的cookie绑定到opener头中:

1

2

3

4

5

'''

  将获取到的cookie绑定到opener,上一步获取的cookie并不满足如下格式,

需要自己进行字符串的切片和拼接 

 '''

opener.addheaders.append(('Cookie''name=***&888=888'))

现在的opener就可以用来访问任意需要登录的网站了!

功能:功能实现,实现与设计一致, 接口通过性测试

  • 健壮性: 边界值,容错性
  • 性能: 并发及压测
  • 稳定性: 长期运行的稳定性
  • 安全性: SQL注入, session依赖, 数字签名, http接口的安全性

接口类型

常见接口种类:

  • Http/Https接口: 通过http/https协议传送接口数据(通常按字符串/二进制传输), 如常见的网页表单, https安全性更好
  • RESTful Api: REST表述性状态传递. 一种设计风格,基于http/https协议, 把一切接口视为资源, 接口要分版本,在统一的域名下管理, 不同的方法(get/post..)做不同的事,通常请求及响应使用json格式
  • Web Service: SOAP简单面向对象协议, 基于http实现的一种RPC方案.接口返回一些对象,可以直接通过操作对象,实现我们需要的业务处理.使用xml格式传输数据
  • RPC接口: RPC为远程方法调用, 有不同的实现方案,基于TCP/Http协议的都有. RPC可以想我们本地导入和调用对象一样使用. Dubbo接口也是一种RPC接口.

常见接口数据类型:

  • 请求数据类型(Content-Type):application/x-www-form-urlencoded: 常规只有文本的网页表单application/json: RESTful Api常用格式, 结构清晰, 含有多层嵌套multipart/form-data: 既有文本,又有上传文件或富文本框的混合数据表单text/xml: xml格式, RPC接口常用格式
  • 响应数据类型string/html: 返回字符串或网页源码json: RESTful Api常用响应格式, 结构清晰xml: RPC接口常用格式

常见接口安全验证方式:

  • Auth_1.0/Auth_2.0: 通用接口授权方式
  • Session依赖: 需要登录之后才能进行接口操作
  • Token验证: 先要使用自己的appid/appsecret通过获取token接口验证身份获取一个token(令牌,有一定有效期), 然后带着token访问接口
  • 数字签名: 将原本的参数按一定规则进行组合,配合时间戳或appsecret, 通过加密算法生成一个签名sign, 携带签名进行接口请求

常见接口请求方法:

  • GET: 获取资源
  • POST: 修改资源
  • PUT: 上传资源
  • DELETE: 删除资源
  • HEAD: 只请求页面首部
  • PATCH: 补丁
  • OPTIONS: 运行客户端查看服务器性能
  • ......

常见状态码(RESTful规范):

  • 200系: 成功200 OK - [GET]:获取资源成功201 CREATED - [POST/PUT/PATCH]:创建/修改成功202 Accepted - [*]:任务接受204 NO CONTENT - [DELETE]:删除成功
  • 300系: 重定向301 Moved Permanently: 永久重定向302 Found: 临时重定向
  • 400: 资源错误400 INVALID REQUEST - [POST/PUT/PATCH]:用户请求错误401 Unauthorized - [*]:没有权限(鉴权失败, 接口层)403 Forbidden - [*] 资源禁止访问(服务器层,没有访问权限)404 NOT FOUND - [*]:资源不存在405 Method Not Allowd: 访问的方法不允许, 如用POST访问只支持GET请求的接口406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)410 Gone -[GET]:资源被永久删除422 Unprocesable entity - [POST/PUT/PATCH] 当创建对象时,发生验证错误
  • 500系: 服务器内部错误(接口崩溃或有Bug)500 INTERNAL SERVER ERROR - [*]:服务器发生错误

接口业务类型:

  • 返回数据型接口: 只从数据库读取数据
  • 业务操作型接口: 需要写数据库(接口测试需要要涉及参数化或环境清理)

快速上手接口测试

获取接口文档:

  • Wiki
  • Word文档
  • Postman导出
  • 抽象接口定义
  • 接口管理平台

接口文档分析

  • 功能分析: 是否能满足业务(是否缺少某个前端需要的参数), 是否能满足所有业务场景(是否有漏开发接口, 比如只开发了单品接口,没开发套餐接口)
  • 设计分析: 是否有不规范字段(如,nickname, passwd);不规范格式(如sex,用男,女而不是1,2);是否有易混淆字段(如amount和total);是否有单词拼错;是否有和数据库字段对应但名称不一样的(易错)
  • 接口分析: 协议类型(http要考虑安全);请求方法(是否规范);请求编码格式(表单/Json/xml, 很多接口文档不声明,导致测试调试不通);接口授权方式;接口业务类型(关系到是否需要做参数化或环境清理); 返回值类型及结构(关系到怎么断言)
  • 接口依赖: 需要什么环境准备和业务场景, 依赖那些接口, 有那些动态数据, 预备环境怎么保障
  • 参数分析: 各个参数的参数类型,组成规则,是否允许不传,是否可以为空, 是否允许多传参
  • 业务分析: 如price字段必须和数据库中的商品的price字段一致,才能校验通过
  • 非功能性: 接口的技术实现方案是否合理, 能否满足高并发的性能要求, 边界值/极限值的处理是否合适, 是否前后端都有数据格式校验等(如精确度为秒级的订单号生成器,在高并发下会导致生成同一订单号的问题)
  • 其他: 如反爬,对headers的一些限制和校验, ip等限制

编写接口用例

Excel/TestLink/禅道

  • 单接口用例: 正常数据/边界数据/异常数据(健壮性)/并发(一致性)/性能/安全性(抓包截取伪造/SQL注入/跨域请求)
  • 场景用例: 列出常见的用户场景, 用接口进行覆盖, 业务场景压测(寻找某个环节的性能瓶颈)

执行接口测试

  • Postman: 功能调试
  • Jmeter: 性能

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决微信小程序代码包大小限制方法

1 为什么微信小程序单个包的大小限制为 2MB 微信小程序单个包的大小限制为 2MB 是出于以下几个考虑: 保证小程序的启动速度:小程序的启动速度是影响用户体验的关键因素之一。如果包太大,会导致小程序启动时间过长,从而影响用户体…

node安装

这里写目录标题 https://nodejs.cn/ https://registry.npmmirror.com/binary.html?pathnode/ https://registry.npmmirror.com/binary.html?pathnode/v11.0.0/

一、rv1126开发之视频输入和视频编码

RV1126 H264/HEVC编码流程 一、RV1126编码的流程图: 二、每个代码模块详细讲解 2.1. VI模块的创建 VI模块的初始化:关键在于VI_CHN_ATTR_S结构体,这个结构体是VI设置的结构体。这个结构体的成员变量包括:pcVideoNode&#xff0…

[力扣 129]求根节点到叶节点之和

题目描述: 思路: 可以采用递归回溯。递归访问左->右->根节点并记录路径。到叶节点后,计算数字并相加。 代码: class Solution:def sumNumbers(self, root: TreeNode) -> int:res 0path []def backtrace(root):nonl…

Autosar Crypto Driver学习笔记(二)

文章目录 Crypto DriverFunction definitionsGeneral APICrypto_InitCrypto_GetVersionInfo Job Processing InterfaceCrypto_ProcessJob Job Cancellation InterfaceKey Management InterfaceKey Setting Interface密钥设置接口Crypto_KeyElementSetCrypto_KeySetValid Key Ex…

RabbitMQ集群部署

集群部署 我们看看如何安装RabbitMQ的集群。 1.集群分类 在RabbitMQ的官方文档中,讲述了两种集群的配置方式: 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同…

2024年高压电工证模拟考试题库及高压电工理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年高压电工证模拟考试题库及高压电工理论考试试题是由安全生产模拟考试一点通提供,高压电工证模拟考试题库是根据高压电工最新版教材,高压电工大纲整理而成(含2024年高压电工证…

【Leetcode每日一题】 递归 - Pow(x, n)(难度⭐⭐)(40)

1. 题目解析 题目链接:50. Pow(x, n) 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 在这个算法中,递归函数的任务是求出 x 的 n 次方。那么,这个函数是怎么工作的呢?它…

es 集群核心概念以及实践

节点概念: 节点是一个Elasticsearch的实例 本质上就是一个JAVA进程一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例 每一个节点都有名字,通过配置文件配置,或者启动时候 -…

软件工程-第5章 结构化设计

5.1 总体设计的目标及其表示方法 5.2 总体设计 变换设计基本步骤: 第1步:设计准备--复审并精华系统模型; 第2步:确定输入、变换、输出这三部分之间的边界; 第3步:第一级分解--系统模块结构图顶层和第一层…

产品软文怎么写?媒介盒子分享公式

软文写出来的目的除了提高品牌知名度外,还需要推广产品,当企业新品上市、推广产品以及营销产品的时候,就需要产品类软文出手。然而产品软文想要写好还需要一定的技巧,今天媒介盒子就来和大家分享:产品软文写作公式。 一…

把txt、pdf等文件转为一行一行的doccano数据集输入格式

文章目录 doccano 数据集导入简介代码实现代码运行结果代码公开 doccano 数据集导入 在Doccano 导入数据集时,使用TextLine的文件格式,导入的文件需要为一行一行文本的数据格式,每一行文本在导入Doccano后就是一条数据。 简介 主要工作说明…

[linux]--关于进程概念(下)

目录 孤儿进程 环境变量 将程序放到PATH路径下 设置PATH环境变量 设置别名 环境变量相关的命令 环境变量的组织方式​编辑 通过系统调用获取环境变量 环境变量通常是具有全局属性的 进程优先级 查看系统进程 用top命令更改已存在进程的nice: 程序地址空…

(附源码)基于SSM的校园兼职系统设计与实现

前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 &#x1f31…

uniapp ios证书失效

前面是按照网上查找的方法 作者大大的地址 1、一个ios账户(688付费版) 2、登录 Apple Developer 3、创建Identifiers ps:创建时需继承苹果的sdk,只需要一个就行 点击continue再点击Register即可 4、创建.cer证书 &…

tcp seq ack

seq(Sequence Number):32bits,表示这个tcp包的序列号。tcp协议拼凑接收到的数据包时,根据seq来确定顺序,并且能够确定是否有数据包丢失。 ack(Acknowledgment Number):3…

安卓开发日记:实现APP重启逻辑,适用于热更后重启游戏进行加载

可根据合适的弹窗搭配使用重启逻辑,建议使用在热更包加载后使用,帮助部分热更后未及时生效的逻辑范围首先,在逻辑调用Activity类中创建一个成员变量,给后续逻辑接口直接使用 如下 public class MainActivity extends Activity {…

想当初级爬虫工程师,需要把爬虫学到什么程度?

这篇文章会说说我自己的心得体验,关于爬虫、关于工作,仅供参考。 学到哪种程度 暂且把目标定位初级爬虫工程师,简单列一下吧: (必要部分) 语言选择:一般是了解Python、Java、Golang之一 熟悉…

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

Vue2在一个页面内动态切换菜单显示对应的路由组件

项目的需求是在一个页面内动态获取导航菜单,导航菜单切换的时候显示对应的路由页面,类似于tab切换的形式,切换的导航菜单和页面左侧导航菜单是同一个路由组件,只是放到了一个页面上,显示的个数不同,所有是动…