接口测试01

    

*******************************************************************************
第一部分,fiddler(或Charles)抓包内容**********************************************

    1.什么时候会用到Fiddler
            1)、做安全测试,检测敏感信息是否加密,拦截篡改数据;
            2)、当测试时发现缺陷,用fiddler抓包,定位该问题是前端还是后端的问题;
            3)、模拟弱网环境;
            4)、统计单个功能的响应时间。

                注:接口响应时间小于200ms,我们通常认为优秀的
            
    2. Fiddler的抓包原理
        在客户端和服务器之间建立一个代理,通过监听端口(默认是 8888),
            监听客户端发出的请求和服务器返回的响应结果。

    3. HTTP请求报文由请求行、请求头(header)、空行和请求数据(body)组成
           HTTP响应报文主要由状态行、响应头部、空行以及响应正文组成。    


           请求头注意以下内容:
               Content-Type:请求体格式
               User-Agent:用户代理
               Referer:请求来源


        注意get和post区别    


    fiddler只能抓http和https协议的包,且需要.net 4.0支持 (演示Fiddler版本5.0)

    https://www.chinawealth.com.cn/zzlc/jsp/login/login.jsp
    密码加密的

    http://api.kaolafm.com/api/v4/pagecontent/list?pageid=103
    103和105数据不同

断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。
------------------------------------------------------------------
fiddler抓包(前面6个)

1. 数据过滤  

    右半部分点击 Filters → 勾选 Use Filters,
    选择show only Internet hosts(或不选)和 show only the following hosts,
    填写网址(多个网址用英文逗号隔开),点击Actions

    Filters → Use Filters → Show only if URL contains


2. 查看包的请求和响应 (Inspectors → WebForms、 Raw)

    左下角点击(Capturing)可以停止捕捉,紧挨着的是过滤类型(All Processes)


3. 查看请求响应时间    


4. 拦截篡改数据(重点关注请求前)

        a.拦截请求数据
            Rules → Automatic Breakpoints(自动断点)
             → 请求前

        b.拦截响应数据
            Rules → Automatic Breakpoints(自动断点)
             → 响应后


5. 模拟弱网环境(涉及到页面跳转需要模拟弱网,弱网一般指2G网络)

            2G一般上行/下行速率约为:2.7、9.6kbs,
            模拟设置为:uploaded 约 2962 ms,downloaded 约 833 ms;

            3G一般上行/下行速率约为:384、2560kbs,
            设置为:uploaded 约 2.6 ms,downloaded 约 0.39 ms;

    点击某个按钮,没有响应,可能的原因:
            a.网络延时  b.页面没有跳转  c.系统卡顿  d.服务器本身没有响应  e.兼容性问题

    模拟弱网步骤:

        1 点击Rules → Customize Rules…(自定义规则),或快捷键Ctrl+R,弹出脚本编辑器,
            Ctrl+F输入300(或download、upload等)定位到m_SimulateModem(模拟带宽),
             默认值如下(上传300,下载150):
             if (m_SimulateModem) {
                // Delay sends by 300ms per KB uploaded.
                oSession["request-trickle-delay"] = "300"; 
                // Delay receives by 150ms per KB downloaded.
                oSession["response-trickle-delay"] = "150"; 
            }

       2 修改上传和下载的延时时间(数值越大,延时越大,比如下载设置1000),保存Ctrl+S
       3 点击Rules(规则)→ Performance(性能)→ 勾选 Simulate Modem Speeds(模拟带宽)


6. 抓https的包    

        a.先安装HTTPS协议的证书,
        b.然后Tools → Options → HTTPS → 全部勾选(勾选抓取HTTPS信息),
        c.再在Certificates generated by CertEnroll(安全控件)点击蓝色字体(更换安全引擎),
            下拉列表选择MakeCert,OK之后重启fiddler
    

7.抓手机APP的包

    Tools →Options → Connections,默认监听端口8888(如果改成其他端口的话,则端口不能被占用),
        勾选Allow remote computers to connect(允许远程计算机连接),确定后重启fiddler即可

    手机端设置:跟电脑端在同一网段WiFi下,设置代理为手动,填写电脑端的IP(如192.168.0.52)、
        端口(fiddler默认8888),手机浏览器打开192.168.0.52:8888,下载并安装证书

    如果不小心将右上角的Online关闭,可以在View- Show Toolbar打开。

    打开手机浏览器即可抓包,作用:定位是前端还是后端问题

    删除手机中证书:安卓系统设置—安全—收信任的凭证—用户,点击证书删除即可;


