接口测试 接口测试巧用 “单一变量法”

乾行 for 点点点 · 2018年09月26日 · 最后由 心无旁骛 回复于 2018年09月29日 · 3812 次阅读

测试与实验

“单一变量法”,咋这么熟悉的名字?

高中生物课、化学、物理,大学时代的各种实验课中都有提及。

就是这个 “单一变量法”,也可用于软件测试领域。

示例

doSomething(req) 表示为接口测试过程中的某个方法,Java 代码如下(仅表示函数内部的一些调用细节):

public DoSomethingRes doSomething(DoSomethingReq req) {
  // check params
  check(req);
  DoSomethingRes res= null;

  SomeRpc rpc = getSomeRpc();
  SomeRpcReq rpcReq = build(req);
  rpc.doRpcMethod(rpcReq);

  // do something else

  return res;
}

请求参数:

{
  "user": "String",
  "type": "1",
  "queryStartDate": "2018-09-30"
}

其中 user 为字符串类型;
type 为枚举类型,取值范围为 [0,1,2]
queryStartDate 为日期格式,格式为 yyyy-MM-dd.

返回结果:

{
  "success": true,
  "message": "ok",
  "data":[
    {
      // json object
    },
    {
      // json object
    }
  ]
}

其中 success=true 表示接口调用成功,success=false 表示接口内部出现异常。
data 是一个对象数组。

单一变量法实践如下

选择 user、type、queryStartDate 三个正确参数,保持其中 2 个参数不变,仅修改其中 1 个参数。

  1. 检查各个参数进行非空校验,可以得到下述用例:
    (1)user=null,type=1,queryStartDate=2018-09-30
    (2)user=helloworld,type=null,queryStartDate=2018-09-30
    (3)user=helloworld,type=1,queryStartDate=null

  2. 检查各个参数进行空字符串校验,可以得到下述用例:
    (1)user=空字符串,type=1,queryStartDate=2018-09-30
    (2)user=helloworld,type=空字符串,queryStartDate=2018-09-30
    (3)user=helloworld,type=1,queryStartDate=空字符串

  3. 保持 user、queryStartDate 不变,遍历 type,检查 type 取不同枚举值接口返回结果是否正确,可以得到下述用例:
    (4)user=helloworld,type=0,queryStartDate=2018-09-30
    (5)user=helloworld,type=1,queryStartDate=2018-09-30
    (6)user=helloworld,type=2,queryStartDate=2018-09-30

  4. 单一变量法检查接口参数是否正常,可能会导致部分组合参数不能覆盖,需要在测试过程中根据实际代码覆盖率情况补充测试用例。
    举例:doSomething 内部针对特殊用户,代码执行了不同的业务代码,此时需要对特殊用户增加测试用例。
    (7)user=admin(特殊权限用户),type=0,queryStartDate=2018-09-30
    (8)user=admin(特殊权限用户),type=1,queryStartDate=2018-09-30
    (9)user=admin(特殊权限用户),type=2,queryStartDate=2018-09-30

为何使用单一变量法进行接口测试?

使用单一变量法,可以方便组织测试用例,甚至批量生成用例,并快速进行接口自动化测试。

代码实践

由你来发挥,建议动手实践。

申明

本文由作者同步发布到segmentfault知乎社区testerhome

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复 时间 点赞

文中仅列出单一变量法相关用例

如果请求的参数有三十个、五十个呢?😅 这个方法就不可取了。

@liuxiuneng 不这样认为,这个恰恰是针对多参数的,你可以批量生成用例啊,靠人工的话反倒会有漏的

心无旁骛 回复

是的,平常工作过程中在多参数接口测试中使用,虽然用例有冗余,但是脚本是机器执行的,成本比手动测试、单接口单场景逐一编写测试用例快很多。

@iqianxing 我前一段时间有生成用例的想法,昨天才真正开始写,但是遇到些问题,例如针对动态参数,针对时间戳或者是数据有限制,在几到几之间的,或者 UUID 之类的,这种不知道如何去生成用例

心无旁骛 回复
  1. 时间戳字段使用一个生产时间戳的函数生成。
  2. uuid 使用字符串拼接函数生成;
  3. 至于字段有取值限制(例如字段取值是枚举、散列数组等),可以通过遍历数组生成用例。

@iqianxing 但是参数里并没有告诉你要传入时间戳类型啊,我也许明白你意思,是这个参数做了一个标记需要传入时间戳吗。类似于 int,str 类型一样。

心无旁骛 回复

参数格式与类型都是根据接口文档来的。
当没有接口文档时,可以联系开发确认。

对于其他第三方接口(没有接口文档、也找不到别人家的开发),这时可以根据抓包来猜测接口参数类型与格式。

@iqianxing 嗯嗯,我昨天下午已经写了一个 demo 出来,我们是用的 swagger 文档,我是预计打算根据 swagger 文档一键生成用例的,省去自己手写的功夫。不过还没写好,今天写

心无旁骛 回复

生成的用例加上断言,此外看看是否有需要补充的用例。

@iqianxing 断言我打算回写到 excel 中,根据状态码来进行断言,如果状态码是标准状态码的话,一般成功请求的状态码为 200,如果异常用例接口返回 200 状态码的话代表接口有问题

乾行 接口测试巧用 “单一变量法” 中提及了此贴 06月03日 23:18
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册