我想,自动化测试现在在软件测试中的重要性已经不需要再多说了。但是大家讨论的重点往往是一些高大上的自动化技术,很少涉及到如何从项目、资源等方面综合来分析是否需要自动化、如何进行自动化。但是对于大部分公司,特别是初创公司,如何合理地使用自动化可能比一些牛逼的自动化技术更重要。
公司产品的自动化从1.0上线初期开始搭建,这3年多来,随着产品的不断变化,自动化的框架也在不断的进化。总的来说,我们公司自动化体系可以分为3个阶段:
- 石器时代:在公司创业初期,测试资源及其匮乏(只有1个正式员工,加上2个外包),人员能力有限。该阶段的自动化主要是考虑到简单、实用。
- 青铜时代:公司测试团队逐步成型,基于自动化的效率、可维护性及业务需求,进行一次自动化的重构。
- 黑铁时代:随着产品复杂度提升,测试用例执行时间的快速增长,以及团队能力提升的目的,在原有的基础上,对自动化执行流程进行创造性的改造,提高了执行的效率和效果。
首先,自动化应该也要当做一个项目也运作,所以在项目启动时,一定要搞清楚项目的目的和相关背景:
- 创业初期:人少,能力相对较弱,目的是先保证业务正常,不追求技术的复杂度
- 快速开发:要能够快速构建出自动化框架,尽快的把主要业务流程的用例自动化,保证核心业务
- 全民测试:降低自动化用例的编写难度,考虑利用一切可利用的资源(开发、测试)
到目前为止,我们已经确定了自动化要做哪些工作,接下来我们要确定的就是该采用何种方式来做自动化。所谓万变不离其宗,从自动化实现的方式来看,基本都可以归属到以下3类:
- 单元测试:测试粒度最小,覆盖逻辑更全,但是通常主要依赖开发来做,而且此时项目已完成,不适合再补充单元测试
- 接口测试:执行速度快,执行稳定性高,能够覆盖后台服务功能,但是前台页面功能无法覆盖
- Web页面自动化测试:能够覆盖前端页面及后台服务,并且最大程度的模拟用户的行为,做到端到端的全流程覆盖
大家其实可以看到,到目前为止,大部分考虑的因素和决定的标准都不是技术方面的考量,所以说自动化绝不是简单的技术活。好了,程序猿通常还是对技术更感兴趣,接下来,我们就来谈谈技术层面的问题。
首先,面临的问题是技术、工具选型。这个阶段其实也没有那么纠结,业界主流的Web页面自动化工具也就那么几个,Selenium,QTP等等。比较一下这些工具支持的语言、浏览器支持种类、活跃度、资源是否丰富,我们最终选择了Selenium。
下面我们简单看一下如何使用Selenium。
- 最常见的,使用Selenium打开一个网页
from selenium import webdriver from selenium.commmon.exceptions import NoSuchElementException from selenium.webdriver.support.ui import Select from selenium import selenium from selenium.webdriver.commmon.alert import Alert driver = webdriver.Ie() driver.implicitly_wait(20) driver.get("http://www.google.com.hk")
- 网页简单操作
- 关闭窗口 driver.close()
- 关闭IEDriver driver.quit()
- 获取页面元素
- 填写文本框 send_keys()
- 点击按钮 click()
- 清空输入框 clear()
- 选择下拉框 Select(下拉框元素).select_by_value(value)
- 验证页面元素 verifyTextPresent,verifyElementPresent,verifyText
- Iframe的处理
- 页面如果使用多个iframe来组织,无法在一个iframe中查找另外一个iframe中的元素
- 切换iframe:
- 建议开发尽量不要用iframe组织页面
- 弹窗的处理
- driver.current_window_handle()
- driver.window_handles()
- driver.switch_to_windows(window_name)
- Alert,confirm,prompt的处理
- 控制等待时间
- 不要用sleep
- from selenium.webdriver.support.ui import WebDriverWaitWebDriverWait(driver,10).untile(lambda x:x.find_element_by_id("someId"))
做过UI页面自动化的同学肯定知道,UI的页面改动是自动化后期维护最大的问题。为了减少后期维护的代价,我们通过以下方式来解决:
- Page Object模式:
- 将每一个页面抽象封装出一个Page类
- 将每个页面上的主要元素对象的操作封装成一个方法
- 业务流程封装:在Page Object基础上,对那些涉及多个页面操作的常用业务流程进行再次封装。比如发布借款,标的投资,订立合同等等。
为了更快速的搭建起自动化测试,我们选择使用现成的开源自动化框架,而不是自己从头开发一套。经过对常用自动化测试框架的考量,最终选择使用Robot framework:
- 轻量级的自动化测试平台
- 支持多种语言,多种格式
- 第三方开源测试库丰富
- 测试关键字和自动化用例可以并行开发
上面谈到的是自动化初期的技术选型和范围选择,下面我们来看看整个自动化投入和后期效果:
- 自动化测试开发阶段
- 初期自动化范围评估,技术选型,自动化从0开始的底层代码编写,以及最终完成的一个用户注册登录的Demo用例,一共花了差不多2人周的时间。
- 然后针对产品主要的业务流程,完成Web UI相关关键字的编写+每个场景一个示例,花了1人周
- 对团队进行如何编写自动化用例培训,2个测试全职编写自动化用例,编写并单个调试完成了部分P1,P2优先级的主流程用例,花了差不多1周的时间
- 自动化优化阶段,差不多花了3个人1周的时间,完成以下工作
- P3用例自动化
- 用例集成联调+稳定性(90%以上)
- 集成CI环境
- 自动化测试报告分析
- 错误用例的分析和调试,差不多平均一个用例5分钟
- 新功能+旧功能改造
- 就用例的改造,基本上平均10分钟一个用例
- 新增关键字+新增加测试用例自动化,每个用例需要30分钟。具体开销随着关键字复杂度和用例场景的复杂度不同有所区别
我们做自动化的目的绝不是为了自动化而自动化,也不是为了提高测试的编码能力而自动化。就上产品上线后要统计相关业务指标,我们自动化做好之后也要统计相关的ROI,看看到底这个自动化做的值不值。下面我们来粗略的分析下自动化的ROI:
- 已有用例:以P1用例50个,全部用例180个为例来统计。
- 初期总投入8人周
- 每个版本都执行的用例,平均每周投入50*4*90%*5=100分钟
- 所有用例每周投入180*90*5=90分钟
- 每周节约时间10人天(1.5人天*4+4人天)
- 收回成本周期
- 按照执行相同次数的手工测试,大约5周后收回成本(8*5+0.5*N<10N,N>4)
- 按照纯手工每周花费2人天测试回归用例,自动化投入人力0.5人天,每周节省1.5天,那么大概25周(半年)后收回成本
- 按照执行相同次数的手工测试,大约5周后收回成本(8*5+0.5*N<10N,N>4)
- 新增用例
- 每个新用例投入30分钟,按照每个用例平均执行5分钟,大概执行7轮后(2周)收回成本(5*90%*N=30,N≈7)
- 按照每周手动执行一次手动回归计算,7周(2个月)后收回成本
- 每个新用例投入30分钟,按照每个用例平均执行5分钟,大概执行7轮后(2周)收回成本(5*90%*N=30,N≈7)
最后,说些在做自动化过程中,对于整个团队的一些想法:
- 测试在项目初期评审系统设计文档的时候,就要考虑到相关功能自动化实现的问题,要和开发协商好相关的接口,是否需要开发帮助开发测试桩等等。这些虽然是老生常谈,但是在实际项目中,我觉得要做好这些并不是那么容易,而且可能比自动化的技术更重要
- 开发,特别是前端开发,要有统一的页面编码规范,后台日志也要规范。这可以极大的提高页面自动化开发、调试的效率
--未完待续,石器时代就介绍到这里,也算抛砖引玉,敬请大家期待后续XX时代的精彩介绍。
有任何问题,欢迎大家和我联系。