8. 抓包进行接口测试

    Composer


9. 导出http请求到jmeter工具        

************************************************************************************

第二部分  接口测试

    1. 开发阶段,前端开发做什么,后端开发做什么,测试做什么?

        前后端分离开发模式
            前端:关注UI界面,拿到后端返回的数据,根据需求决定如何展示,不关注数据如何处理;
            后端:根据业务逻辑,拿到数据返回给前端调用,不关注界面实现;
            接口联调:一般1~2天

        开发写好一个接口,我们就测一个接口,当所有接口测试通过,前端开发完成,做联调测试,
            接口联调通过,进行冒烟测试、功能测试、回归测试、验收测试、上线、总结

        前端开发完成,后端没完成,怎么办?
            使用mock工具模拟数据    ,工具里面配置URL、响应数据

        后端开发完成,前端没完成,怎么办?
        接口测试


    2. 为什么做接口测试?
            1,检查UI界面无法发现的问题,绕过前端验证,测试后端
            2,测试右移,尽早介入测试,降低修复成本,
            3,接口一旦测试好,后端不变,前端可以随意变,
            4,更易于与持续集成工具整合。


    3. 接口的分类:
            http协议接口:http请求,遵循http协议
            webService接口:soap请求,遵循一种特殊的xml消息格式,Content-Type设置为text/xml    

            soap协议相比http协议,能处理更加复杂的数据类型


    4. 接口测试流程
            分析接口文档
            设计接口用例
            执行接口测试
                工具:jmeter、postman、soapUI等
                代码:python+requests+unittest等

--------------------------------------------------------------------------------------------

jmeter  5.2.1

