项菡

接口自动化测试之http请求实践总结

一、接口测试的基本思路

1、确定要测试接口的请求类型。接口是get请求还是post请求。

2、确定接口的参数。需要传输的参数有哪些,类型分别是什么,都有哪些要求等。

3、按照参数要求构造请求需要的参数,构造其他的请求信息,模拟发出请求。

4、对http请求返回的响应体进行解析,对解析中的部分或全部字段和预期结果进行对比。

除此之外,要模拟发送请求还有一些额外的操作,如登录要操作的系统、获取对应的权限等。

二、请求参数数据的构造

1、GET请求

  • 直接拼写

          只有一个参数,则直接拼写在域名后边:String url1 = "http://域名?+参数=值";

             有多个参数,则利用&进行拼接:String url2 = "http://域名?+参数1=值&参数2=值";

  • 利用DataProvider

           DataProvider功能,即可以使用多组测试数据来驱动一个测试方法,只是测试数据不一样,减少不必要的代码重复。

实例:

2、POST请求

     针对post请求,一般比较简单的是直接使用JSONObject或JSONArray类型的参数进行传递。一般参数会有类型限制,可以根据需求进行选择。

实例1:参数都是String类型,直接传各个参数


实例2:参数为Long和int类型,将参数拼接后传输json格式


实例3:字符串数组,可以使用List<String>


实例4:JSONArray


三、返回数据的校验

(1)、返回JSON数据

      在对响应进行解析时,需要根据返回的数据结果进行不同的校验。比较常见的有两种,下面分别进行说明。

       对JSON数据类型的校验,一般通过JSONArray或JSONObject对返回的数据进行解析,针对其中比较重要的字段和预期结果进行对比。

 1、JSON简介

      JSON是一种基于纯文本的数据格式,JSON协议是一种数据传输协议,只用来传输数据。JSON用Key-Value键值对来表示数据,其中Key只能用String表示。

 2、JSONObject和JSONArray的区别

  • JSONObject是一个Key-Value对,通过key获取value,JSONArray是一个数组,通过index即位置获取内容。
  • 表现形式:JSONArray是以“[]”包裹起来的数组(Array数组),而JSONObject是“{}”包裹起来的对象(Object对象)。
  • 转化:因为JsonObject的Value可以继续是JSONObject或JSONArray,所以解析的时候,会存在转化。

实例:

 1、JSON数据一jsonOne如下图所示:

   

   这个JSON数据的Key-Value对中的Value都是直接的值,可以通过方法直接获取。此时,我们只需要对此数据进行解析,然后对字段进行校验即可。利用TestNG进行校验,代码如下:

  

 2、JSON数据二jsonTwo如下图所示:

  

    可以看出,此JSON数据中,有部分Value是可以直接获取,但是Key-commonLimits对应的Value则是JSONObject的数组, 所以需要通过JSONArray获取到JSONArray之后再对其中的数据进行校验。利用TestNG对commonLimits中第一个 JSONObject的key-categoryId进行校验,代码如下:

 
 附:

 JSONArray官方文档:http://json.org/javadoc/org/json/JSONArray.html

 JSONObject官方文档:http://json.org/javadoc/org/json/JSONObject.html


(2)、只返回参数用来渲染html页面

 1、jsoup简介

 2、解析html字符串

     方法:parse(String html)

     作用:此方法将输入的HTML解析为一个新的文档(Document),然后可以使用Document中适当的方法或它父类Element和Node中的方法来取得相关数据。

     实例:一个字符串表示的htmlString,其中包含“文字",利用TestNG对其进行校验,代码:

     

excel导入导出用例设计总结

目前,为方便操作,很多系统都会增加批量导入导出的功能。文件导入导出一般格式都是excel。由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel导入导出功能测试起来都较为繁杂。现将常用设计用例总结如下。

批量导入

