趣链科技logo

Java SDK集成测试概述及实践

趣链科技2020-10-30

项目背景

作为长期专注于区块链底层平台设计和研发的专业团队,趣链科技对产品质量尤其重视。软件测试可以说是平台的质量保证的最关键一环。

底层的技术平台通常会提供对外交互的SDK,在测试环节中,可以通过SDK对系统进行集成测试,从而验证系统的各项功能是否能够正常使用。

Java SDK是软件开发中应用最广泛的一类,以在BitXMesh项目测试的实践为背景,介绍Java SDK集成测试的一些心得体会。

系统提供的功能主要有如下几点:

  1. 资源库中资源管理,包括文件/数据库/模型/Restful接口等
  2. 联邦计算
  3. 跨节点资源获取和展示
  4. 系统和用户管理

起初测试工具较为零散,新增模块或者功能之后往往趋向新建一个小的测试项目进行测试。但是随着功能和客户越来越多,质量保证的要求不能放松,构建一个完善的测试项目成为必然要求。

本文以该项目为例,详细介绍测试项目的分析、规划、实现、具体模块示例以及最终形成的测试报告。

测试项目分析

在测试项目中,最核心的一个环节就是测试用例设计,要想设计出优雅的测试用例,首先要对项目本身有充分的了解,根据对项目的功能和代码结构分析,将测试项目用例结构分为以下三类:

  1. 用户权限相关测试:验证不同类型的用户对模块操作的权限正常
  2. 异常数据测试:包括数据异常和功能逻辑异常
  3. 正常功能测试 

单独的用例实现起来难度不大。

但要充分考虑到后续维护,特别是权限测试异常测试两方面。

因此在设计测试用例的时候要秉承以下两点原则:

  1. 优化代码结构,减少代码冗余,增加可读性;
  2. 测试用例数据和测试代码分离,方便后面单独维护测试用例。

测试项目规划

测试框架

TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便,它在很大程度上借鉴了Java注解来定义测试。

本项目使用TestNG进行测试。Excel维护用例数据,封装函数读取其中数据,使用dataProvider传递给测试函数进行测试。

数据驱动测试,函数传参形式

由于系统功能耦合性较强,因此单个用例往往包含较多操作。我们把类似流程的测试用例组合到一起,对各个操作进行位置编号,使用Pair<Integer, Integer>的形式传参,对预期出现异常的位置进行断言。

测试过程中异常捕获和处理

权限相关的测试,每个操作都可能有权限或者没有权限,因此每个操作完成后直接与预期进行对比进行即可,捕获到异常就断言错误码。

流程相关的测试,如果前一个操作对后面操作有影响,检测到该操作抛出异常后直接对错误码进行断言,然后退出当前测试,继续后面测试;反之继续进行后面操作。

自动触发Jenkins项目构建

使用触发器执行自动构建,具体配置参考第六板块【持续集成

项目结构

用例组织方式

测试用例在内部的Thoughts环境以表格的形式编写,用例来源于需求文档和系统测试分析文档。

测试项目结构

在这个项目中使用项目管理工具Maven来管理构建和报告。

项目结构如下:

版本控制

版本号与待测项目版本号保持一致,在Git中进行维护。

部分实现示例

BitXMesh中有多种不同类型的用户,这些用户对不同模块和资源的操作权限不一样,因此需要逐一进行权限测试,看是否有遗漏或者越权问题。

另外,BitXMesh需求中对部分输入信息有限制,如长度/是否为空/重复/特殊格式等,需要对边界值和其他相关逻辑进行测试。

权限测试(有统一的报错代码)

模块中权限主要包括创建/删除/查看/修改/上传/下载/赋权操作等。

因为创建是后面操作的基础,因此单独指定用例对创建功能进行权限测试;其他操作共用一个用例,每轮对不同用户执行用例时,让指定用户先创建,再执行后面操作。

一个用户在一个模块中的所有权限作为一组测试数据;有权限时操作正常完成,没有权限时抛出异常,状态码为指定值;获取错误信息之后对捕获到的每个异常状态码进行断言对比即可,当前测试继续进行。

异常数据测试(有专门的报错代码)

这里对模块功能做全流程测试。当测试程序捕获到有操作抛出异常的时候就直接返回,不执行后续测试。

为了方便进行数据驱动测试,我们把用例中每个操作顺序进行标注,从1开始递增;如果期望在第n个操作处捕获到异常,则可以传入(n, errCode)进行断言验证

持续集成

Jenkins配置

编写部署脚本,使用shell命令运行集成测试

触发流程

  1. Git webhook检测到打tag或者主干分支有合并之后,触发上游Jenkins打包任务,生成可执行文件,并推送到Nexus仓库
  2. 生成可执行文件任务成功后,触发集成测试任务,远程拉取可执行文件,执行部署和测试

程序运行环境

Jenkins slave节点提供的Docker容器。因为单个BitXMesh占用资源不多,因此可以在一个Docker容器中同时运行测试程序和多个BitXMesh节点程序。

测试报告

本项目使用了maven插件maven-surefire-plugin来生成测试报告。项目测试完成之后,自动生成target/surefire-reports/emailable-report.html报告,在Jenkins中指定相应测试报告路径即可。

pom.xml中配置如下:

总结

权限测试和异常测试是测试过程中两个需要注意的点,需要在自动化测试中提前规划。

前者容易导致代码比较臃肿;后者难以一次性考虑全面,需要后续进行维护。通过合理的数据驱动测试可以解决这两块的问题,再加上一些工程化的方式就可以实现比较完善的自动化测试。

大多数测试人员是界面功能测试入门,对后台服务测试需要一定时间进行了解。

Java SDK本质是把系统调用接口封装成类库,供客户端使用;开展集成测试时,需要提前熟悉SDK使用文档,然后通过分层架构去进行规划即可。

作者简介

代家雄

来自数据网格实验室团队

主要负责分布式数据共享平台整体质量保证工作