大型应用自动化测试流程最佳实践
以PLC程序开发软件SC-ProSys的自动化为例。
这篇文章的目的是向大家介绍一种开发和维护大型软件测试项目的方法论,特别是对于团队开发测试项目时有很好的帮助。下面将分为三个阶段,逐渐深入地讲解,即使此前你对自动化测试还了解甚少,也完全可以理解文章中的知识。顺带也展示界面自动化工具CukeTest对Qt应用的自动化能力。
文章中的阅读最好搭配讲解视频,以获取最佳阅读体验。
初级阶段:直接录制方式生成自动化脚本,直接运行和管理脚本。但不方便大型项目管理,也没有运行结果报告;
中级阶段:我们把脚本拆分变成模块,在这一阶段还将学习如何通过BDD(行为驱动开发)改造来生成直观的运行报告。大部分情况下够用,但是对于团队开发还力有未逮。
高级阶段:我们将模块按照不同的功能和组件进行划分,形成组件类。这些组件类各自对应被测应用中的各个业务功能,通过调用组件类就可以轻松实现自动化操作,提高了项目的团队协作能力和可维护性。
首先,使用自动化测试代替手工测试有很多好处:
无需手动书写测试报告,出错时也不用写重现步骤:自动化操作基于脚本,每一步都可以跟踪和回溯;
测试的效率、稳定性、可移植性都大大提高:避免了人力的限制;
持续集成(CI/CD、DevOps)的支持:界面测试不再是持续集成的障碍;
积累测试资产,提升自身的职业竞争力。
本次自动化测试虽然针对的是桌面应用,但是采取的测试模式参考了Web测试的POM(Page Object Models,页面对象模型)模式,同样可以分为三层模型,从而帮助读者理解自动化测试项目、帮助团队开发和管理维护测试项目:

业务层:代表实际的测试或业务流程,通常是与测试或业务流程相关的描述,以及测试数据;
组件层:代表根据业务进行拆分后的可复用组件,通过调用组件提供的方法可以完成对应控件的测试操作;
对象层:代表被测控件的对象模型,在CukeTest中,对象层由模型文件(
.tmodel
)统一管理,从而完成定位和控制控件的任务。
现在只需要了解自动化测试有这样的一个模型,在后面的实际操作中会带大家逐步了解每层模型的具体含义。
测试介绍
本次实践针对的是桌面自动化测试任务,如果你之前接触的是Web之类的自动化测试也不用觉得用不上,因为本次自动化使用的工具——CukeTest开发桌面自动化测试的模式与Web自动化类似,理解起来不会有任何障碍。
作为桌面自动化,被测应用是一款大型的、专业的桌面软件,本次介绍选择了SC-ProSys软件——一款PLC(一种可编程工业控制器)程序开发软件,使用Qt框架开发,并且拥有完善的仿真器功能,了解过工业自动化的读者一定不会陌生。
所谓PLC,就是可编程控制器,常用于工业场合,尤其是在流水线上。因为我们都知道,流水线都是由信号来控制的,常规的控制器一般只能控制开启和关闭两种状态,但是PLC还能精准的控制开启和关闭的幅度,这也是流水线完成各种精密操作的一个基础。可以将PLC理解成一个可以运行程序还 能同时控制很多设备的高级开关。

那么对于被测应用的用途就比较好懂了,就是用于开发在PLC这个高级开关中运行的程序,其实跟Visual Studio、Eclipse之类的集成开发工具(IDE)类似,一样的创建项目、编写代码、调试运行。但是它跟我们了解的其它集成开发工具最大的区别在于,因为它开发的是运行在工业设备中的程序,因此会根据选择的设备型号使用不同的程序模版,同时因为大部分情况下,手头都不会刚好有对应的硬件设备用来运行编写的程序,所以它还提供了不同硬件设备的仿真功能,编写好的程序可以直接在仿真中运行。
在接下来的自动化测试中,我会选取被测应用中的基本操作流程,来演示这个流程在不同阶段(初级/中级/高级)中都是如何自动化的。流程任务如下:
新建项目
选择设备型号
新建程序
编写程序和变量
运行程序
校验运行结果
初级阶段(视频 04:14 位置)