一、模板检查测试

       一般excel导入功能,都会提供模板下载功能。

     1、模板只有一个文件

          模板只有一个文件时,比较简单,检查一下模板和预期是否一致即可。

     2、模板是一个压缩包

          模板是压缩包时,需要检查一下压缩包中文件是否齐全,每一个文件和预期是否一致。

         注意:如果产品制作压缩包或者模板时,使用的是mac,请注意在Windows机器上检查一下文件,是否有多余。【因为解析原因,容易多一个无用的文件】

     3、文件打开格式

          excel打开目前支持excel和wps两种打开方式,需要确认这两种方式打开excel模板显示要一致。

二、内容校验

      1、必填项检查

           包括必填项不填,必填项部分不填,必填项全部填写几种情况。

      2、选择项

           包括不选择、选择其中一个、新增一个选项、尝试输入其他字符等。

      3、填写内容格式检查

           如要求整数、要求数字、要求字符、选择项、字符长度检查等。

      4、内容为空检查

           包含excel文件有很多行数据,其中某一行全部为空,某几行为空;某一行中间某个字段为空;excel文件只有表头;excel文件无任何数据。

      5、新增一行数据,然后将数据删除【如果开发判断方法有误,会认为删除的这条数据也存在】

      6、excel数据量检查

          excel文件中数据量可以接受最大值是多少。如果数据量较大时,后台处理时,页面如何显示?后台的处理是单线程还是多线程?处理时间较长时,是否会影响系统其他功能?对数据库造成的压力会有多大?这些问题都需要和开发确认,至少开发应该考虑到这种极限情况,进行相应的处理。

三、文件导入

      1、错误提示

           如果excel中某一行或者某一字段格式不对或者数据为空,则需要和策划确认是否提示到具体的字段。最终需要保证提示文案友好。

      2、导入其他格式的文件

           系统应判断出格式不对,根据具体要求提示相应文案,例如文件格式不对等。

      3、重复导入相同的文件

           需确认是否允许导入?如果允许数据将如何处理?比如覆盖或者忽略?

      4、excel用excel和wps两种软件编辑后导入

           如果开发使用的方法不对,会识别不了wps编辑的excel文件,需确认是否支持wps软件的编辑。

      5、不使用下载的模板,自己新建excel导入

           自己手动新建excel或者对其他excel进行修改,使excel格式和模板一致,这种情况下数据填写正确的话,应可以正确的导入系统。

      6、表头检查:包括去掉、修改、新增列、列之间切换等

批量导出

一、导出excel格式检查

      1、导出的excel格式是否符合预期

      2、excel中各字段是否正确。

     3、导出的excel文件名是否有要求。如果有要求,是否正确。

     4、不同浏览器导出的excel文件是否一致。

二、数据检查

    1、选择数据为空时是否可以导出。

    2、数据量较少时的导出检查。

    3、excel导出时数据的分页检查。【一般数据量较大时,开发都会分批次去取数据,分页时容易出现问题】

    4、数据量很大时,系统是否会出现问题,导出的时间检查,以及对系统其他功能的影响。【简单的压力测试】

利用Selenium实现图片文件上传的两种方式

在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同。

一、直接利用Selenium实现

     这种方式是最简单的一种实现方式,但是依赖于开发的实现。

    当开发直接使用file类型的input实现图片文件的上传时,实例:<input type="file" name=''filename">

    我们可以直接利用Selenium提供的方法实现文件上传,但是因为依赖开发的实现,而且目前实现基本都会利用框架,所以这种实现方式有很大的局限性。

  •   首先找到元素:WebElement  file = driver.findElement(By.name("filename"));
  •   给此元素设置值:file.sendKeys("E:\testfile.jpg");

二、利用AutoIT工具实现

       目前,一般实现文件图片上传的方式都是有一个按钮,点击之后直接调用操作系统自身的弹框,选择文件后,实现上传。因为Selenium不支持调用操作系统的操作,所以这种情况下,利用Selenium无法完成图片上传,这时,我们可以选择借用其他工具实现。

1、AutoIT介绍

     AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作,实现自动化。

