本帖最后由 乐哈哈yoyo 于 2017-7-11 16:07 编辑
通过对接口的业务参数和技术细节进行分离,实现简洁优雅的接口测试。
传统的测试用例编写方式对于在自动化测试中将测试数据与代码实现进行分离的好处,我之前已经讲过多次,这里不再重复。 测试数据与代码实现分离后,简单的接口还好,测试用例编写不会有什么问题;但是当面对复杂一点的接口(例如包含签名校验等机制)时,我们编写自动化测试用例还是会比较繁琐。 我们从一个最常见的案例入手,看下编写自动化测试用例的过程,相信大家看完后就会对上面那段话有很深的感受。 以API接口服务(Mock Server)的创建新用户功能为例,该接口描述如下: 请求数据:
Url: [color=#069d6 !important]http://127.0.0.1:5000/api/users/1000
Method: POST
Headers: {"content-type": "application/json", "Random": "A2dEx", "Authorization": "47f135c33e858f2e3f55156ae9f78ee1"}
Body: {"name": "user1", "password": "123456"}
######
预期的正常响应数据:
Status_Code: 201
Headers: {'Date': 'Fri, 23 Jun 2017 07:05:41 GMT', 'Content-Length': '54', 'Content-Type': 'application/json', 'Server': 'Werkzeug/0.12.2 Python/2.7.13'}
Body: {"msg": "user created successfully.", "success": true, "uuid": "JsdfwerL"}
其中,请求Headers中的Random字段是一个5位长的随机字符串,Authorization字段是一个签名值,签名方式为TOKEN+RequestBody+Random拼接字符串的MD5值。更具体的,RequestBody要求字典的Key值按照由小到大的排序方式。接口请求成功后,返回的是一个JSON结构,里面的success字段标识请求成功与否的状态,如果成功,uuid字段标识新创建用户的唯一ID。 相信只要是接触过接口测试的同学对此应该都会很熟悉,这也是后台系统普遍采用的签名校验方式。在具体的系统中,可能字符串拼接方式或签名算法存在差异,但是模式基本上都是类似的。 那么面对这样一个接口,我们会怎样编写接口测试用例呢? 首先,请求的数据是要有的,我们会先准备一个可用的账号,例如{"password": "123456", "name": "user1"}。 然后,由于接口存在签名校验机制,因此我们除了要知道服务器端使用的TOKEN(假设为debugtalk)外,还要准备好Random字段和Authorization字段。Random字段好说,我们随便生成一个,例如A2dEx;Authorization字段就会复杂不少,需要我们按照规定先将RequestBody根据字典的Key值进行排序,得到{"name": "user1", "password": "123456"},然后与TOKEN和Random字段拼接字符串得到debugtalk{"password": "123456", "name": "user1"}A2dEx,接着再找一个MD5工具,计算得到签名值a83de0ff8d2e896dbd8efb81ba14e17d。 最后,我们才可以完成测试用例的编写。假如我们采用YAML编写测试用例,那么用例写好后应该就是如下样子。 - name: create user which does not exist request: url: http://127.0.0.1:5000/api/users/1000 method: POST headers: Content-Type: application/json authorization: a83de0ff8d2e896dbd8efb81ba14e17d random: A2dEx data: name: user1 password: 123456 response: status_code: 201 headers: Content-Type: application/json body: success: true msg: user created successfully. uuid: JsdfwerL该测试用例可以在ApiTestEngine中正常运行,我们也可以采用同样的方式,对系统的所有接口编写测试用例,以此实现项目的接口自动化测试覆盖。 但问题在于,每个接口通常会对应多条测试用例,差异只是在于请求的数据会略有不同,而测试用例量越大,我们人工去准备测试数据的工作量也就越大。更令人抓狂的是,我们的系统接口不是一直不变的,有时候会根据业务需求的变化进行一些调整,相应地,我们的测试数据也需要进行同步更新,这样一来,所有相关的测试用例数据就又得重新计算一遍(任意字段数据产生变化,签名值就会大不相同)。 可以看出,如果是采用这种方式编写维护接口测试用例,人力和时间成本都会非常高,最终的结果必然是接口自动化测试难以在实际项目中得以开展。 |