微信号:ceshibaixiaosheng

介绍:软件测试行业每日一问、每日一答、每日一文.力争做有态度、有深度的行业领先媒体.在这里可以获得你不知道的测试行业干货.在这里你不仅能学到行业技术,更能零距离了解大师所想.加入我们,明天你必将成为大师.

收藏!百度91持续集成总结之二

2016-04-27 18:00 测试百晓生
测试百晓生
ceshibaixiaosheng
测试圈懂的最多的人,跟着百晓生一起学测试,你定会有收获。我就在你的口袋,你——有问题难得倒我吗?
PS:一颗安利,测试百晓生种子用户招募中,只要在每日一问中贴出你最想问的问题,就可以收到加入邀请了。至于有什么好处呢?

  ●   每天第一时间获取最新文章
  ●  大咖分享交流
  ●  线下聚会交流
  ●  资源和人脉共享
  ●  提出建议采纳后会有红包的呦

接上一篇《泪崩!百度91持续集成总结之一 》 (回复"持续集成",可马上回看)
持续集成做什么?
从行为上分类,持续集成其实一共就干三类事:

√ 收集 √ 构建 √ 测试

收集
         所谓收集即收集产品的源码. 这要求研发团队至少应该基于版本控制系统进行代码管理,而且尽可能的使用主干开发的模式,这有助于简化持续集成的实施成本,仅需要基于一个代码分支进行流程的实施和维护, 如果代码分支过多, 就要进行多个分支的管理,同时多个分支的代码再整合进主干的时候,也会增加集成的难度和风险.

        在研发的过程中也要引导和鼓励研发工程师进行短而小的频繁代码提交,例如每次提交的代码不应超过200行, 一旦提交的代码导致CI的失败, 从200行代码中找到问题根源的时间和成本,显然比从2000行代码中去找到该问题的成本和时间更低.

        在提交代码的方法上,笔者推荐在研发过程中采用Check-in Dance(六步提交法),请见下图:


  1. Sync主干上最新的代码到本地
  2. 进行编码开发
  3. 执行单元测试
  4. Sync最新主干源码(避免在进行2的时候,有其他成员提交了源码)
  5. 再执行单元测试
  6. 当5通过了之后commit代码到主干
  7. CI进行自动化的流程验证

构建
         所谓构建就是编译源码生成可执行、部署的工程产物.一些比较成熟的团队,在构建的实践方面可能有以下这些行为:

1. 静态检查
    a) 检测代码风格是否符合团队和企业的约定
    b) 检测代码是否有一些典型的逻辑问题,如类型转换错误,或在一个可能为Null的对象上调用任何方法.

2.编译

3.打包
    a)例如把编译的产物打成exe,或者war,或者rpm

4.工件管理

5.部署

6.构建产物存档
    a) 例如把编译后的产物存档,便于后续的问题回溯和追查

          可喜的事情是,目前在构建的整个大流程上,开源社区已经有足够丰富的工具和资料来支持我们把这件事情做好.

        例如静态检测可以使用checkstyle来检测代码风格是否符合约定, findbugs可以用来在编译前就检索到一定的典型逻辑问题.
        用于编译的开源工具就更多了,例如ant(笔者的团队目前使用的就是ant), maven, gradle, msbuild之类的, 对于一些工具, 流程控制上更为灵活,但需要自己编码实现的内容就更多,例如ant, 对于一些工具,在工程约定上更为严谨,但需要自己编码实现的内容就更少,例如maven.团队可以根据自己目前的项目结构选用合适的工具进行编译, 但无论如何,都要抛弃人工的基于IDE的编译方式, 通过相应的编译工具编写编译脚本, 通过自动化的方式来进行编译,一来可以减少失误,二来可以减少大量的人力重复劳动.
        在部署上笔者尤为推荐使用虚拟化的方式来构建开发和测试环境.这可以使得开发和测试环境高度统一,避免出现在研发的环境可以跑通测试,在测试环境由于种种配置,依赖,中间件的不同导致的用例执行失败.虚拟化除了解决这些问题之外,还可以极大提升服务器的利用率,节省企业成本.在使用虚拟化技术构建了基础环境之后,还应当使用一些部署工具或自研脚本完成应用的部署过程.
        例如在91的实践中, 基础环境的构建使用的是docker, 在docker的镜像中预先安装好了ng与php-fpm和sshpass, 通过docker的volume把源代码目录挂载到外部, 在部署的时候,只需要从svn上sync最新的代码到本地,而后通过rsync同步到相应的docker挂载目录即可完成部署. 对于基础环境的构建,由开发团队维护dockerfile, 当基础环境的依赖,中间件,或者配置发生变更的时候, 只需要使用dockerfile重新构建基础环境即可. 同时测试和开发团队使用同一份docker file来构建基础环境, 就能保证测试环境和开发环境的高度统一,出现问题的时候,可以很轻易的在开发环境复现.
