看到一片文章《Top benefits of continuous integration》,这张图画的很棒。将整个CI流程各阶段,列举出来了。

作者在文章里面介绍了CI和TDD,以及采用CI的详细好处。尤其是采用CI的好处,作者讲解的很到位,看得出是实战得来的,而不是笼统的泛泛而谈。

对我的启发有两点:一,CI有哪些好处,实际中如何使用好;二,基于转盘图梳理一下各阶段用到的工具。

CI、TDD及其优点

CI(Continuous Integration),即持续集成,是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

TDD(Test Driven Development),即测试驱动开发,是敏捷开发中的一项核心实践和技术。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。

TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。

TDD的重要目的不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,而且是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。

CI能快速发现问题、给每个开发者对应的响应并且TDD能快速的评估工作质量。基于TDD,可以开发测试用例,然后开发功能知道通过这些测试用例。

敏捷开发能让开发者快速获得修改的反馈,并且能够更快的适应需求变更;能够让开发者及时发现引入的缺陷。

下面是从文章中摘录的使用CI带来的好处:

及早发现集成问题,在每一处修改之时及时发现解决问题,避免在最后交付出现混乱。

  • Prevent integration problems
  • Integration bugs are detected early and are easy to track down due to small change sets. This saves both time and money over the lifespan of a project
  • Avoids last-minute chaos at release dates, when everyone tries to check in their slightly incompatible versions

有了CI质量保证,可以持续的提交代码,更高效的协同工作。

  • Committing code frequently
  • Categorizing developer tests
  • Using a dedicated integration build machine

CI带来的是持续的集成反馈,更有效的看到工作一步一步推进。

  • Using continuous feedback mechanisms
  • Staging builds
  • When unit tests fail or a bug emerges, if developers need to revert the codebase to a bug-free state without debugging, only a small number of changes are lost (because integration happens frequently)
  • Constant availability of a “current” build for testing, demo, or release purposes

CI还能促使工程师将工作模块化,降低不同模块之间的耦合程度。

  • Frequent code check-in pushes developers to create modular, less complex code
  • Enforces discipline of frequent automated testing

及时看到本地修改对整个系统带来的影响。

  • Immediate feedback on system-wide impact of local changes
  • Metrics generated from automated testing and CI (such as metrics for code coverage, code complexity, and features complete) focus developers on developing functional, quality code, and help develop momentum in a team
  • Separate software builds from software deployments

由于采用小步快跑的方法,每一步都有质量保证。避免了组后阶段长时间紧张集成工作。同时由于问题被及时发现,也避免了花很多时间去进行调试,节省更多使用用于开发,提高代码质量。比如,每天一个DailyBuild,进行基本的SmokeTest,这样子基本的功能就得到保证,有Regression可以及时进行回溯。

  • Say goodbye to long and tense integrations
  • Increase visibility which enables greater communication
  • Spend less time debugging and more time adding features
  • Proceed in the confidence you’re building on a solid foundation
  • Reduce integration problems allowing you to deliver software more rapidly

自动化编译、测试,将整个开发流程自动化,保证集成质量。

  • Automate the build
  • Make your build self-testing
  • Automate deployment
  • Continuous Integration is quality assurance

当然这也对开发环境提出了要求:

  • Build系统要足够快,不然敏捷也无从谈起。如果一次Commit要花两三个小时才能看到结果,那么一个工作日验证不了几次。
  • SmokeTest要足够健壮,保证测试的可靠性。
  • 尽量缩短从提交一个Commit到拿到最终的Report周期,同时要保证Report可靠性。

这些一是对工作环境性能提出高要求;二是对流程设计高可靠性;三是CI工具易用、易扩展、稳健。

CI中用到的工具

CI是一种理念,要落实离不开好的工具。

Version Control System

版本控制系统是SCM的一部分,在Wikipedia有很好的解释Version Control。根据工具特性,可以分为Local only、Client-server、Distributed三种类型。

比较常用的有Git、SVN、CVS、ClearCase。Git在Linux、Android世界中使用很频繁。

Git相关信息可以再次参考:https://git-scm.com/。还有一些基于Git的第三方托管平台github.comsourceforge.net

Docker Build

Docker是程序运行的容器(Linux container),实现了应用级别的隔离,多个容器运行时互不影响,安全而稳定。Docker Build是基于Docker技术,快速部署编译工作,安全运行。

Docker提供了虚拟化方式,给开发团队建立一套可以复用的开发环境。

Static Code Analysis

静态代码分析是指在不实际运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。详情参考:程序静态分析

Klocwork是一个非常强大的静态分析工具,详情参考Klocwork。其他的工具还包括PC-Lint(用于检查C/C++源代码,找出错误、缺陷等问题的强大静态分析工具)、cppcheck(primarily detects the types of bugs that the compilers normally do not detect)等。

Run Automated Unit Tests

单元测试是指对软件中的最小可测单元进行检查和验证。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

常用的单元测试工具有GTest(Google的开源C++单元测试框架Google Test)、gmock(C++ Mock 框架)、cpptest(C++ 的单元测试框架)、JUnit(Java语言的单元测试框架)、C++Test(单元测试和静态分析工具,自动测试C和C++类别、功能或组件,而无需编写单个测试实例、测试驱动程序或桩调用)等。

Code Coverage Analysis

代码覆盖率分析是度量程序中源代码被测试的比例和程度,度量方式有函数覆盖、语句覆盖、判断覆盖、条件覆盖和路径覆盖。

常用的工具有gcov(配合gcc编译-ftest-coverage使用)、Coverity等。

Docker Versioning

Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并。

Provision and Deploy to Test Environment

在进行了静态代码检测、单元测试、覆盖率测试之后,准备将系统部署到测试环境中进行功能测试、系统测试。

