接口用例设计

背景说明

一个系统可为其他系统提供能力或者直接为UI层提供数据,在设计系统测试方案时应考虑上游调用的各种场景,不仅考虑顺利且正向思维操作的场景,还应逆向的场景。例如:人为操作造成的不合理数据、服务错误的调用、请求时由于网络等环境原因造成的异常。但在此之前,也应考虑系统本身稳定性和规范性,应从本身定义约束。定义自身规范,不仅可从一方面保证系统稳定,同时有了自身的介入规范更适用于多业务接入,而不是单独承接某一上游。系统稳定和规范会规避后续更多的BUG。换句话来说,使用契约式设计的方式,运行前条件必须满足,参数不正确不可运行;运行中内部状态必须不变;运行后结果必须保持一致。

在设计接口用例设计时,除实现功能外,应关注:幂等性、空校验、流程节点限制、异常校验。

01 幂等性

何为幂等性?

幂等为一数学概念,指使用相同参数重复执行,能获取相同结果。换句话说,幂等性就是调用一次成功后,再次调用后仍返回原来结果,即使调用100次后结果都相同。

如何使接口幂等性?

首先引入一个概念—唯一索引,一句话介绍:数据表中每个唯一索引对应的数据记录只会有一条。当第一次调用生成唯一一条记录时,再次调用时,接口内部应前置根据唯一索引进行查询,如果发现存在记录直接返回查询结果,不进行后续操作。例如:调用创建支付单接口会创建一条支付单数据落入支付单数据表,我们定义调用方字段A和调用流水标识字段B为唯一索引,当然接口参数中包含这两个字段。当再次调用接口时,会首先使用A参数和B参数进行查询,当对应记录已存在时,直接返回查询结果。

为什么要做幂等性校验?

试想没有幂等性校验会怎样,还以创建支付单为例,当上游一个单子L准备创建支付单,第一次调用创建成功支付单P1,当触发再次调用时:

如果数据表已建立唯一索引,则会插入数据失败,接口抛出异常,上游可能更是一脸懵逼。不仅仅是造成一条废弃数据,上游可能只是想借助支付中心能力让用户完成支付,当已经创建对应支付单时只需返回结果让用户继续完成支付操作即可。

如果数据表没有唯一索引, 上游多次调用,单子L就会对应多个支付单,没有了唯一关联,试想如果单子L想查询对应的支付单,结果返回多个当然不合理,又如,多个支付单是不是用户就可以多次支付了?当单子L首次支付成功后应该对应哪个支付单置为支付成功呢?对后续针对支付单打款退款等操作影响更是将之大,造成资金混乱和不安全。从另一层面来说,当无数次调用,就要生成无数条数据,造成无数不必要数据或者说无效数据,增加系统压力。

如何进行接口幂等性测试?

  • 首先,确认及检验一条数据的唯一标识组合:数据表根据创建唯一索引,接口参数中包含组合中的每个元素。
  • 首次调用接口后,观察返回结果,并根据唯一索引确定数据表中的数据已存在。
  • 参数无任何改变时,再次调用,结果返回为首次调用的返回结果,且数据表不会生成新的记录。
  • 改变除唯一索引外其他参数(此参数对应数据表一个字段),再次调用,返回结果仍为首次调用结果,改变的参数值仍为首次调用的值。数据表不会插入新的记录且记录不会更改,重点关注调用参数中改变参数对应的字段仍为首次调用后的值,不会更新。
  • 改变唯一标识中一个元素对应的参数,再次调用,返回结果会生成新的一条记录,且数据表生成一条新的记录。

02 非空校验 && 兼容为空

非空校验即对参数进行非空校验,当参数为空时,接口会前置校验提示错误,不继续向下执行。

为何要做接口非空校验?

增加系统稳定性,接口健壮性。假如接口未做非空校验,向下执行在数据表创建一条数据,再对数据进行操作时由于参数为空无法完成。例如调用打款接口,参数打款金额不可为空。假如去掉前置非空校验,首先会生成一条初始化状态的打款单据,然后打款接口内部中有一套复杂的后续执行逻辑,转入个人余额、记账、提现等,当真实和三方打款交互时,由于金额为空而报错。可见,生成了一系列处于中间节点的脏数据,而且进行了许多无用的调用或执行。

如何判断哪些需要进行非空校验?

可根据系统本身功能、其他接口依赖情况、依赖下游接口参数判断。具体来说,例如一个简单的积分充值接口,积分币数量不可空。从系统本身来说,无充值数量此充值单据即无意义。而充值数量会作为积分消费、失效等接口调用的起始数据源依赖。同时,积分充值本质为给用户充值钱款,积分数量会转化 为金额且向下请求支付中心进行资金流转,而资金流转功能限制金额不可为空。

除此之外,需注意对功能的严格定义,有些参数不可非空校验且需兼容为空。直接举例,查询支付方式接口,金额字段不是必传字段,当接口内部对金额处理就需兼容为空情况,当金额参数传空时,调用此不可报错。

如何进行具体测试?

  • 明确哪些参数为必传,哪些为非必传。
  • 依次对 必传参数设置为空进行请求,此时接口不可调用成功,无数据生成,同时关注接口返回信息明确性,如果接口返回提示文案为“XX不可为空”一目了然,极大方便定位问题,提高效率。
  • 对非空参数依次传空,观察接口调用情况。

