宣布实现全平台自动化测试覆盖
悦库的目标客户是企业用户,是一款生产工具,对于工具制造商的我们第一要务是保证核心功能可靠性,其目的是提高客户生产效率。与之相对立的是:产品需要不断迭代和优化,用户的系统环境也在不断变化,这些变化都会影响到产品原有功能的可靠性。软件产品是由大量错综复杂的代码在不同平台运行的综合体,即使最专业的测试工程师甚至开发者自己也不能保证每次的修改不会产生不可预知的其他问题。
为了保证悦库产品健康可持续发展,我们自2022年在原有自动化打包流水线基础上,提出悦库持续交付系统
概念,并一直在不断建设,到现在我们非常兴奋的宣布:
产品可靠性里程碑 => 实现全平台自动化测试覆盖,从悦库网盘5.6版开始,产品发布完全由持续交付系统接管,所有发布包都由测试流水线验证通过后才能发布。
持续交付系统
悦库持续交付系统是基于Jenkins建立的一种由4条流水线,7台虚拟主机/2台树莓派,以及各种脚本和测试用例组成的全平台软件交付系统。目的是:使用一种软件系统维护另外一种更复杂的软件系统的健康发展,摒除人类工作的高昂成本和不可靠特质。
持续交付系统的4条流水线,及其 功能:
构建/测试/发布三条流水线的依赖关系如下,而活动流水线是定时自动循环触发的。
测试覆盖度
自动化测试的覆盖度是一个逐步建设过程,理论上代码和功能覆盖度越高越好,但受限于人工测试和机器测试的性价比,我们会更偏向于将机器性价比高的测试任务实现自动化,这类任务一般有以下特点:
- 产品入口功能,对新用户的体验很重要,出现问题会直接流失新用户,品牌形象恶劣。例如悦库的服务端/客户端全平台部署、升级功能。
- 产品的基础/核心业务,对用户很重要,出现问题会对用户造成重大影响,每次发布新版必须确保可靠的。例如悦库的文件存储/上传/下载功能。
- 有固定标准,不经常变动的API接口。
- 一些后台任务,人工测试不方便的或难以人工验证准确性的。例如悦库的后台数据清理和审计等功能。
单元测试是基于代码函数级别的测试,实施成本很高,适用于逻辑复杂且对准确性要求严苛的领域,如操作系统、航空航天、金融、区块链等领域。
目前悦库的测试流水线建设情况如下图:
覆盖的测试范围包括:
- 服务端(单机版/集群版)部署和升级测试,包括:Windows / Linux平台 。
- 客户端部署和升级测试,包括:Windows、Mac、Web、Linux X64 deb package、Linux X64 rpm package、Linux ARM64 deb package、Linux ARM64 rpm package 。
- 客户端上传/下载测试,包括:全平台客户端上传下载文件/文件夹测试。
- Web端基本功能测试,包括:登录、创建空间、上传下载文件/文件夹测试。
- API测试,正在持续建设中。
目前的测试流水线测试上述任务的运行时间为3小时左右(树莓派性能太差,导致ARM版部署测试很慢),过程中无需任何人为干预,节省大量人力成本同时持续的提高发布产品的速度和可靠性。为了进行全平台覆盖测试,测试流水线需要协调9台主机,在不同的操作系统和CPU架构的平台上进行测试验证,复杂程度可见一斑,并且维护流水线运行的稳定性本身也是有不少的工作量,所以自动化测试成果是显著的,背后的成本也是高昂的。
自动化测试实现
测试流水线中的每一个任务都是一组特定功能的测试用例,对不同的场景分别编写测试用例,然后使用Jenkins流水线脚本串联起来,就形成了测试流水线。
在测试脚本语言方面我们选择Python语言,它简洁优雅,生态丰富,易于学习。测试框架选择pytest,它同样简洁优雅,易于学习。
以下是测试流水线的部分脚本实例,可以看出在这个stage(阶段)中调用了linux_x64_centos9
和linux_arm64_centos7
远程主机上的python 测试用例脚本:
/*集群版服务端-安装/升级 */
stage('cluster server install/upgrade') {
parallel {
stage('linux_x64') {
steps {
bat "ssh linux_x64_centos9 sudo ~/ydisk/lib/systest/start.sh ./test_server_linux.py --cpu_arch x64 --cluster true"
}
}
stage('linux_arm64') {
steps {
bat "ssh linux_arm64_centos7 sudo ~/ydisk/lib/systest/start.sh ./test_server_linux.py --cpu_arch arm64 --cluster true"
}
}
}
}
对于无UI交互的逻辑业务测试,测试框架都会直接支持,但一些测试用例不得不与UI交互,例如客户端升级完成后需要自动登录,验证是否登录正常;Web端上传下载文件的测试则只能在浏览器中进行。这需要使用另一工具 Selenium ,进行网页自动化操作,由于悦库客户端基于Electron,因此也适用该工具。
最终,我们使用Python+pytest+Selenium 的技术栈实现了所有测试用例,其效果如下:
-
UI人机交互业务,Web端文件(夹)上传下载业务的自动化测试效果:
-
逻辑业务测试,Windows 服务端部署安装/升级自动化测试效果:
结束
九层之台,起于累土,当前的悦库持续交付系统仍处于累土阶段,尤其是测试流水线部分,需要继续建设。
产品质量的可持续发展,何其难也,为此,我们探索自内而外的改革,调研学习并尝试TDD(测试驱动开发)等一些成熟的软件开发理念,实现产品质量可持续发展
的目标我们是认真的坚定不移的。