看到一片文章《Top benefits of continuous integration》,这张图画的很棒。将整个CI流程各阶段,列举出来了。git
做者在文章里面介绍了CI和TDD,以及采用CI的详细好处。尤为是采用CI的好处,做者讲解的很到位,看得出是实战得来的,而不是笼统的泛泛而谈。程序员
对个人启发有两点:一,CI有哪些好处,实际中如何使用好;二,基于转盘图梳理一下各阶段用到的工具。github
CI(Continuous Integration),即持续集成,是一种软件开发实践,即团队开发成员常常集成他们的工做,经过每一个成员天天至少集成一次,也就意味着天天可能会发生屡次集成。每次集成都经过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。web
TDD(Test Driven Development),即测试驱动开发,是敏捷开发中的一项核心实践和技术。TDD的原理是在开发功能代码以前,先编写单元测试用例代码,测试代码肯定须要编写什么产品代码。api
TDD的基本思路就是经过测试来推进整个开发的进行,但测试驱动开发并不仅是单纯的测试工做,而是把需求分析,设计,质量控制量化的过程。 安全
TDD的重要目的不只仅是测试软件,测试工做保证代码质量仅仅是其中一部分,并且是在开发过程当中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架能够持续进行验证。 app
CI能快速发现问题、给每一个开发者对应的响应而且TDD能快速的评估工做质量。基于TDD,能够开发测试用例,而后开发功能知道经过这些测试用例。 框架
敏捷开发能让开发者快速得到修改的反馈,而且可以更快的适应需求变动;可以让开发者及时发现引入的缺陷。 less
下面是从文章中摘录的使用CI带来的好处:ide
及早发现集成问题,在每一处修改之时及时发现解决问题,避免在最后交付出现混乱。
有了CI质量保证,能够持续的提交代码,更高效的协同工做。
CI带来的是持续的集成反馈,更有效的看到工做一步一步推动。
CI还能促使工程师将工做模块化,下降不一样模块之间的耦合程度。
及时看到本地修改对整个系统带来的影响。
因为采用小步快跑的方法,每一步都有质量保证。避免了组后阶段长时间紧张集成工做。同时因为问题被及时发现,也避免了花不少时间去进行调试,节省更多使用用于开发,提升代码质量。好比,天天一个DailyBuild,进行基本的SmokeTest,这样子基本的功能就获得保证,有Regression能够及时进行回溯。
自动化编译、测试,将整个开发流程自动化,保证集成质量。
|
固然这也对开发环境提出了要求:
这些一是对工做环境性能提出高要求;二是对流程设计高可靠性;三是CI工具易用、易扩展、稳健。
CI是一种理念,要落实离不开好的工具。
版本控制系统是SCM的一部分,在Wikipedia有很好的解释Version Control。根据工具特性,能够分为Local only、Client-server、Distributed三种类型。
比较经常使用的有Git、SVN、CVS、ClearCase。Git在Linux、Android世界中使用很频繁。
Git相关信息能够再次参考:https://git-scm.com/。还有一些基于Git的第三方托管平台github.com、sourceforge.net。
Docker是程序运行的容器(Linux container),实现了应用级别的隔离,多个容器运行时互不影响,安全而稳定。Docker Build是基于Docker技术,快速部署编译工做,安全运行。
Docker提供了虚拟化方式,给开发团队创建一套能够复用的开发环境。
静态代码分析是指在不实际运行代码的方式下,经过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否知足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以可以发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减小误报增长效率。详情参考:程序静态分析。
Klocwork是一个很是强大的静态分析工具,详情参考Klocwork。其余的工具还包括PC-Lint(用于检查C/C++源代码,找出错误、缺陷等问题的强大静态分析工具)、cppcheck(primarily detects the types of bugs that the compilers normally do not detect)等。
单元测试是指对软件中的最小可测单元进行检查和验证。单元测试是在软件开发过程当中要进行的最低级别的测试活动,软件的独立单元将在与程序的其余部分相隔离的状况下进行测试。
经常使用的单元测试工具备GTest(Google的开源C++单元测试框架Google Test)、gmock(C++ Mock 框架)、cpptest(C++ 的单元测试框架)、JUnit(Java语言的单元测试框架)、C++Test(单元测试和静态分析工具,自动测试C和C++类别、功能或组件,而无需编写单个测试实例、测试驱动程序或桩调用)等。
代码覆盖率分析是度量程序中源代码被测试的比例和程度,度量方式有函数覆盖、语句覆盖、判断覆盖、条件覆盖和路径覆盖。
经常使用的工具备gcov(配合gcc编译-ftest-coverage使用)、Coverity等。
Docker提供了一种相似git的Container版本化的机制,容许你对你建立过的容器进行版本管理,依靠这种机制,你还能够下载别人建立的Container,甚至像git那样进行合并。
在进行了静态代码检测、单元测试、覆盖率测试以后,准备将系统部署到测试环境中进行功能测试、系统测试。
自动化测试用例常用tcl、Python等语言编写,这些用例大多经过一些触发(按键、触摸等),而后分析输出(解析对比log等),来和预期进行对比。经常使用工具备TestComplete(测试具备系统化、自动化和结构化特性,支持。NET,Java,Visual C++, Visual Basic, Delphi, C++Builder 和web应用程序)等。
Android经常使用的自动化测试有UIAutomator、CTS、Monkey Test等。
在进行必要的测试以后,生成测试报告,输出测试结果,采用邮件、网页、Excel等根据须要而定。
最后就是生产部署,在实际环境中使用。