目录

接口测试用例编写举例

接口测试用例编写举例

经过前三章的学习,我们准备好了对接口进行自动化测试的相关知识。现在我们开始讲解接口自动化测试用例的编写。在本章编写的测试用例中,我们只针对具体的接口,编写自动化测试用例,而不对代码 进行规划,那些儿进阶性的知识点,我们将在后面的章节讲解。先学习如何砌砖,然后我们再去建自己的高楼大厦。

4.1 Get 方式接口自动化用例

Get 方式的接口自动化相对来说比较简单,直接调用接口地址,把参数放到接口地址后面即可。下面我们以众筹网的接口实例来讲解:

(1) 接口文档

按关键字搜索项目(

GET

):

URL

参数:

keyword

,搜索关键字

offset

,拉取偏移,非必需,默认为

0

count

,拉取个数,非必需,默认为

10

返回:项目

Feed

基础数据结构

数组

上面是一个搜索项目的接口文档,从文档中我们得知,这个接口是 Get 方式的,而且有三个参数,第一个参数是必需的,后两个参数是非必需的。返回值是 Feed 基础数据结构的数据(暂不要理会)。

(2)Curl 命令调用

为了安全期间,我们调用测试环境下的数据,先绑定 host:xx.xx.xx.xx api.zhongchou.cn 。然后在终端下执行下面的命令:

[root@n028 api]# curlhttp://api.zhongchou.cn/deal/list?v=1&keyword=' 测试 '

执行结果如图4.1.1所示:

https://img-blog.csdn.net/20150409172842127?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.1.1 Curl 调用接口返回值

当然,上面在终端下的接口返回的结果是加密后的 json 字符串,不太容易看明白。

(3) 浏览器访问接口

为了使用接口返回值更加清晰明了,我们要借助于一个浏览器插件 JsonView 。此插件可以直接解析接口返回的 json 字符串,方便明了,不过有个缺点:只能查看 Get 方式的接口。

针对上面的例子,我们直接在浏览器的地址栏中输入 ,然后回车,就可以看到如图 4.1.2 所示:

https://img-blog.csdn.net/20150409172817186?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.1.2 浏览器访问接口

这样访问接口,返回值是不是更加清晰了。对应返回值中包含的汉字也作了对应的解码。

(4)PHP 调用 Get 方式接口

PHP 对接口的调用有完整的一套函数,对于 Get 方式的接口,只需要调用函数 file_get_contents ()就能得到返回值。

示例代码如下:

[php]

  1. class

    Demoextends PHPUnit_Framework_TestCase{

  2. public

    function

    testSearch()

  3. {

  4. $url

    =

    “ 测试&v=1”

    ;

  5. $ret

    =

    file_get_contents

    (

    $url

    );

  6. echo

    $ret

    ;

  7. }

  8. }

在JetBrains PhpStorm执行结果如图4.1.3所示:

https://img-blog.csdn.net/20150409172945775?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.1.3 PHP 调用 Get 接口执行结果

这个结果和在终端下调用 Curl 命令结果是一样的,那有没有和浏览器下结果那样的呢?当然有了,因为这个接口返回值是 json 编码过的,我们调用函数 json_decode ()解码一下即可。解码后的结果见图 4.1.4 所示:

https://img-blog.csdn.net/20150409172925498?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.1.4 对接口返回值进行解码输出

(5)PHP 编写 Get 接口自动化测试用例

经过上面的四步分析,我们已经可以用 php 来调用接口了,可是这还不是完整的自动化测试用例。我们需要添加对返回结果的验证,如果和预期的一样,就成功,如果不一样就失败。

完整的测试用例:

[php]

  1. class

    Demo extendsPHPUnit_Framework_TestCase{

  2. public

    function

    testSearch()

  3. {

  4. /**

  5. *测试搜索接口

  6. **/

  7. $url

    =

    “ 测试&v=1”

    ;

  8. $ch

    = curl_init();

  9. curl_setopt( $ch

    , CURLOPT_URL,

    $url

    );

  10. curl_setopt( $ch

    , CURLOPT_RETURNTRANSFER, 1);

  11. curl_setopt( $ch

    , CURLOPT_HEADER, 0);

  12. $ret

    =curl_exec(

    $ch

    );

  13. curl_close( $ch

    );

  14. $data

    =json_decode(

    $ret

    ,true);

  15. //print_r($data);

  16. if

    (

    is_null

    (

    $data

    )==false)

  17. {

  18. if

    (

    $data

    [

    ’errno’

    ]==

    ‘0’

    )

  19. {

  20. $this

    ->assertEquals(

    ‘0’

    ,

    $data

    [

    ’errno'

    ]);

    //判断errno是否为0,此步为抛出执行通过

  21. $index

    =

    strpos

    (

    $data

    [

    ‘data’

    ][0][

    ’name'

    ],

    ‘测试’

    );

  22. $this

    ->assertnotEquals(-1,

    $index

    );

    //判断结果是否包含关键字

  23. print( ‘接口/deal/list:搜索接口——————OK’

    .

    ‘\n’

    );

  24. }

  25. else

  26. {

  27. $this

    ->assertEquals(

    ‘0’

    ,

    $data

    [

    ’errno'

    ]);

    //抛出执行失败

  28. print( “接口/deal/list:搜索接口—————Failure!”

    .

    “\n”

    .

    $ret

    .

    “\n”

    );

  29. }

  30. }

  31. }

  32. }

