项目背景
作为长期专注于区块链底层平台设计和研发的专业团队,趣链科技对产品质量尤其重视。软件测试可以说是平台的质量保证的最关键一环。
底层的技术平台通常会提供对外交互的SDK,在测试环节中,可以通过SDK对系统进行集成测试,从而验证系统的各项功能是否能够正常使用。
Java SDK是软件开发中应用最广泛的一类,以在BitXMesh项目测试的实践为背景,介绍Java SDK集成测试的一些心得体会。
系统提供的功能主要有如下几点:
- 资源库中资源管理,包括文件/数据库/模型/Restful接口等
- 联邦计算
- 跨节点资源获取和展示
- 系统和用户管理
起初测试工具较为零散,新增模块或者功能之后往往趋向新建一个小的测试项目进行测试。但是随着功能和客户越来越多,质量保证的要求不能放松,构建一个完善的测试项目成为必然要求。
本文以该项目为例,详细介绍测试项目的分析、规划、实现、具体模块示例以及最终形成的测试报告。
测试项目分析
在测试项目中,最核心的一个环节就是测试用例设计,要想设计出优雅的测试用例,首先要对项目本身有充分的了解,根据对项目的功能和代码结构分析,将测试项目用例结构分为以下三类:
- 用户权限相关测试:验证不同类型的用户对模块操作的权限正常
- 异常数据测试:包括数据异常和功能逻辑异常
- 正常功能测试
单独的用例实现起来难度不大。
但要充分考虑到后续维护,特别是权限测试和异常测试两方面。
因此在设计测试用例的时候要秉承以下两点原则:
- 优化代码结构,减少代码冗余,增加可读性;
- 测试用例数据和测试代码分离,方便后面单独维护测试用例。
测试项目规划
测试框架
TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便,它在很大程度上借鉴了Java注解来定义测试。
本项目使用TestNG进行测试。Excel维护用例数据,封装函数读取其中数据,使用dataProvider传递给测试函数进行测试。
数据驱动测试,函数传参形式
由于系统功能耦合性较强,因此单个用例往往包含较多操作。我们把类似流程的测试用例组合到一起,对各个操作进行位置编号,使用Pair<Integer, Integer>的形式传参,对预期出现异常的位置进行断言。
测试过程中异常捕获和处理
权限相关的测试,每个操作都可能有权限或者没有权限,因此每个操作完成后直接与预期进行对比进行即可,捕获到异常就断言错误码。
流程相关的测试,如果前一个操作对后面操作有影响,检测到该操作抛出异常后直接对错误码进行断言,然后退出当前测试,继续后面测试;反之继续进行后面操作。
自动触发Jenkins项目构建
使用触发器执行自动构建,具体配置参考第六板块【持续集成】
项目结构
用例组织方式
测试用例在内部的Thoughts环境以表格的形式编写,用例来源于需求文档和系统测试分析文档。
测试项目结构
在这个项目中使用项目管理工具Maven来管理构建和报告。
项目结构如下:
版本控制
版本号与待测项目版本号保持一致,在Git中进行维护。
部分实现示例
BitXMesh中有多种不同类型的用户,这些用户对不同模块和资源的操作权限不一样,因此需要逐一进行权限测试,看是否有遗漏或者越权问题。
另外,BitXMesh需求中对部分输入信息有限制,如长度/是否为空/重复/特殊格式等,需要对边界值和其他相关逻辑进行测试。
权限测试(有统一的报错代码)
模块中权限主要包括创建/删除/查看/修改/上传/下载/赋权操作等。
因为创建是后面操作的基础,因此单独指定用例对创建功能进行权限测试;其他操作共用一个用例,每轮对不同用户执行用例时,让指定用户先创建,再执行后面操作。
一个用户在一个模块中的所有权限作为一组测试数据;有权限时操作正常完成,没有权限时抛出异常,状态码为指定值;获取错误信息之后对捕获到的每个异常状态码进行断言对比即可,当前测试继续进行。
异常数据测试(有专门的报错代码)
这里对模块功能做全流程测试。当测试程序捕获到有操作抛出异常的时候就直接返回,不执行后续测试。
为了方便进行数据驱动测试,我们把用例中每个操作顺序进行标注,从1开始递增;如果期望在第n个操作处捕获到异常,则可以传入(n, errCode)进行断言验证
持续集成
Jenkins配置
编写部署脚本,使用shell命令运行集成测试
触发流程
- Git webhook检测到打tag或者主干分支有合并之后,触发上游Jenkins打包任务,生成可执行文件,并推送到Nexus仓库
- 生成可执行文件任务成功后,触发集成测试任务,远程拉取可执行文件,执行部署和测试
程序运行环境
Jenkins slave节点提供的Docker容器。因为单个BitXMesh占用资源不多,因此可以在一个Docker容器中同时运行测试程序和多个BitXMesh节点程序。
测试报告
本项目使用了maven插件maven-surefire-plugin来生成测试报告。项目测试完成之后,自动生成target/surefire-reports/emailable-report.html报告,在Jenkins中指定相应测试报告路径即可。
pom.xml中配置如下:
总结
权限测试和异常测试是测试过程中两个需要注意的点,需要在自动化测试中提前规划。
前者容易导致代码比较臃肿;后者难以一次性考虑全面,需要后续进行维护。通过合理的数据驱动测试可以解决这两块的问题,再加上一些工程化的方式就可以实现比较完善的自动化测试。
大多数测试人员是界面功能测试入门,对后台服务测试需要一定时间进行了解。
Java SDK本质是把系统调用接口封装成类库,供客户端使用;开展集成测试时,需要提前熟悉SDK使用文档,然后通过分层架构去进行规划即可。
作者简介
代家雄
来自数据网格实验室团队
主要负责分布式数据共享平台整体质量保证工作