测试
         在完成了代码的收集和自动化的构建及部署之后,还应当下大工夫的地方就在于测试上,开发团队和测试团队应该通力合作,从不同的层面对应用进行自动化测试用例的补充,使得团队可以避免大量的重复劳动力在回归测试(regression test)上,同时通过自动化测试的方式,加快测试的反馈.
例如使用经典的测试分层的方法来对测试进行分层.请见下图:
        对于测试的分层和策略,建议参考笔者所在翻译小组的另一篇译文(infoq – 一种有效的测试策略)
 
        在91的实践中, 我们在测试上的策略也是类似上图中的分层方式,大致可以分为三层:

1).2000条左右的单元测试用例
2).100条左右的HTTP请求测试(基于restful api)
3).30条左右的UI验收测试用例(基于cucumber与webdriver)
        其中2000条单元测试用例需要执行约1分30秒,对于单元测试用例而言,这些用例执行的速度有些慢, 主要的原因是由于DAO层的测试是真实连接数据库(DAO去真实链接数据库应该是集成测试做的事儿,而不是单元测试), 导致测试用例的执行速度大大降低,后续在phpunit中mock掉了数据库的链接之后, 2000条用例的执行时间仅有20秒左右.性能提升了4倍

        其中100条的HTTP请求测试也是cucumber的验收测试用例,只是测试团队绕过了UI,通过http的restful api来验证主要的业务场景和数据可以在正常和异常数据下可以正确走通,这100条用例执行时间约为2分钟10秒

        其中30条UI的验收测试用例耗时最长,需要大约5分30秒-6分才能执行完.主要是验证项目中最重要的模块,例如扣款,加款,充值等功能可以正确工作.在后续经过调研之后,我们放弃了有UI渲染的IEDriver与ChromeDrivere,而是采用了headless的phantomjsDriver,在几乎不需要修改代码的情况下,让测试时间从5分30秒到6分左右,缩短到了大约4分钟,提升了约30%.
 
         在91真实的工程实践中, 研发人员提交一次代码后,Jenkins会轮询svn,而后sync最新的代码到docker容器挂载的目录中,然后通过sshpass开始执行单元测试用例,当单元测试用例通过了之后,则会调用cucumber的UI主流程测试用例,接着最后执行cucumber的http测试用例,在约5-6分钟之后,研发人员就可以得知本次代码提交的质量如何.

        对于完善的持续集成机制,最后的效果应该如下图:
        每次代码提交之后的编译,测试,部署,发布,都是完全自动化的,开发团队可以专心致力于需求的实现和各类单元、集成测试的实现,测试团队专心致力于新功能的测试用例设计和部分验收自动化测试用例开发,同时每次提交都可以交付一份可用的工程产物.
 
        具体的工作流程如下图:
总结
        你学会了吗?持续集成分三步走: 先收集、 再构建 、最后测试,保证每一次的代码提交都能没有问题,实现可靠的持续交付!
推荐公众号:

公众号:robotframework
robotframework自动化测试框架的配置指南、常见问题等。

公众号:云层天咨
性能测试大牛——云层 的小圈子
推荐阅读:
------------------------------------
回复【友谊小船】,可立刻查看
说翻就翻!测试和开发的友谊小船
回复【自动化】,可立刻查看
《干货!99%的人都不懂的自动化测试》
回复【持续集成】,可立刻查看
《泪崩!百度91持续集成总结之一 》
------------------------------------

“最自私的行为是无私”。当你将有价值的信息,传递给身边的朋友时,你在他们的心里会变得更有价值。点击右上角“…”按钮就可以分享到“朋友圈”,真的不转一下吗?求你了。


 
测试百晓生
每日一文,篇篇精彩
每日一问,句句原创
投稿邮箱:csbaixiaosheng@163.com
微信号:ceshibaixiaosheng

点击下方“阅读原文”,挑战题库!
↓↓↓
 
测试百晓生 更多文章 道长:软件测试从入门到放弃(1) 干货!99%的人都不懂的自动化测试 关键字驱动的原理和实现 泪崩!百度91持续集成总结之一 惊!测试妹子晚上居然都在做......!!!
猜您喜欢 传统行业,如何快速搭建大数据团队? Python的四个挑战者:Swift、 Go、 Julia、 R 10个你应该学习使用的PHP特性 春节红利金矿,你挖了吗? 史上最形象Linux 系统结构以及命令图(开通头条号DevOps24h)