最近总结了一下在接口测试方面的知识与心得,在这里与大家分享一下,如有说的不对的地方请多多指正。

接口测试概述

定义

API testing is a type of software testing that involves testing application programming interfaces (APIs) directly and as part of integration testing to determine if they meet expectations for functionality, reliability, performance, and security. Since APIs lack a GUI, API testing is performed at the message layer.[2] API testing is now considered critical for automating testing because APIs now serve as the primary interface to application logic and because GUI tests are difficult to maintain with the short release cycles and frequent changes commonly used with Agile software development and DevOps).

WIKI 定义:接口测试作为集成测试的一部分,通过直接控制 API 来判断系统的功能性,可靠性,性能与安全性。API 测试是没有界面的,执行在通讯层。API 测试在自动化测试中有着重要的地位,因为 API 一般是应用逻辑的主要接口,而 GUI 测试在敏捷开发和 DevOps 的快速迭代和频繁变更中很难维护。

分类

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。接口测试大体分为两类:模块接口测试和 web 接口测试。

模块接口测试

模块接口测试是单元测试的基础。它主要测试模块的调用与返回。经常需要编写一些桩模块与驱动模块。
主要测试要点如下:

检查接口返回的数据是否与预期结果一致。
检查接口的容错性,假如传递数据的类型错误时是否可以处理。
接口参数的边界值。例如,传递的参数足够大或为负数时,接口是否可以正常处理。
接口的性能,接口处理数据的时间也是测试的一个方法。牵扯到内部就是算法与代码的优化。
接口的安全性

WEB 接口测试

web 接口测试又可分为两类:服务器接口测试和外部接口测试。

服务器接口测试:是测试浏览器与服务器的接口。用户输入的数据是输入到的前端页面上,怎样把这些数据传递的后台的呢?通过 http 协议的 get 与 post 请求来实现前后端的数据传递。这也可认为是接口测试。
外部接口测试:这个很典型的例子就是第三方支付,比如在我们应用中在充流量时,交话费时,都会调用第三方支付接口。

主要测试要点如下:

请求是否正确,默认请求成功是 200,如果请求错误也能返回 404、500 等。
检查返回数据的正确性与格式;json 是一种非常常见的格式。
接口的安全性,一般 web 都不会暴露在网上任意被调用,需要做一些限制,比如鉴权或认证。
接口的性能,这直接影响用户的使用体验。

接口测试工具

SOAPUI
JMeter
Grinder
Suds Python

在工作中主要应用 SOAPUI 与 JMeter。SOAPUI 对接口安全测试有比较好的支持。本文还是主要介绍 JMeter 的使用,关注的是功能测试,对于它的强项性能测试,在以后的文章中描述。

测试用例设计与原则

因为在实际工作中测试的接口都是基于 HTTP 协议的,所以下面的测试用例及原则也是针对此类接口。

测试用例

正面测试用例:

负面测试用例:

验证点:

测试原则

测试应该是独立的、可读的、抗变的、可维护的,其实这也是所有自动测试应该遵循的原则

JMeter 使用

在实际工作中,我主要应用 JMeter 对接口做功能测试,所以下面主要介绍一下 JMeter 的使用

基本介绍

下面是我的一个测试脚本,通常一个文件会包含下面这些组件。我通过简单控制器与 DEBUG Sampler 来组织管理不同的接口,验证点主要通过写一些 Beanshell 脚本来实现。对于一些复杂的操作,如果网上能找到到现成的资源,比如 JAR,CLASS 文件会直接在 Beanshell PreProcessor/PostProcessor 引用。另外在 Jmeter 里写 Beanshell 不容易 DEBUG,所以还是建议复杂的功能直接在 Eclipse 里编写,然后生成 JAR 包. 关于 Beanshell 使用会在后面介绍

使用 Beanshell 在 JMeter

BeanShell 是一种完全符合 Java 语法规范的脚本语言,并且有自己的一些语法和方法 [官网](http://www.beanshell.org/
我的脚本几乎所有验证都是通过 Beanshell 脚本,只有少部分应用了 Response Assert。

Beanshell 常用内置变量

http://jmeter.apache.org/api/org/apache/jmeter/threads/

下面是一些实际的例子

log.info("log information")

它是类似的与 vars, 相应的属性在在文件 jmeter.properties 中定义


另外如果引用外部 JAR 包,也可在 TEST PLAN 中配置,在 JMeter 中点击 Test Plan 结点,就会看到下面的界面,可以直接添加 JAR 包所在路径

其它

CSV 配置组件使用

CSV_Data_Set_Config 当发送多组同样的请求,只是所带参数不同,这时可以加这个配置组件

然后在 SAMPLER 中可以应用上面这些变量配合循环控制器

连接数据库

在测试过程中,我们需要一些测试数据来自于数据库,这时我们需要在 Jmeter 连接数据库
下面以连接 MySQL 数据库为例


其它数据库连接请参考下图:


因为我们在接口测试中,更多的时候是获取数据,所以基本都用 “SELECT"。如果想 INSERT 数据,需要选择 “Callable Statement"在"Query Type"

在使用过程中注意以下几点:

添加监听器

Aggregate Report 是 Jmeter 常用的一个 Listener, 中译为 “聚合报告”,每一列具体表示如下。

Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples:表示你这次测试中一共发出了多少个请求,如果模拟 10 个用户,每个用户迭代 10 次,那么这里显示 100
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以 Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90% Line:90% 用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数 KB/Sec:每秒从服务器端接收到的数据量,相当于 LoadRunner 中的 Throughput/Sec

Jmeter 与 Jekins 集成

说这个之前简单说一下如何在命令行执行 JMeter

接下来做的事,lose 同学已经推荐了一个链接(https://testerhome.com/topics/2580),我觉得已经充分说明问题了,所以这里不再详述。
(本文完)


↙↙↙阅读原文可查看相关链接,并与作者交流