我们为了判断结果,没有调用 file_get_contents ()函数,而改用了 PHP 调用接口的通用方法,如果不理解可以去网上查找相关讲解。而后我们加入了对接口返回值 $data 的判断:判断 errno 是否为 0 ,查询结果中有没有包含关键字等。对于检测点的设置技巧,我们将在后面进阶篇中讲解。

结过这样的测试用例代码,我们就可以执行测试用例了,并且测试用例会自己判断接口调用的结果。执行结果如图 4.1.5 所示,如果想查看接口的具体返回值,只需要取消 //print_r($data); 此句的注释即可。

https://img-blog.csdn.net/20150409173047960?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.1.5 Get 接口的执行结果

4.2 Post 接口自动化测试用例

Post 方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调用,但是可以用 Curl 命令的 -d 参数传递接口需要的参数。当然我们还以众筹网的登录接口为例,讲解 post 方式接口的自动化测试用例。

(1) 接口文档

. 登录 (POST)

URL

参数:

·

identity

,用户名、用户手机、用户邮箱,三者之一

·

password

,用户密码

返回:

·

errno

0

:表示成功,非

0

:表示失败

·

**User

基础数据结构**

·

token

,成功会返回

32

token

字符串,失败会返回空字符串

这个接口文档很清楚,就是传递用户名和密码进行登录,登录后会返回 user 基本数据结构和 Token 。

(2)Curl 命令执行

分析了接口文档,我们需要在终端下执行接口,然后才能根据接口的返回值来编写对应的接口测试用例。

在终端下执行命令:

[root@n028 api]# curl -d ‘identity=1838905&password=a**0’

其中的identity为众筹网的用户名,password为密码,V=1是因为这个接口是第一版本的。执行结果如图4.2.1所示:

https://img-blog.csdn.net/20150409173111173?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图 4.2.1 post 接口 Curl 执行结果

(3)Curl返回值查看

由于post方式无法用浏览器直接调用,返回结果是编码后的json字符串,不方便我们查看结果。所以我们要借助于chrome的插件。

打开chrome浏览器->右击浏览器,选择“审查元素”->在浏览器下部选择“Console”选项卡。在打开的栏目下的“>”后输入dir().然后将刚刚终端Curl返回的结果拷贝到这个函数中,回车即可解析结果。如图4.2.2所示:

https://img-blog.csdn.net/20150409173131562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图4.2.2 Chrome查看出post返回结果

(4) PHP 调用 Post 方式接口

PHP调用Post接口和Get方式有所不同,一般用以下方式调用,而且是固定的:

[php]

  1. public

    function

    testlogin()

  2. {

  3. $url

    =

    ;

  4. $post_params

    =

    array

    (

    ‘identity’

    =>

    ‘183****8905’

    ,

    ‘password’

    =>

    ‘a0****0’

    );

  5. $ch

    = curl_init();

    //初始化curl

  6. curl_setopt( $ch

    , CURLOPT_URL,

    $url

    );

    //抓取指定网页

  7. curl_setopt( $ch

    , CURLOPT_HEADER, 0);

    //设置header

  8. curl_setopt( $ch

    ,CURLOPT_RETURNTRANSFER, 1);

    //要求结果为字符串且输出到屏幕上

  9. curl_setopt( $ch

    , CURLOPT_POST,1);

    //post提交方式

  10. curl_setopt( $ch

    ,CURLOPT_POSTFIELDS,

    $post_params

    );

  11. $data

    = curl_exec(

    $ch

    );

    //运行curl

  12. curl_close( $ch

    );

  13. echo

    $data

    ;

  14. }

然后执行代码,就可以看到如图4.2.3所示的输出结果:

https://img-blog.csdn.net/20150409173325033?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图4.2.3 PHP调用post方式接口

如到Get方式,这个输出结果同样是经过编码后的json字符串,我们也需要对其进行json_decode()解码一下,然后再输出结果。所以增加以下两行代码:

$res=json_decode($data);

print_r($res);

此时的输出结果图4.2.4所示,简单清晰了许多。

https://img-blog.csdn.net/20150409173308017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图4.2.4 PHP解码后的输出结果

