高效自动化测试平台:设计与开发实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

软件自动化测试的意义

随着计算机技术的发展,计算机的计算能力和存储能力不断提高,计算机软件的复杂程度也不断地增加,近几十年互联网飞速发展,网络可以将计算机连接起来,突破硬件能力的限制,形成规模更为庞大、功能更为复杂的软件系统。可以看到,在这样的背景下,要保证软件的质量已经成为每一个企业的巨大挑战。

在几十年前,受限于计算机硬件的限制,软件的规模比较小,比如一张或几张磁片就能容下一个系统,所以不管从软件的代码量还是从功能来说,都是比较少的,要保证软件的质量,可以通过常规的测试手段来进行测试,测试人员根据软件设计人员定义的操作,设计测试用例,并且手动地执行测试用例便可基本保证软件的质量。

不过随着软件规模的增大,软件的速度开始提升,特性也越来越丰富,测试的要求就逐渐变得高了起来。

特别是随着软件质量的提高,公司对企业的测试人员提出了更高的要求。传统的测试人员需要设计更多的测试用例,这意味着测试人员需要执行更多的测试用例,渐渐地,纯手工测试已经不可能满足软件质量的要求了。

自动化测试是将传统人工执行的测试用例转换成程序,让机器去执行。机器不仅可以24小时工作,并且对于每一次执行都不会“偷懒”。这里笔者并不需要列举具体的数据来说明自动化的测试用例可以提高多少测试效率,只需要通过一些简单的例子,就可以看到自动化测试带来的巨大的效率提升。

比如,对于传统的交换机测试,一个经典的测试用例就是数据报文的转发,我们可能需要在交换机上先做一些配置,接着在测试仪表上做一些配置,然后使用测试仪表发送测试流量,再对结果进行分析。这个过程如果用纯手工,可能需要两分钟,如果使用脚本来配置交换机并且用脚本控制测试仪表,可能只需要几秒钟。这还不是关键,关键在于,如果这个端口支持不同的工作模式,比如十兆位、百兆位、千兆位模式,那么就需要做三次同样的测试。

软件行业的统计会带来一些有趣的结论。比如一个公司基于缺陷的统计,每千行代码的缺陷数量为两个,在下一个版本发布时,每千行代码的缺陷数量只有1.5个。这并不是说明软件质量提高了,而是有缺陷没有被找到。这看上去似乎有点不合乎逻辑,但事实就是,功能和性能的增加会导致测试的复杂性以几何的方式提升,所以缺陷和代码量并不呈线性的正比。

所以软件自动化测试的重要性不言而喻,我们不仅需要软件自动化测试,还需要高效的软件自动化测试,以应对日益增加的代码量。

软件自动化测试的发展

早期脚本录制回放,或者简单的单元测试脚本,可以说是自动化测试的雏形。比如开发人员会写一些单元测试函数,来对一些模块进行输入/输出测试。黑盒测试人员会将软件的配置过程及检查过程使用工具进行记录和回放。比如Pro Comm、SecureCRT等终端软件就支持用户输入的记录,并且生成脚本,然后用户可以对整个配置过程和结果进行自动化处理。

在这个阶段,自动化测试没有统一的自动化测试管理工具,脚本也没有统一的版本管理,所以维护起来也比较麻烦,不过作为手工测试的辅助,已经能够大大提高测试的效率。

之后,很多企业逐渐意识到自动化测试管理的重要性,有些企业的团队就开始把自动化测试作为一个项目来对待,有专门负责自动化测试工具开发的人员,形成了比较规范的自动化测试开发团队,这些团队根据项目的需求来建立专门的自动化测试工具,以帮助测试人员开发自动化测试用例,统一进行管理和运行,并且可以生成规范的报告。

在这个阶段,许多团队的自动化测试工具往往针对性非常强,这里的“针对性”指的是,可能每个自动化工具只能应用于某种产品系统的测试,甚至对产品的配置都是有要求的。笔者认为,出现这一情况的原因是,在当时,测试人员的代码和设计能力不是很强,企业很少将专门的开发人员派去参与测试系统的开发,并且在当时,自动化测试工具即便是完善的,也依然处于辅助的地位。因为自动化工具本身也是软件,过于复杂的功能会提高开发的成本,也会导致工具缺陷带来的产品缺陷无法发现或自动化测试不能顺利执行的问题。所以,有针对性的测试工具,开发和维护起来都比较容易。

随着软件发展越来越快,企业的产品周期也变得越来越快,需求变更,新产品迭代,针对性强的自动化测试工具反而变得更不容易维护,要么需要重新开发对应的自动化测试工具,要么需要对原来的工具进行改造。

