背景:

随着人工智能、大数据和云计算的飞速发展,海量的非结构化数据需要长期存储和处理。中通简单文件存储承载了中通大多数非结构化数据的存储(日均上传 4000W+,QPS 峰值 2000+)。

中通存储方面的测试主要分为文件存储和对象存储,在测试方面还是围绕 http 接口和 S3 接口的测试。

存储的 S3(Simple Storage Service)测试,需要进行 java api 的调用,所以在测试该方法时,需要自行编写 java 代码进行实现。S3 协议的调用方式会封装在 titans 框架中,供业务方进行调用。

amazon (S3)*:一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。S3 提供一个 RESTful API 以编程方式实现与该服务的交互。

titans*:是中通自研的 java 开发框架,主要提供开箱即用的工程,精简的属性配置,解决依赖的冲突,组合完善的技术组件(熔断,消息队列,链路跟踪,缓存,文件服务等),统一的日志,配置,调度,监控管理等功能,可供业务方调用。

测试的内容

1.跨 app,跨 bucket 的访问测试,需要进行 app 和 bucket 的业务隔离,不同 app 直接不能互相访问和调用。

2.文件存储,对象存储 2 套 api 访问互相切换。例如在文件存储上传的文件,可以在对象存储端下载。业务方在调用时保持调用接口的不变,只是后端路由进行切换从而访问不同的存储方式。

3.限流的测试,在紧急情况下进行流量的控制。

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务,通过此方法进行限流。

4.应用白名单及全局白名单。为访问安全控制考虑,只有在白名单中的 ip 才可以调用接口,按照 app 进行隔离,也有全局白名单。

5.文件的上传,下载,删除,复制,分享,裁剪,断点续传,从视频中截图等功能。

6.性能测试,主要是文件上传,下载的性能测试。

7.共有,私有,加密,带水印文件测试等等。

8.已有旧数据的测试,兼容已有的数据。

测试中遇到的问题

1.初期测试的方法都是使用 postman 或者 jmeter 进行接口测试。但存储的接口测试与普通接口的测试最大的不同是部分接口返回的不是 json 格式的数据,而是二进制流。在进行校验和判断时不易。

2.接口都需要有签名,根据请求参数的不同而生成的签名都不同,所以在使用 jmeter 和 postman 时实现该需求相对较繁琐。

3.接口自动化平台对文件下载,md5 校验的支持不完善,即使提供支持后也使用相对繁琐。

4.接口需要集成进 titans 框架,提供 java 方式的调用,测试从调用 http 接口转变成 java api 的调用。使用 postman,jmeter 调用 Java 代码实现相对比较麻烦。

5.需要返回自定义 json 的响应结果,方便以后开发人员进行结果的解析然后快速的代码回滚,还可以对接前端进行结果的自定义页面展示。

6.无法服务化,期望后期可供开发自行调用进行测试。

存储项目测试的改进

结合测试中遇到的问题,决定采用 springBoot+springMVC 的架构,在 controller 层中实例化所有的接口调用,自行判断测试结果,将每个接口的结果放入自定义响应结构体中,然后通过 springMVC 返回 json 的 ResponseBody。所有的测试结果可以在浏览器中查看到,后期也可以对接前端进行测试结果的界面展示。

可以将项目在服务器端部署,稳定且可供测试及开发人员进行调用。

项目入口封装成一个 controller 层接口的调用,需要测试时只需要在浏览器中调用该接口,该方法会去实例化所有的接口调用,将响应的结果添加到自定义的结构体中,然后通过 json 格式返回给前端页面。测试人员只需要关注响应的 StatusCode 和 assertMsg。以后可以编写前端的页面,解析 json 的响应体,在界面上做展示。形成行列表格等形式方便查看。以及在页面上即时触发,定时任务自定义 crontab 等功能,提供方便的扩展。

目前结构体包含用例的描述,状态码,接口返回的信息,自定义的验证信息。后期可以进行扩展。

可以在不同的环境直接切换,也可采用配置文件的格式等。

文件存储的配置:

对象存储的配置:

每个接口都写成单独的类,在类中会实现类似 setup, tearDown 等功能去清除重置测试数据,在调用接口前生成接口的签名,签名根据请求参数和一定的算法生成,签名和请求参数一起设置在 request body 中。接口的返回如果是 json 格式直接进行判断。如果是二进制流会将流存储到本地,并生成 md5,代码中通过 md5 的校验进行判断,测试人员也可以通过人工的方式进行图片的校验对比。若是加水印的图片,则只能通过人工进行检查。

自行编写判断,若不符合某些校验的条件自行设置 statusCode 和 assertMsg,并将结果放入 FileStorageResponse 结构体,put 进 HashMap 返回所有的接口结果。

S3(Simple Storage Service)的对象存储主要依赖 amazon 的 S3 协议,对象存储进行封装提供服务的调用,主要提供文件的上传,下载,获取对象列表,断点上传等功能,调用方式通过 java api 的方式调用。也可生成预签名的 http 链接进行访问调用。

在进行 S3 接口的测试中,断点续传的接口在使用单元测试框架时可以顺利的通过,但是使用实例化类的方式调用就会报错,该问题是代码的 bug。所以发现在使用单元测试框架时无法发现该 bug,从而未使用类似 testNG,Junit 等单元测试框架从而避免某些 bug 的遗漏。

另一个未使用单元测试框架的原因是,预期是返回自定义的 json 体,单元测试框架没有在 buildin 功能中具有自定义 json 体的实现。

所以接口的批量调用,验证,结果返回都自行实现,未使用单元测试框架。

在日常和线上的冒烟测试中,只需要调用接口可以批量的运行所有的脚本,在接口中返回,在 ide 控制台打印日志等信息。浏览器输出目前为 json 体,后期可以对接前端界面解析 json,做界面展示。

Ide 控制台输出

测试的运行可以在 ide 中直接运行,为了方便以后所有测试人员和开发人员的调用,可以将该 springBoot 项目部署在 linux 服务器上

为了使测试代码更好的维护和交接延续,申请 git 库,在测试人员调整时所有的测试代码可以更好的交接。

结语

存储的测试从原先 postman,jmeter 的实现向 java 实现的转变,带来了很多测试上的便利,并可以很好的解决签名问题,titans 对接的 java api 调用,日志,功能可拓展,服务化方便测试和生成环境调用,代码集中管理等优点,更是对测试在技术上进行了尝试,在日常工具和公司提供的统一平台之外形成自己的测试方法,可以更好的了解开发的技术,在方便日常测试的同时,提高测试在技术上的认识。后期可以对接页面展示,或则形成自己的造数据平台,监控平台等等。

更多详情可加微信 :


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