写点什么

在敏捷项目中实施自动化测试之我见

2012 年 4 月 18 日

实施 Scrum 开发过程充满着挑战—尤其对于从零开始做产品的团队来说。在每个增量冲刺中,你不仅要新增功能,还要确保已实现的功能依然可用。这时,拥有一个可覆盖系统测试和集成测试的自动化框架, 可为团队增添不少火力。它不仅能为回归测试增添一层保障,还能释放出珍贵的开发和测试人员时间, 让他们花更多的精力在擅长的领域。

在这篇文章中,我想分享我们团队在最近项目中成功应用的一些自动化测试方法–事实证明,这些成果是一项巨大的资产。付出的努力将会在未来得到很多的回报。现在,我们每天能在类似线上的测试环境下,构建,集成,测试和发布同线上一样高质量的产品应用。通过相互分享好的和坏的经验,我们学到新的知识并且加以实践,把事情做得更好。

我们团队很高兴看到应用自动化测试方法所收获的这些成果。采用这些方法能让我们持续地在每个冲刺中轻松添加新的功能,同时,把我们从多轮回归测试中解救出来去寻找和修复重要的问题。

下面是我们学到的一些实战经验,如果你正开始着手在项目中增加自动化测试,这些经验应该可以让你少走弯路。

从小做起

生成自动化测试的过程类似于生产被测软件。这涉及到大量的设计,编码和测试它本身是否正常工作。因此,同应用一样,自动化测试最好是增量开发的—在几轮冲刺中陆续地向自动化框架添加新的测试和功能。需要明确的是,我们的目的不是在一开始就产生完美得能做任何事情的测试框架, 它不可能达到。 从事测试同生产软件一样,是有价值的。它们能让人建立自信和看到令人激动的进展。即使再小的成功也能让大家快速地进入状态—特别是当测试自动化方案已经运行并且证明是对团队有价值的时候。

测试自动化订单

为你的项目维护一份测试自动化订单,在订单中列出所有的自动化任务和已识别的改进需求。如果每个冲刺你从订单中认领几项并实现,不久就会看到一个新的自动化回归测试集合成型。有时候 ,测试自动化订单的用户故事可能需要开发人员专职来实施,为推进自动化测试,需要向产品负责人提出人员需求。但如果团队成员都推崇质量,让产品负责人看到这些用户故事的价值不是难事。

一个测试自动化订单可以包含如下有先后优先级的项:

  • 参数化测试执行环境
  • 持续地集成
  • 提升报告机制
  • 在通知邮件中提供附上错误日志的选项
  • 为流程场景收集性能报告
  • 为重要测试用例的并发执行增加验证性测试

工具只是手段不是最终目的

测试自动化所用的工具和框架不是投入测试时间的真实目的。如果你眼光长远的话,真正的目的是通过快速的反馈来支持新一轮的开发。它可以让各方知晓项目的最新状态,由此,利益相关者可以做出有根据的决定。既然工具和框架只是实现更多的一种途径,就不要沉迷在新工具上而忽视了最终的目的。

测试数据和脚本独立于所选的自动化测试工具也尤为重要。写死在脚本里的测试数据,系统配置和对象很难维护。从长期看来,如果项目碰到意外问题,频繁地与测试数据交互会让中途更换测试工具成为一件困难的事。

设计有意义的测试而不是什么都自动化

测试方案最重要的部分是测试。很多团队花大量的时间和精力在开发功能齐全的框架上而忽视了有意义的测试。不要让框架代码比测试代码更重要。开发一流的框架理念是诱人的但是要避免这个陷阱。投入测试自动化的真正价值在于它产生的测试,因此要集中精力在有意义的测试本身。

另外,不要因为自动化而自动化。在添加新的测试之前适当的考虑可维护性和执行时间。每个加入到自动化测试集合的测试,都成为了产品基线的一部分,也需要同其他基线一样维护—在整个应用的生命周期中。添加复杂和难维护的测试,最终结果是减慢组内反馈循环,这个应当避免。

让自动化测试远离你本地机器

如果你正在为项目编写自动化测试,而且只在你本地机器上运行。那么这个测试基本没有价值。团队中的每个成员应该享受到自动化产生的安全保障。要达到这个目的,你必须让自动化测试远离你本地机器。

