接口测试基础
接口测试简介
- 百度百科中为接口测试给出的定义:
接口测试是测试系统组件间接口的一种测试。
接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。
测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 - 接口测试通常包括两类,模块之间的接口测试和 Web 接口测试。
前者通常是由开发人员在单元测试中进行测试,后者则通常由测试人员进行测试。
后面的内容主要为 Web 接口测试。
接口测试的意义
测试人员都知道,在整个软件生命周期中,测试介入的越早,成本越低,收益越好。
通常,前端的实现,依赖于后端的接口,测试人员需要在开发人员输出接口文档后,就立即开始设计接口测试用例,在开发人员将接口开发完成后,就可以进行接口测试了。
接口测试,可以提前暴露很多问题,此时开发解决问题,相对在前端的功能测试中发现的问题,其代价要小的多。接口的正确和稳定,会为后面前端的功能测试减少很大一部分工作量。另外接口的自动化、持续集成也相对的比较容易去实现。
接口测试的内容
- 测试返回值是否正确
- 测试返回值类型是否符合设计文档
- 测试返回的 error 信息是否符合设计
- 对输入进行类型、边界测试,测试接口是否有对异常数据做处理
需要掌握或了解的知识
- 了解后端常用开发语言,java、php、python 等
- 了解各种开发语言的某些特性。比如在 php 中的 empty() 方法,有开发同学会用这个方法判断一个字符串是否为空,但这里如果传入的值为0,empty 方法也会判断为空,即 empty(0) 返回的值为 true!因此设计接口用例的时候,要增加此类含有特殊值的 case
- 了解 tcp/ip、http、https 协议
- 掌握常用的请求方式,get、post、put
- 掌握 json、xml、html 的语法
- 掌握常用的抓包方法
- 掌握基本的增删改查 sql 语句
- 掌握一种语言,python、java 或其他语言
- 掌握 jenkins 环境的搭建
接口测试工具
- Postman
- Jmeter
- SoapUI
- Fitnesse
接口测试框架或测试库
- RobotFramework
- python 的 requests
其他开源库
moco
Continue reading接口测试之实例篇
Posted on 周三 20 四月 2016 in [接口测试] • Tagged with [接口测试] • 0 Comments
一、测试需求描述
1、 本次测试的接口为http服务端接口
2、 接口的主要分成两类,一类提供给查询功能接口,一类提供保存数据功能接口,这里我们举例2个保存数据的接口,因为这两个接口有关联性,比较有代表性;
3、接口描述:
保存信用卡账户信息接口:
传入参数:
args={
"clientNo":"434343556",
"alias": "**信用卡2",
"cardName": "长城*****卡2",
"cardNo": "25622356788251",
}
传出参数:
1)保存成功:
{"returnCode":"0","returnMsg":"保存成功"}
2)保存失败:
{"returnCode":"1","returnMsg":"保存失败"}
保存逻辑:数据传入进来,验证通过,保存到信用卡账户表中
保存信用卡账单接口: 传入参数:
args={
"clientNo":"434343556",
"accountName": "测试",
"billDate": "08",
"billMonth": "201509",
"cardNo": "25622356788251",
"currentPayment": "欠款459.80",
"paymentDate": "2015-09-25 09:00:00",
}
传出参数:
1)保存成功:
{"returnCode":"0","returnMsg":"保存成功"}
2)保存失败:
{"returnCode":"1","returnMsg":"保存失败"}
保存逻辑:保存时先去信用卡信息表查看clientNo对应的表是否存在,如存在则数据校验通过,将数据保存进入信用卡账单表
注:这个保存逻辑在接口开发设计文档中可能没有写或写的不详细,这时要与开发接口人员或产品人员多多沟通去熟悉接口逻辑
二、测试分析
1、逻辑分析
1)、从保存逻辑上来看,这两个接口明显是有依赖关系的,所以我们先测试信用卡账户信息接口,再测试保存信用卡账单接口
2)、接口传入的数据,最终是保存到数据库中,所以当接口返回保存成功的时候,我们也要去对应的数据库表中核对相应的数据(这里可以用jmeter链接数据库进行操作代理手工)
3)、当出现保存失败的情况时,我们需要查看系统的日志,所以我们也要准备好查看日志的权限和地址
2、测试工具的准备
1)、单个接口测试,使用poster/postman
2)、多个接口测试,我们使用Jmeter进行测试
三、使用工具测试
本实例中使用Jmeter对接口进行测试
首先我们说一下为什么用Poster测试后我们还要用Jmeter做接口测试,在用poster测试时候会发现的是一个接口一个接口的测试,我们每次测试成功后的数据,在工具中是无法保存的,再次测试的时候我们还要重新输入测试的数据,当我们测试一个接口的时候可能感觉不明显,但是当你测试几十个接口的时候,你就会发现使用Jmeter的好处,如果按测试阶段来说冒烟测试我们用poster,集成测试我们用Jmeter
四、使用Jmeter接口测试
1、首先邮件添加一个线程组,这里我们重命名InterfaceTest
2、在线程组上添加一个Http默认请求,并配置服务器的IP地址和传输编码
3、在线程组中添加一个HTTP请求,这里我们重命名“增加信用卡账户信息接口”
4、配置接口请求信息,这配置示例如下:
5、在保存信用卡账单接口请求,示例如下:
注:由于Jmeter请求线程组内的请求时从第一个开始执行,所以我们将需要最先执行的请求放在前面
6、在线程组上添加监听器,察看结果树和聚合报告
7、点击启动 ...
Continue reading接口测试之Moco篇
Posted on 周三 20 四月 2016 in [接口测试] • Tagged with [接口测试] • 0 Comments
Moco 简介
Moco 的作者是郑晔,该框架还在 JavaOne 2013 大会上获过奖。
简单的说,Moco 是一个搭建模拟服务器的工具,其支持 API 和独立运行两种方式,前者通常是在 junit 等测试框架中使用,后者则是通过运行一个 jar 包开启服务。
Moco 能帮助解决开发中的哪些问题?作者的回答如下:
Moco是针对HTTP集成而生的,不过,现在也有人把它用在其它需要一个模拟服务器的场景中。比如,在移动开发中,有人开发一个移动应用,需要有一个远端服务,但在开发时,这个服务还不存在,他就用Moco模拟了一个服务,保证移动应用可以顺利的开发。同样,也有人把它用在Web前端开发里,当我们的页面需要通过与服务器交互时,就可以用Moco模拟这样一个服务。这种做法在开发一个页面原型时,非常有用,因为那个时候,我们还来不及开发一个完整的服务。
Moco 用于接口测试
既然开发人员可以通过 Moco 模拟一个还不存在的服务来进行开发、调试,那对于接口测试来说,也可以模拟一个服务进行测试。 一般而言,在项目的接口文档输出后,开发人员会进行接口开发工作,测人员会进行接口用例的设计,但往往完成用例设计会先于接口开发工作,此时如果要进行接口用例的执行,则前提是开发人员完成接口开发工作。 而通过 Moco 框架,就可以在接口文档输出后,在接口开发、接口用例设计的同时,使用 Moco 搭建一个模拟服务器,这样在用例设计完成后,即使接口开发工作还未完成,也可以立即进行执行接口用例,在这个过程中可以修改、补充用例,如此的话,在接口开发完成以后,只需要简单的去执行所有的用例就 OK,省去了很大的工作量,并且这些完善的用例,用自动化去执行,效果更佳。
开始使用 Moco
-
github 地址:Moco
-
在项目的 readme 中找到 Quick Start,Download Standalone Moco Runner
- 新建一个 test.json:
[
{
"response": {
"text": "Hello, Moco"
}
}
]
- 启动服务,端口号可自己设置
java -jar moco-runner-0.10.2-standalone.jar http -p 12306 -c test.json
29 一月 2016 14:25:20 [main] INFO Server is started at 12306
29 一月 2016 14:25:20 [main] INFO Shutdown port is 63643
- 在浏览器中访问 http://localhost:12306, 将会在页面上显示 Hello,Moco
配置 ...
Continue reading测试Jenkins构建及禁用Job接口
Posted on 周三 13 四月 2016 in [接口测试] • Tagged with [Python, 接口测试] • 0 Comments
使用Python unittest+requests对Jenkins构建及禁用job接口进行测试:
# coding=utf-8
import unittest
import requests
import json
from requests.auth import HTTPBasicAuth
class JenkinsPostTest(unittest.TestCase):
def setUp(self):
# 构建job的url
self.build_job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/build'
# 禁用job的url
self.disable_job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/disable'
# 获取job状态等信息的rul
self.job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/api/json'
# 测试构建某一job接口
def test_buildJob(self):
r = requests.post(self.build_job_url, data=None, auth=('admin', 'admin'))
print r.status_code
self.assertEqual(r.status_code, 201)
# 测试禁用某一job接口
def test_disableJob(self):
# 确认job状态是否可执行,'buildable':'true'
status = self.get_JobInfo()
self.assertTrue(status)
# 禁用job,断言禁用job是否成功
r = requests.post(self.disable_job_url, data=None, auth=('admin', 'admin'))
self.assertEqual(r.status_code, 200)
# 获取当前job状态
status = self.get_JobInfo()
self.assertFalse(status)
print status
# 获取当前job信息
def get_JobInfo(self):
job_info = requests.get(self.job_url, auth=('admin', 'admin')).json()
return job_info['buildable']
使用python unittest+requests对Jenkins构建及禁用job接口进行测试:
# coding=utf-8
import unittest
import requests
import json
from requests.auth import HTTPBasicAuth
class JenkinsPostTest(unittest.TestCase):
def setUp(self):
# 构建job的url
self.build_job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/build'
# 禁用job的url
self.disable_job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/disable'
# 获取job状态等信息的rul
self.job_url = 'http://192.168.217.130:8080/jenkins/job/check_python_version/api/json'
# 测试构建某一job接口
def test_buildJob(self):
r = requests.post(self.build_job_url, data=None, auth=('admin', 'admin'))
print r.status_code
self.assertEqual(r.status_code, 201)
# 测试禁用某一job接口
def test_disableJob(self):
# 确认job状态是否可执行,'buildable':'true'
status = self.get_JobInfo()
self.assertTrue(status)
# 禁用job,断言禁用job是否成功
r = requests.post(self.disable_job_url, data=None, auth=('admin', 'admin'))
self.assertEqual(r.status_code, 200)
# 获取当前job状态
status = self.get_JobInfo()
self.assertFalse(status)
print status
# 获取当前job信息
def get_JobInfo(self):
job_info = requests.get(self.job_url, auth=('admin', 'admin')).json()
return job_info['buildable']