程式專案建構工具以及測試相關資料整理
Apache Ant
用XML標籤去定義專案內要提供哪些”目標”,哪些”任務”需要被執行。描述自動化編譯的事項,含有XML、DataType、Properties、Task等。早前的自動化編譯工具為Ant與Maven。Gradle 是後起之秀,已經越來越多 Open Source 專案由Maven轉向Gradle(更早之前是由 Ant 轉向 Maven)。
參考資料來源:
http://www.codedata.com.tw/java/understanding-gradle-1-ant/
Apache Maven
為Java自動化專案建構工具,自動管理相依性功能帶來極大的便利,也支援C#、Ruby、Scala。被創造的動機有二個原因:Java 專案的標準化、Java 專案函式庫管理的問題。提供專案『樣版』的機制,它會建立好專案目錄結構、範例檔與 Maven 設定檔 pom.xml。super-pom.xml 和pom.xml決定了該專案的設定、編譯行為。Convention Over Configuration觀念。函式庫會由 Maven 透過 repostiory server 下載,並 cache 在使用者目錄下的 .m2 目錄。
參考資料來源:
http://www.codedata.com.tw/java/understanding-gradle-2-maven/
https://zh.wikipedia.org/wiki/Apache_Maven
Gradle
以Apache Ant和Apache Maven概念的專案自動化建構工具,具有自動管理相依性、編譯、測試、檢查程式碼、產生文件、清理或壓縮、上傳、發佈、重新啟動伺服器到送出電子郵件。使用Groovy的特定領域語言(script)設定專案,Maven Repositories,而不是XML格式。目前支援Java、Groovy、Scala。為Android Studio 內建的封裝布署工具。
參考資料來源:
https://zh.wikipedia.org/wiki/Gradle
https://ithelp.ithome.com.tw/articles/10129873
Nexus Repository
作為maven倉庫的私有服務器,有以下三項特點:
1.第三方Jar包可以放在nexus上,項目可以直接通過Url和路徑配置直接引用.方便進行統一管理。
2.同時有多個項目在開發的時候,一些共用基礎模塊可以單獨抽取到nexus上,需要用的項目直接從nexus上拉取就行(基礎模塊的實現,維護和部署可以交給專門的人員,其他項目不用關心代碼實現,這樣也可以達到保證核心代碼不洩露)。
3.一些封閉開發的過程中開發機是不能上公網的,所以連接central repository和下載jar就比較麻煩,這時就可以用nexus搭建起來一個介於公網和局域網之間的橋樑。
參考資料來源:
https://www.sonatype.com/nexus-repository-sonatype
https://blog.csdn.net/l2show/article/details/48653949
http://www.open-open.com/lib/view/open1452002317558.html
https://read01.com/ADG36o.html
https://jimwayne.blogspot.tw/2016/01/maven-repository-servernexus.html
Sbt
Simple Build Tool的簡稱,類似於Maven,是Scala界的Maven,支援scala與java語言的專案管理,支持增量編譯,內置scala console。
- 使用Scala作為DSL來定義build文件(one language rules them all)
- 通過觸發執行(trigger execution)特性支持持續的編譯與測試
- 增量編譯;^[SBT的增量編譯支持因為如此優秀,已經剝離為Zinc,可被Eclipse, Maven,Gradle等使用
- 可以混合構建Java和Scala項目
- 並行的任務執行
- 可以重用Maven或者ivy的repository進行依賴管理
參考資料來源:
https://github.com/CSUG/real_world_scala/blob/master/02_sbt.markdown
https://www.scala-sbt.org/index.html
scons
python語言編寫的下一代的程序建造工具。功能上類似於make、autoconf與automake工具。具有以下優點:
- 使用Python 腳本做為配置文件
- 對於C,C++ 和Fortran, 內建支持可靠自動依賴分析. 不用像make 工具那樣需要執行"make depends"和"make clean"就可以獲得所有的依賴關係。
- 內建支持C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及Tex/Latex。用戶還可以根據自己的需要進行擴展以獲得對需要編程語言的支持。
- 支持make -j 風格的並行建造。相比make -j, SCons 可以同時運行N 個工作,而不用擔心代碼的層次結構。
- 使用Autoconf 風格查找頭文件,函數庫,函數和類型定義。
- 良好的誇平台性。SCons 可以運行在Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和OS/2 上
參考資料來源:
https://www.ibm.com/developerworks/cn/linux/l-cn-scons/index.html
Cmake
CMake是個一個開源的跨平台自動化建構系統,用來管理軟體建置的程式,並不相依於某特定編譯器。並可支援多層目錄、多個應用程式與多個函式庫。 它用組態檔控制建構過程(build process)的方式和Unix的make相似,只是CMake的組態檔取名為CMakeLists.txt。CMake並不直接建構出最終的軟體,而是產生標準的建構檔(如Unix的Makefile或Windows Visual C++的projects/workspaces),然後再依一般的建構方式使用。這使得熟悉某個整合開發環境(IDE)的開發者可以用標準的方式建構他的軟體,這種可以使用各平台的原生建構系統的能力是CMake和SCons等其他類似系統的區別之處。 CMake設定檔(CMakeLists.txt)可設定原始碼或目標程式庫的路徑、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake支援in-place建構(二進檔和原始碼在同一個目錄樹中)和out-of-place建構(二進檔在別的目錄裡),因此可以很容易從同一個原始碼目錄樹中建構出多個二進檔。CMake也支援靜態與動態程式庫的建構。
參考資料來源:
https://zh.wikipedia.org/wiki/CMake
Grunt
它是以 Node.js 為基礎所開發的命令列工具,在經過適當的設定之後,可以幫助程式開發者將一些重複性的工作自動化,減輕開發者與開發團隊的負擔。
Grunt可以處理的事情很多,例如精簡 CSS 程式或網頁的大小、編譯 CoffeeScript、unit test、linting 等,舉凡一般性的重複動作多半都可以使用這個工具來處理。
Grunt 背後有一個很大的生態系統(ecosystem),包含了大量的 plugins,使用者可以藉由這些 plugins 將自己的工作自動化,而使用者也可以很容易的把自己開發的 plugin 上傳到 npm 上面分享給其他人使用。
參考資料來源:
https://blog.gtwang.org/web-development/grunt-javascript-task-runner/
Spock
應用於java或groovy的單元測試框架。測試代碼使用以groovy語言擴展而成的規範說明語言(specification language)。透過junit runner調用測試,兼容絕大部分junit的運行場景(ide,構建工具,持續整合等)。框架的設計思路參考了JUnit,jMock,RSpec,Groovy,Scala,Vulcans
參考資料來源:
單元測試Unit Testing
單元測試(又稱模塊測試, Unit Testing)是針對程序模塊(軟體設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對於面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。
單元測試的幾個典型場景:
- 開發前寫單元測試,通過測試描述需求,由測試驅動開發。
- 在開發過程中及時得到反饋,提前發現問題。
- 應用於自動化構建或持續集成流程,對每次代碼修改做回歸測試。
- 作為重構的基礎,驗證重構是否可靠。
無論是哪種單元測試框架,最後的單元測試代碼量也比業務代碼只多不少,若要維持比較高的單元測試覆蓋率,要有三倍於業務代碼的單元測試代碼。造成單測代碼難以閱讀、維護不易。寫單元測試的難易程度跟代碼的質量關係最大,並且是決定性的。項目里無論用了哪個測試框架都不能解決代碼本身難以測試的問題。
參考資料來源:
BDD
行為驅動開發是一種敏捷軟體開發的技術,它鼓勵軟體項目中的開發者、QA和非技術人員或商業參與者之間的協作。BDD最初是由Dan North在2003年命名,它包括驗收測試和客戶測試驅動等的極限編程的實踐,作為對測試驅動開發的回應。
Groovy
這門動態語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平台的腳本語言使用。Groovy的語法與Java非常相似,以至於多數的Java代碼也是正確的Groovy代碼。Groovy代碼動態的被編譯器轉換成Java字節碼。由於其運行在JVM上的特性,Groovy可以使用其他Java語言編寫的庫。groovy是一門比較輕量,學習門檻也比較低的語言。
specification language
如果接觸過不同語言類型的開源項目的話,就會發現有些項目中找不到測試目錄(test),取而代之的是一個叫「spec」的目錄,比如用ruby寫的項目gitlab。這裡的spec實際是specification的縮寫,它的背後是一種近些年來開始流行起來的編程思想:BDD(Behavior-driven development)。
參考資料來源: