UDN-企业互联网技术人气社区

板块导航

浏览  : 1254
回复  : 2

[翻译] DevOps案例之Etsy—测试分组

[复制链接]
jingyun1的头像 楼主
原则
    Fail fastFast, Reliable Tests
问题
每天超过25次部署,每次部署都需要执行测试
需求
部署耗时需要保持在20分钟内,长时间的部署过程会导致部署队列拥堵,降低效率,也会打击部署积极性
实践
主干测试(trunk tests):部署之前必须执行的测试,用于测试Etsy的产品功能,Etsy拥有7000个主干测试(持续增长中,并非都是单元测试,并非所有测试都要在部署前执行)
将重量级测试套件根据相似性拆分为多个轻量级的测试套件
5分钟、11分钟、20分钟
如果主干测试失败,部署将会暂停,工程师一般将会在5分钟内解决该问题,然后重新执行测试,通过之后本次部署成功结束,考虑失败的情况,自动化主干测试必须在11分钟内完成,才有足够的剩余时间重新测试,以免部署超过20分钟太多
测试执行策略
从前到后顺序执行完所有的主干测试(大于7000)需要耗时超过30分钟,如何实现11分钟:
1. 对测试进行分组,选择性执行2. 将测试分发到10台Jenkins构建服务器上并行执行
测试的执行场景
  • 每次提交时执行
  • 点击测试按钮时执行
  • 点击发布按钮时执行
测试分类单元测试(Unit Tests)
单元测试只针对一个类,无需与数据库、文件或其他基础设施的交互。Etsy拥有超过4500个单元测试,且必须在部署前执行,耗时1分钟
集成测试(Integration Tests)
集成测试需要与基础设施交互,如数据库、消息队列、缓存服务等,Etsy使用PHPUnit连接DBUnit(模拟数据库服务),Etsy的PHPUnit扩展
在Etsy的测试套件中,集成测试最慢,如果顺序执行需要耗时20分钟,并行执行则只需耗时8分钟
网络测试(Network Tests)
部分集成测试也需要访问网络资源,如使用第三方服务发送邮件等,Etsy建议尽量避免需要依赖网络访问的测试
冒烟测试(Smoke Tests)
冒烟测试是系统级别的测试,测试目标是部署完成系统,通过PHPUnit执行Curl命令,并且使用断言比对返回结果的header和其他数据
功能测试(Functional Tests)
类似冒烟测试,基于GUI驱动的端到端功能测试的测试目标也是部署在测试环境的系统,Etsy使用Cucumber和Selenium进行功能测试,基于Xvfb的虚拟桌面环境驱动Firefox进行测试
功能测试脚本需要在开发和维护上投入较大工作量,在Etsy,端到端的功能测试只用于最重要的关键功能。在单元测试、集成测试、冒烟测试之后,功能测试只作为最终的验证
编者注:功能测试对重要功能的验证是很有意义的,从用户操作的角度进行验证。比如Dropbox有一次部署将用户验证功能关闭了,导致极大的安全问题,类似这样的关键功能应该增加最后一道门槛。
不稳定测试(Intermittent Tests)
不稳定测试:偶尔会失败的测试,但是对于开发很有帮助,此类测试不能纳入主干测试,因此Etsy建立了PHPUnit中的flaky组,当开发者认为测试不够稳定时,可以将其划分到flaky组中,并在其他场景下使用
零容忍对待不稳定测试
慢测试(Slow Tests)
符合80/20原则,少数测试占用了主要的测试执行时间,工程师会将耗时长的测试划分到slow组,失败和取消最慢的20个慢测试,测试套件执行时间会有明显提升,此类测试依然会在某些场景下执行,但是主干测试中不进行
睡眠测试和时间测试(Sleep Tests and Time Tests)
好的测试不会使用sleep(),也不会依赖于系统时间。 追求测试覆盖率会导致出现低质量的测试用例,尤其是维护历史系统时,Etsy允许这类测试存在,但是不在部署前执行这些测试
工具
  • PHPUnit,使用其他@group的注释功能,从逻辑上将测试划分为多个子集。
  • Jenkins,使用XUnit插件,选择性执行测试
    <groups>   <include>     <group>dbunit</group>   </include>   <exclude>     <group>database</group>     <group>network</group>     <group>flaky</group>     <group>sleep</group>     <group>slow</group>   </exclude> </groups>
  • 解释:PHPUnit任务只会执行dbunit,不会执行database,network, flaky, sleep,slow;所有单元测试必须被执行。

总结
  • 识别并分组执行测试
  • 并行执行测试
  • 只保留对部署对重要的测试
文化
Etsy的部署由工程师管理,而非运维或者其他发布管理团队 理由:你写的代码,你自己发布到线上。   
授权工程师对测试用例进行分类
参考
2011年4月


相关帖子

发表于 2015-11-15 10:43:54 | 显示全部楼层
使用道具 举报

回复

发表于 2015-11-24 21:11:33 | 显示全部楼层
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部