什么是接口测试接口:主要是子模块或者子系统间交互作用的部分。这里说的接口是广义的:客户端与后台服务间的协议;插件间通信的接口;模块间的接口;再小到一个类提供的方法;以上都可以理解为接口。接口测试:针对模块或者系统间接口进行的测试。接口测试发现的典型问题/Bug/缺陷:传入参数处理不当,导致程序crash;类型溢出,导致数据读出、写入不一致;因对象权限未进行校验,可以访问其他用户敏感信息;状态处理不当,导致逻辑出现错乱;逻辑校验不完善,可利用漏洞获取非正当利益等等
接口测试用例设计上为一个典型的接口。一个接口通常是有输入输出的:输入就是我们常见的入参;输出有时有,有时就没有。调用相关接口,接口会执行相关处理逻辑。接口测试的用例设计,主要从“输入”、”接口处理逻辑“、“输出”三个方面考虑:针对“输入”,可按照参数类型进行设计;针对“接口处理逻辑”,可按照逻辑功能进行用例设计;针对“输出”,可根据结果进行分析设计。
针对【输入】设计用例对于接口来说,输入就是”入参“。常见参数类型有:数值型【int、long、float、double等】;字符串类型;数组或链表;结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合;是一些元素的结合,元素实际也是数值型,字符串型,数组或链表等等。数值型如果参数规定了值的范围,则需要考虑等价类取值范围内、取值范围外,取值的边界,如有需要,可能会遍历取值范围内的各个值。例如检查权限的接口:【TaskChecker.checkTask(inttaskI】,taskID的取值范围是1-3那么设计时考虑:1-35范围内、范围外的值;1-35的边界:0,336;类型的特殊值:-0;数据类型的边界值:int的最小值最大值;因为1-35代码的权限ID不同,可能需要遍历1-35的每个值。常见问题和风险:特殊值处理不当导致程序异常退出;类型边界溢出;取值范围外值未返回正确的错误信息等。2字符串型字符串型的参数,主要考虑字符串的长度和内容:例如接口转换设置闹钟的接口:【DateUtigetDayOfDDHH(Stringddh】,用例可以考虑:长度为4位,比4位少,比4位多;边界值:String的最大长度;特殊值:空字符;字符串内容可考虑类型:数字,非数字;特殊字符;如果是输入用户输入且其他用户可见的内容,则还需要考虑敏感字是否被正常过滤。可能出现的问题和风险:传入非特定类型程序异常退出超长字符未进行处理,导致存储、显示等异常其他用户可见设置的敏感字3数组或链表类型参数类型为数组或链表时,用例可以考虑:例如批量提交任务的接口【submitTask(int[]taskI】,参数用例设计考虑:正常取值:1-5个权限,范围外:6个权限;边界值:1-35的边界值,请求允许最大最小值;特殊值:0个;合法ID和不合法的;重复的ID等。可能存在的问题和风险:0个item时程序异常退出;重复的item处理时未去重导致结果异常等。
针对输出设计针对输出设计其实是针对接口返回的结果进行分析。1针对输出结果接口处理正确的结果可能只有一个,但是错误异常返回结果有很多情况很多值。如果知道返回结果有很多种,就可以针对不同结果设计用例。例如提交积分任务的时候我们通常能想到的是返回正确和错误,错误可能想到:无效任务,无效登录态,但是不一定能否完全覆盖所有错误码,而接口返回定义的返回码可以设计更多用例:覆盖返回码也是用例设计的一种思路。常见问题和风险:错误前端处理不足,导致前端异常;错误提示处理不当,导致用户看到晦涩的错误码;错误提示不当,导致用户不知道哪里出了问题,如何解决。2接口超时接口正常情况下是有返回的,那么如果接口不返回呢?也就是说接口超时后的处理也是测试需要考虑的部分。如果超时处理不当,可能会引起以下问题:未进行超时处理,导致整个流程阻塞;超时后又收到接口返回,导致逻辑出现错乱。
其他测试用例设计1已废弃接口测试已废弃协议,是指之前有定义,但是因为需求变更或其他原因,目前版本不用。【这些接口虽然不再使用,但有可能代码并没有及时删除。如果利用技术手段调用这些接口,可能获取额外利益】例如:任务之前有个清理任务,在一个版本需求里将清理任务替换为下载任务。在新版本客户端已不再调用完成清理任务的接口;但是如果该接口未关闭,用户就可以继续请求【submitTask(inttaskI】接口完成清理任务获得积分。因此新版本在考虑兼容旧版本的还应做好相关废弃接口的检查,避免用户获得额外利益。2接口设计合理性分析接口定义是否合理可以从以下几个方面分析:接口字段是否冗余;接口是否冗余;接口是否返回了调用方期望得到的信息;接口定义是否可满足所有调用需求;接口定义调用是否方便。
一个完整的例子下面举一个完整例子,通过上述方法来分析如何对接口进行用例设计。某模块提供了一个接口给其他模块,用户请求任务,接口定义如下:1针对输入设计dialogDetailText/dialogButtonText【String类型】长度正常:请安装提示进行操作;边界:一个字:请;长度非常长:无悬浮窗权限,可能影响XX功能无法使用,请开始悬浮窗权限,以便获得更好的用户体验;甚至更长;特殊:空字符串。内容特定类型:中文,英文,数字等;特殊字符:/n/r/t,.>*$&^%~'ஜღ℡♬€✎等;敏感字符:非用户设置,不涉及。taskID/requestType【int类型】等价类取值范围内:1,5,10等;取值范围外:0,9边界法取值范围边界:0,1,38,39,40数据类型边界:-2147483648,2147483648特殊值:0,-1等;遍历法:1,2,3,4,5…38,39对应每种不同ID。2针对逻辑设计约束条件分析去引导某功能需要:未完成过任务,任务有任务数据。那么用例可以是:以下情况下调requestTask:未使用过有任务数据时;未使用无任务数据时;使用过有任务数据时;使用过无任务数据时。如果有其他约束条件类似设计。操作对象分析调用请求接口后,会先根据任务数据,引导对应的任务。任务数据,任务操作方式,任务功能都可以是对象。任务数据数据类型:本地,云端等数据有效性:正确数据,错误数据操作方式方式:安装,下载,打开等等。任务功能功能:用户操作了该功能,未正常操作该功能;什么都不操作;完成一个任务功能;完成多个任务功能;任务功能使用顺序等等。对象:还需要关注,会不会操作到不合法的对象,例如任务数据和功能不对应等问题。状态转换分析功能是有3个状态的:完成,未完成,未知。状态如下:这里是产品里涉及的状态转换:针对该状态:正常状态转换:未完成状态请求并完成任务后是否可变成完成状态;未完成状态请求但不完成,还是未完成状态。走不到的状态路径:未知和完成状态请求任务,不能进行进行该任务。时序分析从时序的角度分析,调用请求接口前需要以下2步动作:拉取任务数据;判断任务状态。从时序得到的用例有:正常时序:按照正常时序请求123;缺失的时序缺少动作1调23;缺少动作2调13;缺少动作1和2直接调。打乱的时序打乱的时序:21还可以有13233132针对处理逻辑的设计中,可能使用某一种或某几种方式就可以将用例覆盖前,故实际使用中,可能不会全部使用,只要找到最合适的方式覆盖用例即可。3针对输出分析请求任务接口返回的数据是任务完成结果,即返回完成,未完成两种状态。从结果可以考虑遍历:未完成完成完成-未知从接口处理时间分析,考虑:请求后快速返回,很长时间才返回,甚至不返回结果的情况。
小结接口用例设计方法中,针对输入、输出的设计是通用的,接口设计时都可用到。对于接口逻辑的设计可能会应用比较适合的一种或几种方法,在接口用例设计时,需要选取最合适的方法去覆盖被测逻辑。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点