讀《Top benefits of continuous integration》有感

看到一片文章《Top benefits of continuous integration》,這張圖畫的很棒。將整個CI流程各階段,列舉出來了。git

做者在文章裏面介紹了CI和TDD,以及採用CI的詳細好處。尤爲是採用CI的好處,做者講解的很到位,看得出是實戰得來的,而不是籠統的泛泛而談。程序員

 

對個人啓發有兩點:一,CI有哪些好處,實際中如何使用好;二,基於轉盤圖梳理一下各階段用到的工具。github

image

CI、TDD及其優勢

CI(Continuous Integration),即持續集成,是一種軟件開發實踐,即團隊開發成員常常集成他們的工做,經過每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。web

TDD(Test Driven Development),即測試驅動開發,是敏捷開發中的一項核心實踐和技術。TDD的原理是在開發功能代碼以前,先編寫單元測試用例代碼,測試代碼肯定須要編寫什麼產品代碼。api

TDD的基本思路就是經過測試來推進整個開發的進行,但測試驅動開發並不僅是單純的測試工做,而是把需求分析,設計,質量控制量化的過程。 安全

TDD的重要目的不只僅是測試軟件,測試工做保證代碼質量僅僅是其中一部分,並且是在開發過程當中幫助客戶和程序員去除模棱兩可的需求。TDD首先考慮使用需求(對象、功能、過程、接口等),主要是編寫測試用例框架對功能的過程和接口進行設計,而測試框架能夠持續進行驗證。 app

CI能快速發現問題、給每一個開發者對應的響應而且TDD能快速的評估工做質量。基於TDD,能夠開發測試用例,而後開發功能知道經過這些測試用例。 框架

 

敏捷開發能讓開發者快速得到修改的反饋,而且可以更快的適應需求變動;可以讓開發者及時發現引入的缺陷。 less

下面是從文章中摘錄的使用CI帶來的好處:ide

及早發現集成問題,在每一處修改之時及時發現解決問題,避免在最後交付出現混亂。

  • 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世界中使用很頻繁。

image

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經常使用的自動化測試有UIAutomatorCTSMonkey Test等。

Publish Reports

在進行必要的測試以後,生成測試報告,輸出測試結果,採用郵件、網頁、Excel等根據須要而定。

Production Deployment

最後就是生產部署,在實際環境中使用。

相關文章
相關標籤/搜索