前言

随着越来越多的项目都采用前后端分离的设计模式,接口测试愈发在测试工作中占据重要地位。与 UI 测试所见即所得的测试对象不同,接口测试需要做更多的准备工作,其中最关键的就是第一步:通过请求鉴权,无法通过鉴权,自然也不用提后续的业务逻辑测试。
鉴权方式有很多种,比较常见的鉴权可以分为四大类: HTTP Basic Authorization、Session&Cookie、Token 以及 OAuth,本文主要将针对这四种鉴权方式来举例说明如何在流马测试平台上低代码实现接口鉴权。

鉴权痛点

自动化测试通常都是写起来简单,维护起来麻烦,这在接口鉴权功能上也是如此。在过往使用测试框架做接口测试时,通过鉴权的方式有多种:简单一点的可能是每条用例都先进行登录操作,获取鉴权后再进行后续业务脚本编写;方便一点的办法是在用例的前置处理函数中进行登录操作,并保存鉴权信息;亦或者全局编写登录函数,并在用例中调用。
无论哪种方法,其实都在做重复登录的工作,当然也可以执行前统一登录,但这种办法在面对复杂工作流测试场景需要频繁切换用户时并不友好。那么做测试平台的话如何尽可能地优化这类情况呢?

鉴权方案

HTTP Basic Authorization

HTTP Basic Authorization 授权方式是浏览器遵守 HTTP 协议实现的基本授权方式,主要是将用户密码通过 base64 加密后放在请求头的 Authorization 字段中,从而获取请求权限。这类鉴权方式相对比较简单,在流马测试平台上可以通过直接在接口请求头中配置而成,如下图所示:

当然,这必然不符合自动化测试的易维护性。如果想动态使用账号密码,也有办法,可以将用户名密码维护在公共参数中,并在此处动态调用 base64 内置函数动态生成,以用户名 demo/密码 123456 为例,可以写成:Basic {{@b64encode_str({{$usr}}, {{$psd}})}} ,其中 usr 和 psd 正是公共参数处维护的账号密码。
那么还有没有更偷懒的办法呢,答案是肯定的。流马支持请求头作为公参统一维护:在公共参数中,系统参数组 Header 下新增一个请求头,维护 Authorization 信息,如下图所示。随后在编写用例时配置信息中直接导入后,该用例下的所有接口都会使用该请求头。

Session&Cookie

Session&Cookie 的鉴权方式大多用于 web 项目,通常浏览器在登录页面登录后,会与服务端建立连接,并保存登录 Session。遇到这种鉴权方式流马平台怎么做呢,很简单,首先我们先写一个登录用例,调用登录接口,并在逻辑控件中设置保存 Session,如下图所示:

随后在需要登录鉴权的接口中,逻辑控件处设置使用 Session(位置同上图)。而后当两个用例在同一个测试集合执行时,只要将登录用例放在首位,后续所有用例即可获取登录 Session。
当然有小伙伴会有疑问,这种方式写单个用例调试岂不是很麻烦。这点无须担心,可以在写用例时临时获取 Cookie,并放在公共请求头中,当所有用例写完并调通后,清空请求头即可。

Token

Token 鉴权目前非常多见,基本流程就是客户端通过用户名密码去请求登录,验证成功后服务端返回一个 Token 给客户端,客户端保存后在后续请求中带着 Token 即可完成鉴权,流马平台也是使用这种鉴权方式,我们以 JWT 为例来说明。
与 Session 用法差不多,首先写一条登录用例,并在关联参数中提取 Token 返回值保存下来,如下图所示。

随后在需要鉴权接口请求中,在 Token 参数的位置上,使用{{demoToken}}即可动态获取到登录接口保存的 Token 值。
值得一提的是,在自动化用例设计中,对于那种需要反复切换登录账户的测试场景,我们可以先在一个用例中把所有的账户登录好,并保存相应的 Token。而在实际业务场景实现时,需要哪个账户就使用哪个 token 即可,避免来回切换用户。

OAuth

OAuth 开放授权一般多用于第三方登录验证,这类鉴权可以简单理解为第三方签发了一个身份信息给客户端,如 code 和 secret。客户端每次调用第三方的接口时,需要根据 code、secret 以及请求内容进行排序、加密最终生成一个签名,服务端收到数据后会对签名进行校验,成功后则通过鉴权。一般来说,请求参数中都需要一些时间戳或者随机数等动态值,因此每次请求签名必然是不同的,那么这种场景如何实现呢?
在过去用 jmeter 做此类接口测试时,我们会考虑使用 beanshell 前置脚本来编写代码从而实现签名生成。流马平台也支持前置脚本,但低代码平台写过多代码毕竟违背设计初衷,因此流马提供自定义公共函数的功能来实现这类场景。举例说明:
要求:接口/openapi/sign 需要对请求地址和请求参数进行 sha256 加密,并将加密结果放在请求参数的 sign 字段。
解决:首先在函数管理新增一个函数"sha256",函数入参有三个,path,body,secret,如下图所示:

函数新增后,在编写用例时,我们 sign 字段可以调用函数对其进行赋值。调用方式为:{{@sha256(path, body, secret)}}。如下图所示:

但实际上,往往 path、body 也并非常量,因此不能直接填写,需要动态获取最终值。为了解决这类问题,平台支持函数入参动态获取同一接口的其他入参值。参数格式为 #{jsonpath}, jsonpath 提取对象为请求体,支持 json/form-data 等类型的请求体提取。而如果想获取请求地址、请求头、或全部请求体,则可以应用 #{_request_path},#{_request_body},#{_request_query},#{_request_header}。在最终执行时,会根据 jsonpath 的依赖关系决定请求参数的先后处理顺序。
如此一来,只要我们将加密方式抽象成一个函数,即可解决所有接口的鉴权问题,接口用例中也不需要再写代码,一举两得。

总结

关于上述四种鉴权方式,流马基本都可以通过低代码来实现,有兴趣的小伙伴可以去 demo 环境体验一下。当然也许还有一些特殊的场景目前无法支持,希望大家能够留言助作者继续完善,感谢大家。
Demo 环境链接
GITHUB 链接

拉票

流马目前参与到 MTSC 2022 年度最佳项目评选,作为新项目自然没法和众多前辈相提并论,但咱还是弱弱地来拉个票,流马的优势在于架构简单,易于拓展,更适合快速实现自动化测试,希望有兴趣的小伙伴可以了解一下流马测试平台,并能给流马投上一票,感谢。
投票链接

交流

开源不易,希望小伙伴们能在 GITHUB 上点个 Star。同时欢迎有兴趣的小伙伴进群交流一起沟通测试或测开相关的知识与经验,微信搜索 liumatester 加我微信拉您进群。


↙↙↙阅读原文可查看相关链接,并与作者交流