当然,首先需明白业务逻辑,从而进行用例设计。尤其对于参数复杂的接口,当某一条调用规则下 某些非空参数就需要作为必传了。

03 流程节点限制

流程节点限制,即需严格遵守流程流转。当调用某就流程时,必须由上一节点调用。

为何需做流程节点限制?

支付单系统的流程为流程1:创建、支付完成、支付后的使用,流程2:创建、取消。如果目前支付单据为创建状态,对其调用支付后的使用接口,会导致巨大功能问题。如果对支付完成的支付单据进行取消操作,逻辑也不合理,产生问题。故系统需在接口内部前置作流程节点限制。

如何做流程节点限制测试?

明确系统的状态流转,一个系统设计初期就需明确功能及状态流转,会依据产品对系统的定义及依赖的下游或三方产品的功能。

测试正常流程节点。按照正向流程依次调用,观察调用结果及生成状态。调用创建接口,调用成功且生成单据状态为创建, 再使用此单据进行完成接口的调用,观察调用结果及生成状态。然后再进行下一接口调用。

测试不合理流程节点下的调用,包含单一流程和交叉流程,观察接口返回及数据状态。例如单据状态为创建时调用使用接口,单据状态为完成时调用取消接口。首先需观察数据表中单据并未作任何更新,再观察接口并不会出现调用级别的错误,最后观察接口返回信息,提示"XX状态不可进行XX调用"。

04 异常校验

为何做异常校验?

确保主功能可使用,不让非主功能异常影响主功能。且会出现接口内部未校验异常,后续功能不可实现的情况。异常可大致分为三种:

  • 环境异常,即非强依赖的服务异常时,应过滤掉此服务继续向下执行。例如收银台查询支付方式接口内部实现为,先查询出支付方式为列表1,然后会将列表1请求风控接口再次过滤得到支付方式列表2。生产环境中如果出现请求风控超时或者服务异常等情况,而查询支付方式并未兼容此异常情况,会直接系统报错导致用户无法支付。而如果查询支付方式接口兼容了请求风控服务异常,会直接返回支付列表1,让用户继续支付。
  • 数据异常,当数据值异常时,无法实现功能或者向下执行。例如必须为整数情况不可传入小数,又如积分充值接口需对积分充值数量限制为汇率的整数倍,如果不进行此校验,当执行到钱款流转时,会出现比1分还小的值,导致无法进行。又如,当用户可用支付方式匹配为0条时,应展示出默认的一通道,让用户可支付。
  • 前置条件异常:举例来说,通过支付单打款,需对支付可用金额校验,当打款金额大于支付单可用金额应直接前置提示,不可向下执行。

如何测试异常场景?

  • 首先深入了解业务特点和系统流转,判断哪些异常场景需要进行测试。
  • 通过关闭下游服务构造环境异常和手动构造其他异常场景进行测试。

本文分享自微信公众号 - 测试开发社区(TestDevHome),作者:胡茜茜

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 有赞精准测试实践

    有赞早期业务跑在一个单体php工程上,随着业务发展,性能拓展性已经满足不了需求,为了后续发展,底层开始微服务化,整体转向dubbo框架。从单体转向分布式框架,测...

    测试开发社区
  • 移动端自动化测试-远程设备调度

    “云测” 是近几年业内的热词, 不仅仅商用的云测平台越来越多,各大厂也早早的着手构建适合自己的云测平台上 ,经常可以听到相关的分享,十分精彩,受益匪浅...

    测试开发社区
  • appium使用相对坐标定位元素

    最近在用appium做自动化时发现,有一些元素无法通过uiautomatorviewer进行定位,这样就只能通过相对坐标来进行定位了。但是,问题又来了:如何获取...

    测试开发社区
  • Maven(一)初识Maven

    前言 在这之前一直都有去看关于Maven的相关介绍,但是没有到真正要用的时候,自己总是以为懂了。其实真的感觉Maven并没有想象的那么简单! 那我们该怎么去学习...

    用户1195962
  • 秀恩爱分得快? Oracle和NetSuite依然爱得深沉

    人称T客
  • 简单的网址导航长盛不衰,有什么启示?

    网址导航,这个与浏览器天生一对的产品,历史几乎与互联网相当。在移动互联网时代,浏览器被Native App挤压,只得寄望于HTML5夺回失地,网址导航更是悄无...

    罗超频道
  • KDD 2019放榜,华人博士生喜提“最佳论文”,中国军团表现亮眼

    ACM SIGKDD(国际数据挖掘与知识发现大会,简称 KDD),是全球数据挖掘领域的最高级别的学术会议,今年是第25届,在美国阿拉斯加州安克雷奇市举行。

    大数据文摘
  • R语言:小数点位数的设置

    经常用数据分析,有时不同的文件的小数位数不一样,但是我们可以让它们的位数保持一致的,下面的介绍就是设置小数位数。

    努力在北京混出人样
  • TASM:基于瓦片的视频分析存储管理器(CS DB)

    产生的视频数据量正在迅速增加。同时,机器学习和计算机视觉方面的进步使应用程序能够对视频内容进行查询。例如,鸟类学应用可以从自然视频中检索出各种鸟类。然而,现代视...

    刘持诚
  • CentOS 如何查当前安装的服务器版本

    HoneyMoose

扫码关注云+社区

领取腾讯云代金券