团队所有成员应该能够访问自动化测试集合并且点击按钮就能执行。如果某个成员想要在提交大量改动之前或之后执行测试集合,他应该能够执行并且不麻烦地得到结果。理想状态下,自动化测试集合最好架设在外部服务上,作为构建过程或者持续集成环境的一部分来运行。有频率地订制测试集合执行(如在每次迁入或者至少每日)并标上执行状态。适时地制定通知机制来通知有关人员最新的执行状态。

有关执行时间

执行测试集合里的所有用例需要花多少时间是个关键问题。如果自动化测试需要执行很长时间,那么它不再为我们增加价值,因为预期的反馈已经不再迅速(尤其对于敏捷项目中小的迭代)。另外,这些正在执行的测试集合会被停掉,因为等待它执行完是件痛苦的事。采用并行,类似 infrastructure 的产品,或者书中的其他方法–只要能使测试跑的快,你就可以维持一个快速的反馈循环。

另外,可为每个测试用例标上标签并选择性的执行所从事的功能模块。能够选择性执行可以节省很多执行时间,尤其对于测试集合相当的大并且执行完整个集合在特定情况下没有实际意义的场景。

保持测试用例状态为绿色

将测试集合里的所有用例标成绿色(例如,执行成功的)。有时候,你可能知道某些用例会因为一些已知的原因失败,也许是部分系统不可用或者在修复中的问题推迟一段时间上线。在这种情况下,你可以把这部分用例标成已知失败的用例,让测试框架忽略或者跳过它们。这样做可区分构建中未知的和已知的失败,新增的失败用例可立即被发现。

一旦用例状态变成红色,自觉地优先将它变成绿色(例如,通过修复测试用例或者修复代码)。越早定位到失败测试,越容易更正他们–特别是刚刚签入代码改动导致用例失败的情况。同样要重视那些看似永远不会失败的用例集合,因为有自动化测试在会给人一种很安全的错觉。某种情况下,如果加入的测试用例很脆弱经常失败,又让人觉得不安全。这两种情况,团队都应该做一些调查研究。

通过测试这些测试代码来查找出问题是值得推荐的,它可以建立自动化测试可靠的自信。同样,使用 data fuzzing 是个不错的选择,这样,你不用在每次测试执行中用同一套数据。有助于产生更健壮和有意义的测试。

清晰的报告

花一些时间在测试框架中实现报告功能。用简洁且精确的方式来报告失败和错误,这样研究人员可快速地定位到哪里出错。报告要绝对简单,如果有时间精力的话图表化更好。

对所有人可见

最后也最重要的是,让过程简单,且所有的相关人员可操作和看到执行结果。在网上记录测试执行历史和趋势,如果可能的话,把它挂到代码质量分析工具如 Sonar 上。让大家从各自的角度去看结果。尽量让添加和更新测试简单,大家一起参与进来把测试做的更好。

总结

总的说来,我们认为有效的,应该格外重视的测试自动化方法包括:

  • 在项目的开始从小做起,迭代地在每个完成的冲刺中构建测试集合。
  • 建立测试自动化订单,作为优先级任务清单。这有助于集中精力在当前任务,同时不忽视长期目标。好好研究可选测试工具的用途,不要舍不得花费一到两个冲刺的时间去熟悉它们。
  • 保持测试脚本和数据较少的依赖,有助于日后有需要更换测试工具时轻松应对。
  • 产出有意义的测试,在向自动化测试集合添加用例的时候,适当地考虑可维护性和执行时间。
  • 尽快地想尽办法让整个团队使用已迁入到 build/CI system 的安全保障。
  • 产出有意义的测试并且确保它们不会给人安全的假象。
  • 努力地快速解决失败用例,让测试执行时间尽可能的短。
  • 最后也最重要的是,适当地添加直观的报告机制,让团队所有人能看到测试结果和历史趋势。这有助于每个人都参与进来监督开发的进展和健康度,并做出有根据的决定。

总结

在这篇文章中,我分享了在最近项目中实施测试自动化所学到的经验教训。其中所列的测试自动化方法绝对是完整的。它们是我在一个很棒的团队实施测试自动化时收集到的宝贵经验集合。

要铭记的是,软件测试自动化让电脑一遍遍地快速执行回归测试集合,验证功能点,发挥其最大的价值。团队中的成员被释放出来做更擅长的事,运用其认知技能在流行前沿探索式测试系统。

如果你赞同文章中所提倡的测试方法并投入自动化测试,你也可以每天在类似线上的测试环境下,构建,集成,测试和发布同线上一样高质量的产品应用

关于作者

Rajneesh Namta , 受雇于 Xebia India 的高级测试顾问,在软件测试及相关的领域有 7 年工作经验。作为认证 Scrum Master,Rajneesh 有三年以上的敏捷开发经验。工作内容涉及到软件开发的多个阶段,包括需求分析,涉及和开发,用户接受测试,发布前培训。同时作为 soapUI 产品咨询委员会的成员,Rajneesh 乐于通过博客,文章和会议演讲的方式参与和投身于敏捷测试社区活动。

关于译者

李琼 关注的领域和技术:自动化测试技术,项目管理(貌似对技术比较崇尚的公司不怎么在乎 ROI,技术牛就行,希望能多研究或者看到一些文章教技术大牛如何做好管理,省人力,为公司省钱。),如何成为一个业务测试专家,软件测试人员未来的发展方向(测试是否会消失),Agile,scrum。

查看英文原文: Thoughts on Test Automation in Agile


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012 年 4 月 18 日 00:005699

评论

发布
暂无评论
发现更多内容

智慧公安情报信息研判系统开发方案,重点人员管控平台搭建

WX13823153201

初识 D3.js :打造专属可视化

vivo互联网技术

JavaScript 数据分析 可视化 图表 D3

2020DevOps状态报告

陈琦

DevOps 运维 开发 趋势 自动化测试

关于2020 我有12个关键词

浪潮云

阅读

学习新语言步骤(有其他语言基础前提)

周周

区块链即时通讯系统开发方案,IM聊天社交软件开发

v16629866266

对于我们程序员来说,基本面是什么呢?

Java架构师迁哥

2020DevOps状态报告——平台模型:扩展DevOps的新方法

陈琦

DevOps 运维 开发 趋势 自动化测试

Spring中@Import的作用

张健

大数据知识专栏 - Zookeeper的Shell操作

小马哥

大数据 zookeeper 大数据技术 ZooKeeper原理 28天写作

从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步

JackJiang

网络编程 高并发 高性能 即时通讯

CodeDay#5 启动报名| 带你深入探索支付宝终端动态化实践

蚂蚁集团移动开发平台 mPaaS

小程序 活动专区 mPaaS 技术盘点

浪潮云防勒索一站式解决方案,让勒索病毒“上云”无门

浪潮云

产品推荐

DevSecOps:把合规融入DevOps

啸天

DevOps 安全 法律 DevSecOps 应用安全

关于“存在”的一点思考

石君

28天写作 量子 世界为何存在

华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型

华为云开发者社区

数据库

第一篇文章

Nemo

重学JS | 异步编程 Promise

梁龙先森

前端 编程语言 28天写作

致ClickHouse用户的一封信

DorisDB

数据库 大数据 数据分析 OLAP Clickhouse

用技术的方式,在UI设计稿中设置随机码,保证高清

行者AI

Python

anyRTC-语音连麦demo上线

anyRTC开发者

音视频 WebRTC 直播 实时语音 语音聊天室

链上智能合约APP开发|链上智能合约系统软件开发

开發I852946OIIO

系统开发

CSS11 - 浮动

桃夭十一里

html/css

Python 使用SQLServer

Tango

日更挑战

云原生动态周报 |华为云主导抗疫药物筛选科研成果"神农项目"登上国际化学顶刊封面

华为云原生团队

GitHub 疫情 云原生 Prometheus 华为云

CSS12 - 清除浮动

桃夭十一里

html/css

前端代码书写规范

桃夭十一里

前端 html/css

再谈跨界 互联网+的建筑行业

张老蔫

28天写作

专科出身Java开发,2年进入苏宁,5年跳槽阿里,我晋升这么快的秘诀是什么?

Java架构追梦

Java 阿里巴巴 面试 架构师 成长路线

Mobileye的创新科技与方案将助力自动驾驶汽车畅行世界、惠及大众

intel001

SpringCloud 从入门到精通 08--- Eureka集群

Felix

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

在敏捷项目中实施自动化测试之我见-InfoQ