美文网首页
Dapeng文档站点的单元测试之路

Dapeng文档站点的单元测试之路

作者: 枫叶_huazhe | 来源:发表于2020-01-13 00:02 被阅读0次

    1.背景

    目前文档站点的接口方法测试页面,输入请求数据,点击测试,返回结果。


    文档站点.png

    文档站点嵌入的单元测试也会以此为基础。单元测试是针对特定接口的方法进行测试的,这里我们理解请求参数的输入类似于单元测试中的coding输入,返回结果类似于于单元测试中请求方法后的返回结果。

    本质上,用户在使用文档站点的测试页面时,每次的输入参数和点击返回结果就算的上是一次测试,只是这个测试没有进行录制,不能进行回放。

    因此通过这个特性,我们可以基于文档站点构建出一个灵活可用的在线单元测试功能出来。

    1.1 文档站点单元测试的优势

    • 服务写完直接通过http请求测试,不需要在本地写代码进行测试,节约时间和精力。
    • 每次请求的数据可以保存为模板,下次直接选择模板,更改部分参数请求
    • 方便后台与前端的对接,前端直接使用文档站点获取需要传送的数据(schema定义清晰)

    2. 功能设计

    2.1 TestCase生成

    一个TestCase由请求输入参数(json),预期结果模板、来源三部分组成,其详细介绍如下:

    • 来源: 当前测试case来自于哪个服务、哪个方法,并根据来源对这个测试case生成唯一的 name。
    • 输入参数: 对目标执行请求的输入参数(本文皆为json),类似于junit中我们手动写好的参数输入代码
    • 预期结果模板:运行此测试类,根据返回结果和这里定义好的结果模板进行匹配(匹配解析规则见后文),符合预期则认为此case测试通过。

    根据已有在线测试模板自动生成 TestCase,用户根据业务需求可以对已生成的case进行修改。

    2.2 同一方法的多测试路径配置

    自动生成的 TestCase 是以每个接口的方法为维度的,默认1个TestSuit。一般情况下,用户都需要对自动生成的测试case进行修改,并且可能根据不同的测试维度,对同一个方法,可根据测试路径的需要,编写多个测试案例。

    2.3 已配置 TestCase 的展示

    文档站点中最大的分类为应用分类,比如order和item就是两个不同的应用。那么我们配置好的TestCase也会以应用维度分类,先选择好应用之后,就会展示当前应用下面所有的服务,服务维度下面所有方法,方法下面的所有的TestCases,展示是一层一层的,且提供搜索功能,可以直接根据testcase的名称进行搜索。

    展示方式.png 服务维度.png

    2.4 一键测试

    TestCases 展示页面,可以根据不同的维度选择一键测试。一键测试会对已选择的所有TestCases串行的执行测试,测试完成后展示成功失败统计,并记录TestCases最近一次的测试结果(成功or失败)。

    • 选定应用下的所有服务所有方法的TestCases
    • 选定服务维度下的所有方法TestCases
    • 选定方法下的所有不同路径的TestCases
    • 对上一次测试所有失败的项目重新进行测试

    2.5 测试报告

    显示最近一次一键测试的测试报告,展示成功失败 count,失败的 case 的原因等信息。


    3.模型设计

    3.1 TestCase 生成逻辑

    用户在使用文档站点时,一般会使用到页面测试功能,通过传入想要的参数,然后输出结果。在这个过程中,让系统记录用户最近一次的点击,将请求参数,响应结果记录下来,预期模板将会和返回结果一致。
    需要说明的是,自动生成的测试case,只会测试一些比较宽泛和粗略的结果。用户还需根据此生成的模板修改,并着重修改预期模板来最大化的达到测试目的。

    3.2 数据定义与存储

    用户构造的 TestCases, 最终都会存储到数据库中,每一个 TestCase 都有一个唯一的标示,并且属性包含其测试的服务名、方法、所属应用等。

    3.3 预期结果解析

    每个TestCase 会有不同的测试目的,比如有的只需要返回结果成功,有的需要返回结果中某个字段的值为预期值,有的需要返回结果列表size需要为预期设定的size等等。

    预期模板

    预期模板也以 json 的形式编写,但是只需要突出我们想要匹配的重点字段即可(如果没有必要,和返回结果一模一样也可以)。
    核心匹配逻辑将使用 JSONassert 来进行。

    例: 某一个接口返回结果如下

    {
      "status": 1,
      "success": {
        "order": {
          "order_id": 1023,
          "order_name": "maple",
          "item": {
            "item_id": "item_1023",
            "item_name": "item_name"
          }
        }
      }
    }
    

    预期匹配模板1

    {
      "status": 1
    }
    

    匹配结果: 此模板代表返回结果只要 status 为 1 就能匹配上,本次测试成功。

    预期匹配模板2

    {
      "status": 1,
      "success": {
        "order": {
          "order_id": 1023
        }
      }
    }
    

    匹配结果: 当返回结果 status 为 1,并且返回的 order_id 为 1023 才会匹配成功。

    预期匹配模板3

    {
      "success": {
        "order": {
          "order_id": "@range@1023..1025",
          "item": {
            "item_name": "@r@item_*"
          }
        }
      }
    }
    

    匹配结果: 上面的预期模板用到了数字范围和正则两种,当返回结果 order_id 为 1023-1025,并且 item_name 以 item_ 前缀开头即匹配成功。

    预期模板配置总结

    • 可根据json层级的模式来配置预期模板,只要返回结果的json中数据符合预期层级结构中的数据,即认为单元测试成功
    • 可配置数据之间,多个条件 为 与和或 的关系。
    • 模板value 支持 数字范围,取模,正则表达式,非、ip 等等表达式

    相关文章

      网友评论

          本文标题:Dapeng文档站点的单元测试之路

          本文链接:https://www.haomeiwen.com/subject/umnwactx.html