Run Automates Functional Tests

自动化测试用例经常使用tcl、Python等语言编写,这些用例大多通过一些触发(按键、触摸等),然后分析输出(解析对比log等),来和预期进行对比。常用工具有TestComplete(测试具有系统化、自动化和结构化特性,支持。NET,Java,Visual C++, Visual Basic, Delphi, C++Builder 和web应用程序)等。

Android常用的自动化测试有UIAutomator、CTS、Monkey Test等。

Publish Reports

在进行必要的测试之后,生成测试报告,输出测试结果,采用邮件、网页、Excel等根据需要而定。

Production Deployment

最后就是生产部署,在实际环境中使用。

读《Top benefits of continuous integration》有感的更多相关文章

  1. 读<走出软件作坊>有感

    1.成功的人都是在不可能完成任务的情况下完成的,成功的人也从来不会抱怨客观条件多么糟糕. 2.公司给你的资源,永远小于你做事需要的资源,这就是现实,就这么多人,就这样的素质,必须在现状中想出做事的办法 ...

  2. 为什么DIY报价----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十二)[转]

    前段时间,写了一个开发.实施.服务费用计算三部曲. 水清则无鱼--走出软件作坊:三五个人十来条枪 如何成为开发正规军(八) 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九 ...

  3. 将服务费用DIY到底----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十)[转]

    前一段时间,讲了一系列开发经理.实施经理.服务经理的工具箱:开发经理的工具箱---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三) ,实施经理的工具箱--走出软件作坊:三五个人十来条枪 如何成 ...

  4. 《走出软件作坊》//TODO

    目录 简介 结束语 简介 作者吕建伟(@阿朱),研发管理专家,原京东技术学院院长,中国互联网技术联盟发起人,历任首席架构师.技术总监以及CTO等职位.目前已接受用友集团董事长王文京邀请,加入用友组建研 ...

  5. 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九)[转]

    上次咱们讲完了开发费用的计算,很多人在后面跟帖在那里算费用. 有人说:你把程序员都不当人,94天,一天都不休息啊. 我想答曰:94天,是工作时间.不算双休日在里面.也就是说,实际的开发周期长度是94+ ...

  6. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  7. 走出MFC子类化的迷宫

    走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW  MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...

  8. ofo走出校园观察:市场定位导致产品错位?

    Ofo和摩拜单车虽然同样都是做单车共享,但实际上两者在最初的市场定位是有明显的差异的,因此提供的产品方案也存在巨大的差异. 市场定位不同,导致产品方案的巨大差异 摩拜单车一开始就定位于开放市场,充分的 ...

  9. 对于家政020 APP平台如何走出资本寒冬?

    成都亿合科技小编了解到,随着O2O烧钱大战过去,网络上流传的一份O2O项目死亡名单上显示,近年来,汽车.社区.旅游.教育等16个领域的多个O2O项目关门大吉,仅外卖餐饮O2O项目倒闭的就有十几个.只有 ...

  10. 走出测试,走向CEO

    飞测说:大家好,我们又见面了,我是黑夜小怪.不巧,今晚加班回来路上,湿身了,淋了个落汤鸡,不过明天也许可以看海了,也就呵呵了,原本想回来后聊些技术的,现在突然想先聊聊我的一些想法,仅供交流. 走出测试 ...

随机推荐

  1. Python十讲 - 第二讲:变量和基础数据类型

    本讲主要内容 变量 字符串 数字和运算符 数据类型转换 2.1 变量 1. 变量是什么? 变量,是指把程序运行的中间结果临时的存在内存里,以便后续的代码调用,其值可以修改. 在python中,当变量被 ...

  2. Archlinux/Manjaro使用笔记-安装配置搜狗输入法步骤

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.安装qtwebkit-bin软件包解决qtwebkit无法编译安装问题 aurman -S qtwebkit-bin 二.安 ...

  3. 图的遍历(bfs+dfs)模板

    bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...

  4. JS性能优化 之 事件委托

    面试中2次被问到过这个知识点,实际开发中,应用事件委托也比较常见.JS中事件委托的实现主要依赖于 事件冒泡 .那什么是事件冒泡?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一 ...

  5. Linux 操作系统下为网卡配置ip

    Linux操作系统下为网卡配置ip by:授客 QQ:1033553122 1.   Linux单一网卡设置多IP的配置方法 在Linux下网卡接口逻辑名被称为eth0,eth1,eth2,..... ...

  6. Android根据图片Uri获取图片path绝对路径的几种方法【转】

    在Android 编程中经常会用到Uri转化为文件路径,如我们从相册选择图片上传至服务器,一般上传前需要对图片进行压缩,这时候就要用到图片的绝对路径. 下面对我开发中uri转path路径遇到的问题进行 ...

  7. Android WIFI的基本操作

    WIFI管理类 class WifiConnector { private ExecutorService executors; Handler mHandler; WifiManager wifiM ...

  8. 兼容多种模块规范(AMD,CMD,Node)的代码

    在JavaScript模块化开发中,为了让同一个模块可以运行在前后端,以及兼容多种模块规范(AMD,CMD,Node),类库开发者需要将类库代码包装在一个闭包内. AMD规范 AMD,即“异步模块定义 ...

  9. python自动化报告的输出

    1.设计简单的用例 2.设计用例 以TestBaiduLinks.py命名 # coding:utf-8 from selenium import webdriver import unittest ...

  10. Azure 标准与高级托管磁盘存储的相互转换

    托管磁盘提供两种存储选项:高级(基于 SSD)和标准(基于 HDD). 它允许基于性能需求在这两个选项之间轻松切换,并保障最短停机时间. 非托管磁盘不具备此功能. 但可以轻松转换为托管磁盘,以便在这两 ...