2、实现原理

     利用AutoIT编写合适的脚本,然后将脚本编译成可执行文件,在自动化实现时,直接调用此脚本实现文件上传。

     备注:编写脚本和编译,需要借助AutoIT提供的工具,但是脚本编译成可执行文件后,可以直接使用,不再需要安装AutoIT。

3、自动化调用

  • AutoIT脚本编译成可执行文件后,放到本地的某一个目录下
  • 自动化实现过程中,需要上传图片时,首先定位到【上传】字样文本,点击此按钮
  • 执行编辑后的可执行文件,实现文件上传

  实例:

  假如,要上传图片的页面及html显示如下:

     

   利用AutoIT编写的脚本编译后的可执行文件的存放目录:E:\upfile.exe

  自动化实现代码:

 

4、AutoIT安装

  • 下载并安装AutoIT,下载链接:https://www.autoitscript.com/site/autoit/
  • AutoIT安装成功后,可以在开始菜单下看到AutoIT的所有工具,如下图所示:
  •     其中分为几类,AutoIT Window Info用来识别Windows控件,根据识别的控件信息编写脚本;Complie Script to .exe,用来将利用AutoIt编写的脚本,编译成可执行文件;Run Script 用来执行AutoIT的脚本信息;SciTE Script Editor用来编写AutoIt脚本。
  • 接下来就是利用以上四种工具,来编写AutoIT脚本,然后编译成可执行文件

5、利用AutoIT编写脚本

(1)  AutoIt Window Info

       打开此工具,利用此工具来识别Windows控件信息,如输入框、按钮等。

      此工具打开的界面显示:

     用鼠标拖住工具上的Finder Tool的图标(即图中蓝色圈圈部分)到要识别的控件上,控件的唯一标识信息会显示在工具的左侧部分(图中红框标出的部分)。

    从显示的结果得知,此控件的Title=“打开”,Class为Button,Instance=1。我们就是利用控件的这些信息,定位控件,编写脚本。

(2) SciTE Script Editor

     根据以上所识别的空间信息,利用此编辑器,利用此软件根据AutoIT的语法编写脚本。

     附实现文件上传需要的几个方法: 

    ControlFocus ( "窗口标题", "窗口文本", 控件ID)   设置输入焦点到指定窗口的某个控件上

    WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] )  暂停脚本的执行直至指定窗口存在(出现)为止

    ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本" )   修改指定控件的文本

    Sleep ( 延迟 )   使脚本暂停指定时间段

    ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] )   向指定控件发送鼠标点击命令

    其中,title即AutoIt Window Info识别出的Title字段,controlID即AutoIt Window Info识别出的Class和Instance的拼接,如上图拼接后的结果应为:Button1

    实例:

       

    AutoIT脚本编写完成后,可以通过菜单栏“Tools”-->“Go” 运行一下脚本。注意,运行的时候,上传窗口需处于打开状态。

6、AutoIT脚本编译成可执行文件

     脚本编辑运行无误后,将其保存。然后打开Complie Script to .exe工具,将保存的脚本编译成exe可执行文件。

    

    点击“Browse”选择保存的脚本文件,点击“Convert”将其生成exe文件。

    至此,利用AutoIT实现图片上传的流程结束。

SQL时间相关语句小计


1、MySQl数据库
     从目前所经历的项目来看,基本所有时间包括付款时间、签收时间、过期时间等,在mysql数据库中都会保存为long型,测试人员直接查询出之后看到的是long型数据,需要进行转换。
准换准则:long型保存的是毫秒级别,所以在转换时需要需要转换为秒,一般直接将后三位删除即可。
    (1)FROM_UNIXTIME
            可以直接写sql利用from_unixtime函数对时间进行转换:
           SELECT FROM_UNIXTIME(1439447226);
           反向转换:
           SELECT UNIX_TIMESTAMP("2015-08-21 09:00:00");
    (2)Unix时间戳转换
            可直接利用网上已有的工具,进行页面的操作,如
             http://tool.chinaz.com/Tools/unixtime.aspx
     注意点:
           利用FROM_UNIXTIME函数时,一般情况下是没有问题的,但是临界情况下会存在【差一毫秒】的问题,假设日期是1号的23:59:59:999,如果使用FROM_UNIXTIME这个函数查询的话会看到是2号00:00:00 。
          针对边缘时间,可以利用Java函数进行查看:

         SQL时间相关语句小计 - 张真真 - day day up