在这种背景下,出现了一些开源的或者商业的自动化测试框架或者工具,来针对某些领域的软件进行测试。比如Rational Functional Test是IBM推出的一款自动化测试工具,可以用来测试Web自动化及基于Java的Swing或AWT的GUI的自动化测试,它本身提供了控件抓取的功能和不错的执行报告生成的功能,并且还有很丰富的示例文档。

测试团队选择适合他们的框架或工具,可以更多地关注测试业务本身,将有限的资源集中在测试用例的开发和执行上。但是随着软件规模的进一步增大,迭代周期进一步缩短,通用的框架也会有一定的局限性,比如,通用框架的功能无法满足实际需求。

测试框架开始逐渐向平台化发展,不仅是简单地执行测试用例并输出报告,还能够进行测试用例的复杂管理,以及测试执行的复杂管理,并且更进一步地,进入持续集成/持续交付或部署(CI/CD)的环节,使得整个软件的开发和测试流程形成一个完整的自动化闭环,企业逐渐开始增加测试开发人员的配比。

而如今,随着人工智能的引入,自动化测试又开始向人工智能方向发展。人们正在研究利用人工智能技术进行自动生成自动化测试用例的技术,这无疑又会将自动化测试提到一个新的高度。

关于本书

即便自动化测试技术在今天已经发展到人工智能的阶段,但是很多企业和团队由于成本或者其他一些因素,依旧在自动化测试工具、平台的选择和开发上苦苦摸索和前进。

这本书是笔者对从事了十几年的自动化测试开发工作的一个阶段性总结。笔者曾经任职于几家通信企业,也在创业公司带领过测试开发团队,现在依旧在软件企业中从事自动化测试平台的建设和优化。

在这本书中,笔者根据所在的公司所面临过的一些挑战,分析一个自动化测试平台所需要的或者可能需要的相关特性,并且用Python语言来实现这样一个平台,因为Python是现今流行的脚本语言之一,很多企业都在使用Python进行软件开发。不过使用何种语言只是一种工具,笔者有很长一段时间使用C#进行软件开发。

编程语言是实现设计的途径,甚至一个功能强大的平台,可以匹配多种语言工具开发的库,比如最近流行的微服务架构,就可以使开发者选择自己熟悉的语言来进行开发。关于Python的版本,本书在编写阶段经历了3.5版本到3.7版本的一次升级,所以有些代码可能需要Python 3.7以上的版本才能执行。比如字符串格式化方法,f“{var}”这样的格式是3.7版本以后的新特性,如果读者还在使用3.5版本的Python,可以自行替换成类似str.format或者%的字符串格式化方式。

在大多数情况下,笔者希望平台是足够通用的。其实在前几年,笔者一直认为,足够通用的测试平台在企业内部更容易推广,并且能够更好地满足变化需求快的项目,这样可以在新产品到来之后,不需要做太多的测试平台的重构。不过最近几年笔者才发现,过高的通用性会提高测试平台开发的难度,有时候舍弃通用性是提高效率的好办法,当然这些都需要团队去权衡。

本书的读者对象是在软件测试领域有一定的经验,对自动化测试开发没有太多的经验,但是希望在自动化测试上进一步发展的工程师。笔者希望,这本书能够给这样的读者带来一些软件自动化测试平台的设计思路,并且使读者能够根据所在团队的特点进行进一的步扩展。当然,如果你是一位希望从事软件自动化测试开发的技术人员,相信这本书也会给你带来不错的启发与帮助。

本书主要分为四个部分:

第一部分包括前言和第1章,主要分析和介绍当前软件测试领域中自动化测试开发的现状,以及所面临的一些挑战,并且通过这些分析,提出了自动化测试的需求。

第二部分包括第2章到第7章,通过案例分析及实际的代码,实现一个可执行的自动化平台的基础功能。

第三部分包括第8章到第11章,主要介绍对传统自动化测试的改进方案,包括数据驱动、测试代码的自动生成、模块化的事件驱动模式,以及第三方测试工具的封装。

第四部分包括第12章和第13章,主要介绍一些前沿技术和自动化测试的结合方法,以及自动化测试的真实企业案例。

本书的所有代码均已开源至GitHub,书中的代码可能会有一些改动,主要是为了以更简单的代码来说明笔者想要表达的概念,代码的功能是一致的。读者可以访问GitHub网址https://github.com/dechenx83/automation_test进行学习,甚至分享自己的代码,一起进步。