无论你是否从事测试行业,也无论你是否写过代码,看完这个阶段,你可以掌握以下内容:
如何快速生成自动化脚本?通过录制生成。
如何理解录制生成的脚本?了解一些简单JavaScript语法。
如何理解模型的概念?使用模型管理器编辑录制生成的模型文件。
在这一阶段我们关注的主要是对象层——也就是模型管理器,录制所生成的脚本都是对于对象的简单调用,因此理解起来也非常简单。
看完初级阶段,你就算是入门了自动化测试。但是这个阶段它有个问题——录制的脚本只完成了一个单一的操作流程,没有对应的场景描述,没有检查点、数据驱动、测试报告等内容,还算不是是一个专业的测试脚本。拿它给老板交差还是不够滴。
所以就到了中级阶段,我们要形成一个运行报告,直接把运行结果展示给所有人看。
中级阶段(视频 19:45 位置)

看到这个阶段,你很可能是一个测试行业的从业者,有过测试的经验,希望能够有实际的工作产出,而不是几个录制生成的、干巴巴的自动化脚本。那么看完这个阶段你可以掌握以下内容:
如何在测试项目中描述业务流程?使用剧本来描述业务流程,从而提高测试项目的可读性和可调试性。
如何将脚本改造为BDD项目?将自动化脚本按照业务逻辑拆分成步骤。
如何生成运行报告?改造为BDD项目后运行项目就可以得到运行报告,检查点、调试信息、运行截图等都可以作为附件附在运行报告中。
这一阶段的难点在于如何熟悉在测试项目中引入剧本概念,并且借由剧本提供的各种功能更好地完成测试任务。
完成了中级阶段,你已经足以胜任独自开发完整的自动化测试项目了。但如果你处在测试团队中进行团队协作开发,那可能你还需要了解下一个阶段,在高级阶段中,要进行一些有难度的开发,但是对于整个团队的协作上是非常有效的。
高级阶段(视频 37:43 位置)

到了这个阶段,你大概是一个对自动化测试有自己的理解的资深从业者,了解自动化测试可能会遇到的麻烦和困境。因此这里展示的笔者个人对于大型软件自动化测试开发的一些经验之谈,涉及以下内容:
如何理解自动化测试三层模型中的组件层?将测试方法独立出来形成组件类,从而保证测试团队可以专注于测试组件的开发,并通过组装测试方法完成测试任务。
如何形成组件类?将步骤定义直接划分(按照业务划分,最终结果中也介绍了按照布局划分的划分方式)
如何使用剧本中的参数?将剧本中的参数传递到测试方法中。
这一层的难点是参数化,在上一阶段中完成BDD改造后,剧本中的参数仍然没有对实际流程产生影响,这代表它还未在脚本中被使用,因此无论我们怎么修改剧本中的项目名称参数,都不会影响到实际执行中创建的项目。而作为模块中的方法,我们当然希望传递进来的参数能够被真正地用上,因此我们将使用传递进来的参数控制脚本的运行,这也就是参数化。
参数化是真正开始掌握自动化测试开发的一个分水岭,因为在这时,你会发现录制生成的脚本存在着很多局限性——死板的回放脚本往往与能够灵活参数化的脚本方法相差甚远。对于如何参数化一个录制生成的脚本,笔者归纳了以下3点:
调用
set()
或pressKeys()
方法的脚本,常需要用参数代替。使用
findItem()
来代替树/列表/表格中的项。在剧本中使用不同的参数来完成任务。如使用文本字符串传递大段文字、使用数据表和场景大纲来驱动重复运行的脚本。
最终结果演示(视频 59:16 位置)
如果将高级阶段的知识点应用到项目中,项目将变得更加的易管理,并且适合推广到团队中。视频结尾展示了笔者在实际场景中常用的一种组件划分方式——按照布局划分,这种划分方法将组件按照布局分为:
主界面组件
左侧界面组件
右侧界面组件
底端界面组件
顶端界面组件(菜单栏和工具栏)
弹出组件(对话框和右键菜单等)
这种划分方式的优点在于直观,并且概念也比较好推广,使用的时候只需要按照布局去相应的类中寻求相应的方法即可;不足之处在于一个简单的流程可能需要引用很多组件类。
结论
桌面应用的自动化测试作为一个在国内尚未全面铺开的测试领域,不少测试工作的从业者在寻求一种能够推广到各种测试场景中去的项目开发模式。
本篇文章以常见的大型桌面自动化项目的测试项目开发作为切入点论述了一种最佳实践方案。这种方法及工具组合能应用到类似的其他各类桌面自动化的测试中。读者们对于测试开发有什么建议和观点也欢迎大家在评论中讨论。