Android+接口测试基础1

接口测试

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)













你可能感兴趣的:(测试)