接口测试
1.测试工具:postman jmeter
在企业里面,后台写完接口,这个时候我们进行接口测试,测试完成,给前端使用
接口测试主要看:
1.接口提交正确的数据,返回的数据对不对
2.接口逻辑交互对不对
3.根据开发文档测试接口,比如提交字段为空,看看接口有没有进行判断,使用边界值,等价类,因果图和错误推断法进行测试
接口与页面的区别
1.web页面一般是页面
2.页面提交数据的就是接口,一般前端通过jquery框架提交,安卓通过OKhttp提交数据
3.在公司里一般有时候不给提供接口,这个时候我们通过Charles抓包工具去抓取接口
接口组成:
1.请求头http://或者https://
2.ip:端口号或者域名
3.跟着接口的路径
4.get 在head里面提交数据,post 在body里面提交数据
5.返回json 数据
对登录接口写测试用例
输入 操作 预计输出
1.等价类:有效等价类:输入正确的用户名和正确的密码,点击登录俺妞妞,返回正确的json数据,statue:0
2.用户名不为空,密码为空,点击登录按钮,应该提示输入密码
1.使用Jmeter进行接口测试
mac 电脑启动Jmeter,注意Jmeter如果想使用,必须在本地有jdk环境,也就是java-version成功
通过终端进入到bin,通过shell脚本启动,输入sh jmeter启动
window:直接双击jumret.bat进行启动
使用步骤:
1.在测试计划里面右键--添加--Threads--线程组
2.在线程组上面右键--天骄--sampler--http请求
3.在http请求上面右键--添加--监听器--查看结果数
4.在http请求上面点击右键--添加--监听器--聚合报告
我们用Jmeter如何进行接口测试呢?
Jmeter接口测试:
1.上面的使用步骤不在重复
1.1举个例子:我们点击Http请求进行设置ip 端口号 post请求方式 加两个参数(名称和值),如果我们想对值进行加密处理:
选项--函数助手对话框--CSVReader在对应的值的路径(这里的内容使我们对应http请求里面的数据,我们的数据要从数据库中导出来,比如我们只需要username,password那么我只需要导出这两种数据就可以了)--生成这个就是我们进行加密处理的值(比如:${__CSVRead(/Users/yuliguo/Desktop/qiezzilogin.txt,)}这是我生成的值)
然后我们在http文件里我们就加个后缀0就可以了(比如:${__CSVRead(/Users/yuliguo/Desktop/qiezzilogin.txt,0)})
1.2因为我们上传文件的形式不是系统默认的:Content-Type: application/x-www-form-urlencoded
我们需要上传的图片是:。。。我们就需要在第四步Use multipart/form-data for POST前打勾,然后我们选择 files Upload里面我们输入文件名称和参数名称(比如:/Users/yuliguo/Desktop/a.jpg image)
2.我们需要添加断言:http--断言--响应断言--在要测试的模式里面我们添加成功的结果(比如:我的是"statue":0 "message":"登陆成功 两条)
3.我们还需要添加断言持续时间:http--断言--断言持续时间(我设置的是5000毫秒)
4.我们同样的步骤1在创建一个http我们在这个里面测试我们的两张图片是否上传成功:(username,token,image)
5.因为我们的token时刻都在改变所有我们需要对token进行关联处理:
线程组右键--后置处理器--正则表达式处理器
正则表达式里面我们填写一下(比如:引用名称:token 正则表达式:"tpken":"(.+?)" 模板:$1$ 匹配数字:0 缺省值:null),既然叫提取器,那么自然提取谁的数据我们就放在谁的后面,所有我们将我们的正则表达式处理器放到1后面
我们将4里面的值进行修改(比如:${userId} ${token)
6.然后我们就关联成功了,运行测试一下,哈哈哈
期待已久的接口自动化开始了:
我们首先介绍一下我测的是什么接口:我是自己搭建了一个阿里云服务器然后配置Tomcat ,然后......过程不说了之前博客上都有,我们是测试一个朋友圈的上传功能进行接口测试,如果返回的Id和我们输入的message都正确说明接口没有问题,详细的代码中有注释不多说了:
util包urlutil.py
#-*-coding:utf-8-*- class URL(object): #测试环境的基类 JD_SERVLET="http://39.107.102.34:8080/jd/" #生产环境 #JD_SERVLET="http://39.107.102.34:8080/jd/" #登录的接口 JD_LOGIN="login" #请求参数,用户名和密码 JD_LOGIN_PARAMETER={ "username":"zhangsan1", "password":"123456" } #发送朋友圈的接口 JD_SEND="send"dbutil.py
#-*-coding:utf-8-*- #导入数据库包 import MySQLdb #封装 class DBManager(object): #指定主机名字 __host="39.107.102.34" #用户名 __user="root" #密码 __pwd="123456" #数据库 __Database="qiezi" #端口号 __port=3306 #连接数据库的方法 def Connection(self): self.db=MySQLdb.connect(self.__host,self.__user, self.__pwd,self.__Database,self.__port) self.cursor=self.db.cursor() return self.cursor #关闭数据库 def CloseDb(self): self.db.close()我们创建一个image包然后将我们的图片放到里面(目的:写路径的时候简单)
unit包下的send.py
#-*- coding:utf-8 -*- import unittest #导入网络请求框架 import requests #导入util from util import urlutil,dbutil import os class Send(unittest.TestCase): @classmethod def setUpClass(self): self.db=dbutil.DBManager() self.URL=urlutil.URL() pass def setUp(self): #从数据库将token和id 查询出来 #连接数据库 self.cursor=self.db.Connection() #执行sql语句 sql_login="select userId,username,token from qiezzilogin where username='zhangsan1'" self.cursor.execute(sql_login) #获取对象 self.persons=self.cursor.fetchall() #使用for循环进行遍历 for person in self.persons: #获取userId,username,token self.userId=person[0] self.username=person[1] self.token=person[2] #获取父目录 file_parent=os.path.dirname(os.getcwd()) filename=open(file_parent+"/image/a.jpg",'rb') filename1=open(file_parent+"/image/b.jpg",'rb') #设置文字内容 self.data={ "username":self.userId, "token":self.token, "image":"你好中国啊" } #定义提交参数 self.json={ "image":filename, "image":filename1 } pass def tearDown(self): pass #发送朋友圈功能 def test_send_friend(self): #思路 #1.首先我们链接数据库查找出id 为2的 发送cireid的最大值 #2.我们进行网络请求,发送一条朋友圈 #3.我们再次连接数据库,获取cireid,并且是在userId为2,如果这次获取的cireid,比上次大一, #说明我们发朋友圈成功 接口没问题,同时根据cireid去查询message的内容和我们发送的内容一样 #说明我们发送成功 #4.同时因为我们发送了两张图片,在另一个表里面,所以我们需要去查询那个表,根据cireid,如果返回的数量 #和我们发送的数量一致,说明我们发送朋友圈没有问题 #python的参数函数类型 #1.必备参数:就是我们封装的方法的参数就叫必备参数 #2.关键字参数 printme(str="My string") #3.默认参数,在封装函数的时候,就指定一个默认值 #4.不定长参数 *vartuple(参数名字不定长) self.send_message=requests.post(self.URL.JD_SERVLET+self.URL.JD_SEND, files=self.json,data=self.data) #进行json解析 self.send_object=self.send_message.json() #通过sql找出最近id为2上传的内容,而且上传的内容的cireid必须是最大 #打开数据库 self.cursor=self.db.Connection() flush="flush privileges;" self.cursor.execute(flush) #关闭数据库 self.db.CloseDb() #再次打开数据库 self.cursor=self.db.Connection() # # #执行sql语句 sql = "select MAX(cireId) from cirefriend group by userId having userId=2" # sql = "select message from cirefriend group by userId having userId=2" #执行 self.cursor.execute(sql) #获取数据 self.cireids=self.cursor.fetchall() maxid=0 message="" #for循环进行遍历 for cireid in self.cireids: maxid=cireid[0] # message=cireid[1] self.assertEqual(self.send_object['statue'],0) #判断链接数据库获取的内容是不是和我们,发送的内容一致,如果一致说明没问题 # self.assertEqual(u"你好中国啊",message) pass # if __name__=="__main__": # unittest.main()suit包下的suit
#-*-coding:utf-8-*- #导入单元测试 import unittest from unit import login,send import HTMLTestRunner import os import sys reload(sys) sys.setdefaultencoding('utf-8') #实例化suit suit=unittest.TestSuite() #加入单元测试里面 # suit.addTest(unittest.makeSuite(login.Login)) suit.addTest(unittest.makeSuite(send.Send)) files=os.getcwd()+"/jd.html" filename=open(files,'wb') runner=HTMLTestRunner.HTMLTestRunner(stream=filename,title=u"茄子",description=u"茄子登录接口") runner.run(suit)