(5) PHP 编写 Post 接口自动化测试用例

现在PHP能调用post方式的接口了,可是没有添加自动判断执行结果的脚本,不算是一个真正的测试用例。接下来我们添加上对返回值的assert语句,使之成为一个完整的自动化测试用例。

完整的测试用例如下:

[php]

  1. public

    function

    testlogin()

  2. {

  3. $url

    =

    ;

  4. $post_params

    =

    array

    (

    ‘identity’

    =>

    ‘183****8905’

    ,

    ‘password’

    =>

    ‘a0******0’

    );

  5. $ch

    =curl_init();

    //初始化curl

  6. curl_setopt( $ch

    ,CURLOPT_URL,

    $url

    );

    //抓取指定网页

  7. curl_setopt( $ch

    ,CURLOPT_HEADER, 0);

    //设置header

  8. curl_setopt( $ch

    ,CURLOPT_RETURNTRANSFER, 1);

    //要求结果为字符串且输出到屏幕上

  9. curl_setopt( $ch

    , CURLOPT_POST, 1);

    //post提交方式

  10. curl_setopt( $ch

    ,CURLOPT_POSTFIELDS,

    $post_params

    );

  11. $res

    =curl_exec(

    $ch

    );

    //运行curl

  12. curl_close( $ch

    );

  13. $data

    =json_decode(

    $res

    ,true);

  14. //print_r($data);

  15. if

    (

    is_null

    (

    $data

    )==false)

  16. {

  17. if

    (

    $data

    [

    ’errno’

    ]==

    ‘0’

    )

  18. {

  19. $this

    ->assertEquals(

    ‘0’

    ,

    $data

    [

    ’errno’

    ]);

    //判断errno是否为0,此步为抛出执行通过

  20. $index

    =

    strpos

    (

    $data

    [

    ‘data’

    ][

    ’name'

    ],

    ‘8905’

    );

  21. $this

    ->assertnotEquals(-1,

    $index

    );

    //判断结果是否包含关键字

  22. print( ‘接口/user/login:登录接口——————OK’

    .

    “\n”

    );

  23. }

  24. else

  25. {

  26. $this

    ->assertEquals(

    ‘0’

    ,

    $data

    [

    ’errno'

    ]);

    //抛出执行失败

  27. print( “接口/user/login:登录接口—————Failure!”

    .

    “\n”

    .

    $res

    .

    “\n”

    );

  28. }

  29. }

  30. }

Assert判断语句和get相似,先判断返回errno,然后判断返回的name是不是我们刚刚登录的账号。当然如果返回值不是我们预期的,也要使测试用例执行失败。执行结果如图4.2.5所示,同样如果要看接口返回值 ,注销掉 //print_r($data);

https://img-blog.csdn.net/20150409173442456?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ua2luZzAzMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

图4.2.5 PHP post接口测试用例执行结果

4.3 测试用例的覆盖

上面我们讲述了 get 和 post 两种方式的接口自动化测试用例的编写,通过运行我们发现还是挺简单的嘛。不过上面两种测试用例只是接口的一个正常的测试用例,而对于一个接口的测试用例覆盖是非常多的。下面我们就常用的接口测试用例覆盖方法列举一下:

( 1 )必需参数覆盖。对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的。对于必需的参数,一定要测试传参数和不传参数接口是否报错?

(2)必需的参数各种情况覆盖。传非法的字符,特殊的字符,空值,超过边界的参数是否报错?错误信息是否正确?

(3)非必需参数覆盖。一般接口对于非必需参数都不会做非正常性传值的判断,所以要测试合法的参数值 ,接口返回的内容是否正确。如果有接口文档说明对非必需参数做了非正常的验证的话,也要对其进行验证。

(4)参数的组合覆盖。有些儿参数需要相互配合着才起作用,如“offset”和“count”组合起来进行翻页,这个时候要组合起来进行测试。

(5)业务逻辑相关的覆盖。有些儿接口与业务逻辑关联密切,单独从接口角度测试,可能会遗漏掉一些儿因业务逻辑而产生的bug。所以如果和业务逻辑相关,也要考虑到业务逻辑相关的测试用例。

其实接口的测试用例差不多也就这些儿情况,也许有特殊的接口,到时候和产品,开发人员做好沟通,尽量先从接口层面保证质量。这样再从测试接口的应用层的时候,就可以少很多工作量,只注重样式和各个接口调用的配合就可以了。

4.4 本章小结

本章讲述了常用的 Get 和 Post 方式 Curl 命令调用,浏览器调用和查看接口返回值的方法,以及对应的接口自动化用例的编写方法。最后还介绍了接口测试用例的覆盖方法,通过本章的学习我们可以参照接口文档,写出这个接口的所有自动化测试用例。下章节我们将讲述对测试架构的规划及测试用例的组织。