1. 随机登录-函数助手
    使用br-api接口,表名为username
    使用mysql数据库:br-api,

    准备工作
        先使用注册接口注册几个账号如 juzi01~juzi05,再使用登录接口验证账号登录

    1-1. 连接mysql,使用函数助手获取随机值

        1. 测试计划中添加JDBC驱动,即在页面底部,将mysql-connector-java-5.1.13-bin.jar添加到ClassPath。
                或者将这个jar包直接放在JMeter安装目录的lib文件夹中,重启jmeter,就无需在【测试计划】中添加了。
        2. 右键线程组→添加→配置元件→JDBC Connection Configuration,拖到上面
        3. 在Variable Name for created pool中填写连接所绑定的变量名,如mysql123
        4. 在页面中下位置,Validation Query里面选择Select 1
        5. 在Database URL里面填写 jdbc:mysql://地址/库名,如 jdbc:mysql://211.149.163.145:3306/br_api
            常用格式:jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf8,加入后缀防止乱码。
        6. 在JDBC Driver class里面选择 com.mysql.jdbc.Driver ,随后填写 Username 和 Password ,其余默认即可。
        7. 右键线程组→添加→取样器→JDBC Request , 顺序挨着 JDBC Connection Configuration 即可
        8. 在Variable Name of pool declared in JDBC Connection Configuration处填写5中的名称mysql123
        9. Query Type选择 Select Statement(查询的),如果是增删改则选择Update  Statement
        10. Query里面填写sql语句,如 select id, username from users where username like 'juzi%';
        11. Variable names里面填写sql语句返回结果的各个字段存储的变量名,注意顺序对应起来,如 id, username
        12. 右键线程组→添加→取样器→调试取样器,拖到JDBC Request下面, 在调试取样器名称后面加上 _${username_#}
        13. 添加察看结果树,运行即可看到sql执行结果;还可看到调试取样器结果,里面有指定变量代表的值,
            其名称变成了 原名称_5,此处的5表示最大值,也说明 ${username_#} 就是最大值

    1-2. 借助函数助手,获取随机值        

        1. 函数助手里面选择 __Random,最小值写1,最大值写 ${username_#} ,点击生成,
            复制字符串 ${__Random(1,${username_#},)}
        2. 调试取样器名称将 原名称_${username_#} 里面的 # 替换为上一步复制的字符串,再复制最外层花括号里面的代码 
        3. 函数助手选择 __V,值里面写上一步复制的代码,生成后复制${__V(username_${__Random(1,${username_#},)},)} ,
                粘贴在调试取样器名称后面,即 原名称_复制的函数代码
        4. 运行即可看到调试取样器名称后面随机取值了    ,说明  ${__V(username_${__Random(1,${username_#},)},)} 
                就是username的随机值

    1-3. 借助BeanShell生成全局变量 ,实现随机值登录、断言等

        1. 添加登录接口,参数username填写上面的随机值代码即可实现随机值登录,但此处的随机用户名未必和调试取样器
                里面的结果一致,需要借助 BeanShell 取样器
        2. 右键线程组→添加→取样器→BeanShell 取样器,放在JDBC Request下面,用来生成全局变量,
                脚本框里面输入 vars.put("新变量","原变量"); ,原变量为随机值的代码,
                如 vars.put("username","${__V(username_${__Random(1,${username_#},)},)}");
        3. 此时 ${username} 就是全局变量了,可将其用于请求参数化、断言等,注意调试取样器后缀也改成 _${username}


2. 随机登录-JavaScript脚本

    2-1. 连接mysql,同步骤1-1

            1. 右键线程组→添加→配置元件→JDBC Connection Configuration
            2. 右键线程组→添加→取样器→JDBC Request
            3. 右键线程组→添加→取样器→调试取样器,调试取样器名称后面加上 _${username_#}
            4. 添加察看结果树,运行后确定最大值

    2-2. 借助JavaScript脚本获取随机值

        1. 右键 JDBC Request→后置处理器→JSR223 后置处理程序,语言选择javascript  (. . .)
        2. 脚本位置输入3行代码,注意分号结束,(其中//为JS脚本中的注释,可以不写)

                    // 1.获取用户数量
                    var count = vars.get("username_#");
                    // 2..随机取值
                    // Math.random()*5  随机返回5以内的小数(小于5)
                    // Math.floor(Math.random()*5)  随机返回5以内的整数(从0开始总共5个数,0~4)
                    // Math.floor(Math.random()*5+1)  随机返回6以内的整数(从1开始总共5个数,1~5)
                    var number = Math.floor(Math.random()*count+1);
                    // 3.将随机值存放到变量num中
                    vars.put("num",number);

        3. 打开函数助手选择__V,值里面写上username_${num},点击生成,复制 ${__V(username_${num},)}
    
    2-3. 借助BeanShell生成全局变量 ,实现随机值登录、断言等,步骤同1-3

            1. 右键线程组→添加→取样器→BeanShell 取样器,放在JDBC Request下面,用来生成全局变量
                脚本框里面输入 vars.put("新变量","原变量"); ,原变量为随机值的代码,
                如 vars.put("username","${__V(username_${num},)}");
            2. 此时 ${username} 就是全局变量了,可将其用于请求参数化、断言等,注意调试取样器后缀也改成 _${username}


3. webservice接口实战

    http 和 webservice 都是基于TCP/IP协议的应用层协议
    webservice是基于http的soap协议传输数据,webservice=soap=http+xml,
    webservice协议就是由http+xml组成的,其中xml中会用到wsdl,wsdl是描述语言xml中的一种格式。


    获取省份
    http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getSupportProvince

    获取城市(获取指定省份下的城市)
    http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getSupportCity

    获取指定城市下的天气预报
    http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName

    3-1. 获取省份

        1. 添加http请求,填写请求相关信息:
            服务器信息(http协议,端口默认80,主机ip)、请求方式(post)、请求路径、
            请求头(Content-Type: text/xml; charset=utf-8)、请求体(xml格式)
        2. 添加查看结果树,发送请求


    3-2. 获取指定省份下的城市

        1. 添加http请求,填写请求相关信息:服务器信息、请求方式、请求路径、请求头、请求体(xml格式)
        2. 在3-1.获取省份请求里面添加【后置处理器】获取省份名称,后置处理器可选择XPath提取器(表达式填写//string)
            或CSS/JQuery提取器(表达式填写string),注意后置处理器各自语法,在查看结果树测试
        3. 修改步骤1里面请求体部分的string,修改为省份名称的变量,如 ${provinceName},发送请求
        4. 查看结果树如果获取不到想要的结果,需要在该请求的内容编码处填写 utf-8


    3-3. 获取指定城市下的天气预报(本接口服务器需改为webxml.com.cn,但响应有误,请忽略)

        1. 首先根据3-2的请求获取到城市信息,即在3-2请求里面添加后置处理器,XPath提取器(表达式填写//string) 
        2. 在3-2请求后面添加调试取样器,名称后面加上步骤1里面的引用名称,如-${cityInfo}
        3. 执行脚本后,查看调试取样器,可看到名称为 滁州 (58236),或 日内瓦 GENEVE (6700),我们需要提取出中文
        4. 添加http请求,填写请求相关信息:服务器信息、请求方式、请求路径、请求头、请求体(xml格式)
        5. 在该请求里面添加【前置处理器→JSR223 预处理程序】,将步骤1提取到的城市信息处理成中文
        6. 上一步添加的JSR,语言选择JavaScript,脚本里面内容如下(注意分号结束):

                    // 获取城市名称
                    var city = vars.get("cityInfo");
                    // 对城市名称进行拆分,如滁州 (58236),日内瓦 GENEVE (6700)
                    // 将city用空格切割,并选择第一个
                    var newCity = city.split(" ")[0];
                    // 将处理后的城市名称,赋值给变量cityName
                    vars.put("cityName",newCity);

        7. 在请求后面添加调试处理器,名称后面加上上一步的城市名称的新变量如 -${cityName},验证城市名
        8. 将步骤4添加的请求,内容编码改为utf-8,请求体部分的string改为城市名称的变量,如 ${cityName}
        9. 再次发送请求,如果查看结果树异常(可勾选自助重定向),可查看结果树里面的请求数据是否正确。


4. br-电商项目接口(br-api.username)

    注:上述接口可先禁用

    4-1. 注册 ( 或随机函数${__Random(13000000000,19999999999,)}  )

        1. 借助__time函数生成随机手机号:函数格式填写 /100,点击生成,复制代码 ${__time(/100,)}
        2. 填写注册接口相关信息,其中请求体部分,账号为名字+手机号,如  juzi${__time(/100,)},
            密码为123456,手机号为 ${__time(/100,)}
        3. 发送请求,每次均为使用随机手机号注册

        4. 补:可以将获取的随机手机号存储为全局变量:右键线程组→添加→BeanShell 取样器,拖到最前面,
            脚本里面内容如下:

                    // 将获取到随机手机号,存储到变量phone
                    vars.put("phone","${__time(/100,)}");

        5.     将注册接口请求体里面的     ${__time(/100,)} 替换为 ${phone}

        
    4-2. 登录

        1. 如果登录密码从数据库中读取,需要先连接数据库,具体如下:
            1. 测试计划页面底部配置mysql驱动,如 C:\接口测试\mysql-connector-java-5.1.13-bin.jar
            2. 添加配置元件→JDBC Connection Configuration,填写信息参考步骤1-1里面的2~6
            3. 添加取样器→JDBC Request,填写信息参考步骤1-1里面的7~11,其中sql脚本为
                    select u_pwd from UserName where u_phone =  "${phone}";  注意表名大小写需要区分,
                    Variable names填写 passwd
            4. 注意,连接数据库的请求需要拖到注册请求后面    ,因为只有注册账号后,才能获取到密码
            5. 添加调试取样器,查看获取的密码是否正确,可在调试取样器名称后面加上 -${passwd_1}    
            6. 添加登录请求,注意密码为 ${passwd_1}     ,发送请求


    4-3. 修改昵称    

            边界提取器,    到察看结果树,边界提取器测试里面调试,注意写清楚左右边界 (了解)

            json提取器,到察看结果树,Json Path Tester里面调试,要求响应数据必须是json格式
                提取userId,可以使用json提取器,名称填写 userId,表达式填写 $..userId  或 $.data.userId

            正则表达式提取器,到察看结果树,RegExp Tester里面调试,注意空格
                提取token,可以使用正则表达式提取器,名称填写 token,表达式填写 "token": "(.+?)"
                模板填写$1$

                () 表示括起来的部分就是要提取的。
                    . 表示匹配任何字符串。
                    + 表示一次或多次。
                    ? 表示不要太贪婪,在找到第一个匹配项后停止。
                    模板:用$$引用起来,如果在正则表达式中有多个值,则可以是$2$,$3$等等,表示解析到的第几个值

              -----------------------登录响应-----------------------------------------------------------
                                                    { "wish": "事业爱情双丰收!",
                                                        "code": 0,
                                                        "data": {
                                                            "phone": "16534032916",
                                                            "nickName": "juzi16534032916",
                                                            "headPic": "http:\/\/211.149.163.119\/login\/default.jpg",
                                                            "userId": 289,
                                                            "token": "eyJ0eXAiOFo5gKZOyk" },
                                                        "message": "登录成功"    }


    4-4. 修改用户密码


    4-5. 用户上传头像

            请求里面,切到文件上传,注意参数名称、MIME类型分别是photo、File


    4-6. 根据用户ID查询用户信息        

5.  ant + jmeter + jenkins

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值