2、Oracle
     Oracle中时间有自己的格式,查询时可以利用to_char()函数根据需要进行转换,如转换为24小时显示格式,例子:
     select  to_char(TRADE_SUCCESS_TIME,'YYYY-MM-DD HH24:mi:ss') from TB_SHOP_ORDER  where ID = ?;

接口测试用例设计问题小结

1、关于“账号”

  • 不同的测试用例,如果可能涉及到对相同数据进行处理,尽量使用不同的账号。因为测试用例达到一定量的时候,为了效率会并行执行,如果使用相同的账号,可能会对同样的数据进行处理,互相影响,造成用例的执行失败。
  • 假如系统只有一个账号,如后台系统等,不能做到账号的不同,那就要做到数据分离。即每个测试用例,都对不同的数据如商品进行处理,这样并行执行时,测试用例操作的是不同数据,保证不会出现问题。
  • 设计测试用例时,如果业务逻辑要求用例每执行一次,就需要一个新的账号,这种需要考虑一下是否有必要设计为自动化测试用例。

2、关于“修改”

    本人设计接口测试用例时,涉及的是电商系统,其中包括很多修改,如商品、商家、店铺等等,针对这些数据的修改,会涉及到很多参数。如商品的名称,商品的尺 码,商品的颜色等等。那在设计实现“修改”接口时,如何确定要传哪些参数?是只需要传我要修改的参数,还是全部参数都要传?

答案:看后台逻辑实现。

举例:User有两个属性username,password

  • 后台逻辑实现:update User set username=? where id=xxx;

              那,如果你只想更新username的时候,可以不传password,其值是保持不变的。

  • 后台逻辑实现:udpate User set username=?,password=? where id=xxx;

            这种情况下,即使你只想更新username,也需要传password的值给后台,不然password就会被更新为空。

此外,还有一些数据如id等,如果sql中没有写,那即使传递了本字段的参数,数据库也不会更新。因此,在写关于“修改”的接口时,需要考虑一下,后台的逻辑是怎么实现的,然后确认要传递哪些参数。

未完待续.....

TestNG的特性总结

1、TestNG中的测试套件(<suite>)可以包括多个测试用例,一个测试用例可以包括多个测试类,而一个测试类中可以定义多个测试方法。

2、@Configuration这个注释的作用

3、注释Test除了标志其修饰的方法为测试方法, 还提供了groups的属性,运行的时候指定运行哪一个groups,则只有属于这个组的方法才会运行。

4、注释Test还支持属性dependsOnMethods和属性dependsOnGroups. 这两个属性主要用于规定测试方法的执行顺序。

5、TestNG的测试方法可以带有参数,参数可以通过@Parameter来声明,具体的参数值在testng.xml中定义

6、testNG可以从多个线程中运行测试方法,只需要将配置文件中suite的parallel属性设为true。线程的数目在thread-count中设置。如果两个方法有依赖关系,那么他们将在一个线程中运行,除此之外,都可以在多个线程中并发的运行。

    * parallel="methods": TestNG将在单独的线程中运行测试方法,除了那些依赖其他测试方法的,这些将在同一个线程中运行,以保证他们的执行顺序。

    * parallel="tests": TestNG将在一个线程中运行所有在同一个<test>标签中的测试方法,但是每个<test>标签将在单独的线程中运行。这 种方式容许把所有不是线程安全的类分组到相同的<test>标签中,保证他们将在相同的线程中运行,有利于TestNG使用尽可能多的线程来 运行测试。

    此外,thread-count属性容许指定运行时将分配多少线程。

7、invocationCount设定的是这个方法的执行次数

8、其他特性: