常见自动化测试工具及框架的选用
作者:cai.ruiying[ZSK]
1、什么是自动化测试
软件测试是软件产品开发过程中不可或缺的环节,众所周知,软件测试的分类方法非常多,根据不同的分类,测试可以分为很多种不同的测试方式。如果根据不同的测试点分类,可以将测试分类划分为功能测试、性能测试,这也是我们最常见的的软件测试范畴。而我们的自动化测试,一般意义上来说,是指对功能、性能进行脱离手工的自动化的测试。
对于自动化测试,更广泛的意义,是对界面功能的自动化测试。因此,按照对软件测试的自动化程度,可以分为手工测试、自动化测试。再进一步细分,界面自动化测试,又可根据平台的不同,分为Web自动化测试、移动端自动化测试,而他们的测试工具及框架基本是大相径庭的。
本文,我将依托Web UI自动化测试(网页界面功能自动化测试),简单谈谈我对几款常用的自动化工具及框架的看法。
2、它可以做自动化测试么
关于自动化测试的适用性,一定要明确一点,那就是:不是所有的系统都适合做自动化测试!甚至有的系统根本无法做自动化测试。那么什么样的系统适合做自动化测试呢?总结几点重要因素,如下图所示。
二、工具篇
1、UFT(QTP)
UFT 就是以前最常用的自动化测试工具QTP,用来进行Web UI自动化测试的。QTP实现的是独占屏幕操作,仿真实际用户操作,一般用于回归测试和新版本测试。
它的特点是:支持Windows平台,使用VBScript编写测试脚本,相比Java/C#这类语言,显然更受测试人员欢迎。
它的测试流程是:【制定测试计划】-【创建测试脚本】-【增强测试脚本】-【运行测试】-【分析测试结果】。QTP的脚本生成是通过轨迹录制,再进行增强优化,最后实现回放。因此VBScript脚本的逻辑比较松散,因此对于复杂页面情况的处理能力比较弱,脚本维护的成本就非常高。最重要的是,QTP是收费的,QTP11.5版本发布改名为UFT。下图是UFT的工作台界面。
2、Selenium
Selenium是目前最常用的一种Web自动化测试工具,是开源的,它可并行测试,模拟用户操作,贴近用户实际操作,测试效果直观。它的优势,首先,兼容性好,兼容多平台,多浏览器,多语言编写脚本,因此它从测试脚本开发,到部署运行,都比较稳定;其次,API丰富,可以实现对浏览器、页面元素、鼠标键盘、JS窗口等几乎所有的用户操作,执行效率较高。
当前Selenium已发展到第3代,包含三大组件,Selenium IDE + WebDriver + Selenium Grid。
Selenium IDE是Firefox中的一个组件,可以录制操作轨迹,自动生成脚本并进行回放,但它的缺点是不稳定,生成的代码效率低,定位大多采用自动的xpath方式定位,定位繁琐,回放成功率低,且不适用于复杂系统。
Selenium Grid是用于实现分布式测试。
WebDriver是Selenium核心组件,它就是实现页面操作的组件,利用浏览器原生的API,封装成一套更加面向对象的SeleniumWebDriverAPI,直接操作浏览器页面里的元素,执行效率更高,且稳定性依赖于浏览器厂商,显然更加稳定,因此各大常见浏览器都有对应的WebDriver,例如Chrome对应chromedriver,Firefox对应geckodriver,IE对应iedriver,甚至比较高版本的selenium还自带了部分常用浏览器的驱动,使用起来非常方便。它的优势显而易见,使用浏览器源厂的驱动来进行自动化控制,给我们带了更高的安全感。
3、Appium
Appium是目前最常用的一款移动端自动化测试工具,是开源的,它支持Android和iOS平台的原生应用、web应用和Hybrid应用。它的优势,支持跨平台,多语言脚本编写。因此,兼容性很好,开发便捷。
Appium是C/S架构,提供了基于Selenium WebDriver协议的统一接口。那么这里就需要说明一下Appium与Selenium的关系了。Appium封装了标准的Selenium客户端类库,Appium继承了Selenium中的WebDriver,因此也是通过WebDriver实现界面的定位及操作。而Appium实现的是PC端连接移动端的桥梁作用,这样才能通过PC端对移动端进行自动化测试。
4、工具对比
由于Selenium和Appium都是使用的WebDriver实现操作的,因此这里只对比UFT和Selenium。下面这个表格,充分体现了两者之间的优势与劣势,测试人员可以根据需要选择合适的测试工具,以实现最高的测试效率。
三、框架篇
时下比较主流的自动化测试框架,有TestNG、unittest、pytest、Robot Framework。第一个框架基于Java,后三者基于Python,Java和Python是编写自动化测试脚本最常用的两种语言。下面就简单介绍这四款框架。
1、TestNG
Test NG是一款基于Java的自动化测试框架。说到TestNG就不得不提到JUnit,两者都是基于Java的测试框架,功能差异不大,但是TestNG底层调用的是JUnit,因此TestNG的使用对于测试人员来说更友好。而JUnit更偏向白盒测试,所以开发人员用来做单元测试比较多,而且测试结果可读性对测试人员也有一定难度。Test NG使用更便捷,例如并发测试JUnit需要调用第三方库,TestNG则不需要。一般TestNG主要测试人员使用。
TestNG的主要特点有:(1)涵盖单元测试、功能测试、集成测试等;(2)基于Annotation(注解)机制,测试方法更灵活,当我们想执行一部分测试脚本的时候,就可以使用xml配置文件进行配置,在xml配置文件里,可以选择某些需要执行的测试脚本,排除不需要运行的测试脚本;(3)支持多线程测试,这一点很重要,可以大大提高执行效率。
TestNG还可以自动生成html、xml格式的测试报告。测试报告位于 "test-output" 目录下,只需要执行测试用例时使用TestNG执行即可自动生成,无需配置,使用便捷。同时还可以对报告内容的详细程度进行设置,可以说是比较完善的测试报告了,测试报告的样式如下图所示,展示比较直观、简明,可以直接看到共执行了多少个用例,成功/失败分别是多少个,设置级别更高的报告,还可以查看具体的失败情况。
TestNG的使用方法,是将测试用例生成测试套件,通过执行测试套件来执行测试用例,常用的组件如下图所示:
@Test表示一个测试用例;
@BeforeMethod/@AfterMethod表示在每一个方法执行前/后执行一次;
@BeforeTest/@AfterMethos表示在每个测试用例执行前/后执行一次;
例如,在使用TestNG框架时,就可以将“启动浏览器”的操作步骤封装在@BeforeTest中,“关闭浏览器进程”的操作封装在@AfterTest中,这样就提高了代码复用性。
2、unittest
unittest是一款常用的单元测试框架。它更偏向底层,二次开发方便,因此对于测试人员来说,就具备一定的难度了。它的优势是Python自带框架,可生成HTML测试报告,使用的是HTMLTestRunnerNew库。由此,若基于Python开发的测试代码,就非常适合采用unittest测试框架。只需要使用自带的方法生成测试套件,执行测试套件,即可完成多种组合方式的测试。因此,针对Python的自动化测试,unittest可谓是最佳拍档,可以轻松完成大部分的测试功能。
unittest也可以将浏览器启动、关闭等通用方法封装,生成测试用例,再将测试用例生成测试套件来执行,如下图所示。
unittest也可以自动生成测试报告,报告形式如下图所示,报告的内容与TestNG生成的报告内容相似,展势执行用例的数量、结果等信息,也可以设置详细等级、标题等信息。
3、pytest
pytest是基于unittest扩展的第三方测试框架,比unittest更简洁高效。 pytest可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,比如returnfailures插件,可用于用例出错重跑;还有xdist插件,可用于设备并行执行测试用例。可使用pytest-HTML插件生成测试报告。pytest也可用来进行验收测试,适合复杂度不是很高的系统。
4、Robot Framework
Robot Framework也是一款功能强大的自动化测试框架,基于Python的关键字驱动测试框架,自带报告生成,功能完善。因此它易用性更高,测试人员使用成本低,但灵活性就偏低了。一般多用于验收测试和验收测试驱动开发的自动化测试框架。支持跨平台(Windows/Linux/MacOS)。
它的特点,关键字驱动测试(KDT),简化自动化过程,对测试人员来说更易读,测试数据语法也简单易用,扩展性高,例如支持Selenium第三方类库可进行Web UI自动化测试,支持Selenium Grid执行并发测试,并且可生成html测试报告但操作较麻烦。表格式的测试数据语法和关键词驱动测试使得易用性较高。
5、框架对比
TestNG是基于Java的测试框架,unittest、pytest、Robot Framework是基于Python的测试框架。其实测试框架的选择,更主要还是根据系统的特性,选择适合的框架。
对于unittest、pytest、Robot Framework这三个测试框架,都可支持跨平台,语言单一支持Python,差别并不大,主要如下表所示,而实际选用,可结合系统、框架的优势对号入座,以带来更高的自动化测试开发效率。
四、如何选择
这篇文章对比了一些具有相似性的工具、框架,主要是为了大家在做自动化测试时,选择具体的工具、框架做准备。但这里并不存在绝对的优劣,主要还是取决于项目的测试需求及系统的特点。
业内常传说,不会编程,有钱,就用UFT,会编程,没钱,就用Selenium,其实总结的很通俗了。UFT很强大,通过录制就能实现自动化测试,不需要会编程,你只需要有输入、输出值,就可以做自动化测试,听起来当然很好,但它的维护是需要费用的。而Selenium和Appium其实底层是一样的,API的使用也基本相同,只是针对Web和移动端APP做了不同程度的二次封装,但是Selenium和Appium的使用当然需要一定的代码基础,这样可以针对庞大的复杂系统,做PageObject页面封装设计的自动化测试,可以降低维护成本,但可以做到一定程度上的“一劳永逸“。
而对于框架,其实原理是相同的,都是将测试用例封装成测试套件,通过设定用例的执行方式,来执行测试套件,实现一定程度的“封装“。除此之外,框架还有一些其他复苏功能,例如很实用的自动生成测试报告,不同的框架测试报告的风格也不同,这就根据自己的需求和喜好来选择就可以了。
自动化测试的目的是为了一定程度上的解放人工测试,提高测试的效率,避免人工反复进行同样的操作测试。虽然如此,人工测试仍然是不可替代的重要的软件测试手段之一,不要盲目地进行自动化测试。因此,在选择自动化工具及框架时,一定要根据被测系统的特点,充分利用工具及框架的优势,这样才能真正达到节省人力、提高效率的目的。