2015/6/21

使用 Android Studio 開發 Web 程式 - 測試

測試

這是「使用 Android Studio 開發 Web 程式」系列的最後一篇文章,接著前一篇偵錯的主題之後要進行的是測試。不是已經可以偵錯了? 偵錯就是在測試了啊? 還要研究什麼? 有這樣疑問的人可以先參考一下這一篇文章

研究的方向是希望能夠確認在 Android Studio 進行測試時,可以滿足下幾項測試上的需求:
  • 自動化
    不僅僅是在開發時能夠大幅減少測試這項工作的負擔,並且還要能夠把自動化延續到 CI 系統中,以便有效提昇整體的開發工作品質。
  • Code Coverage
    作為測試完成度的一項指標,藉以調整測試程式開發的策略、投入的成本及風險的控管。
  • Data Driven
    用來與測試的策略搭配以提昇 Code Coverage,並且可以將造成系統運作問題的資料保留下來,成為一個收集系統問題的機制,成為回歸測試的基準之一。

在 Android Studio 裡就已內建了對 JUnit 和 TestNG 的支援,所以只要按照這些 Framework 的規格寫好測試類別,並且把檔案存在對應 Module 的 src/test 目錄之下,IDE 就會自動識別出來。IDE 也有提供對應的功能來簡化測試的產生程序,相關的細節可以參考官網的 Creating TestsCreating Test Methods

有了測試的程式,接下來要確認是否能夠達成自動化的需求。首先,要啟動測試的話,透過 IDE 就可以輕易的達成,執行的細節可以參考官網的 Creating Run/Debug Configuration for TestsPerforming Tests 的說明文件。測試的結果會直接顯示在 IDE 的介面上,但要先確定「Show Statistics」的選項是否開啟,否則只會看到執行後的輸出結果。要如何開啟「Show Statistics」選項可以參考官網 Viewing and Exploring Test Results 的說明文件。

JUnit Configuration

由 Run/Debug Configuration 的設定畫面可以發現,和 Eclipse 相同,可以設定要執行測試的範圍。所以只要設定好適當的選項,即可在 IDE 中一鍵執行所有的測試來達成開發階段的測試自動化。與 CI 系統整合的部分,既然是 Gradle 的專案,當然是執行 test 或是有包含 test 的 Task 來達到目的,由相關的功能來看自動化的需求已經能夠滿足。

編寫程式碼的系列文章中有提到,IDE 的介面上就可以直接執行 Gradle 專案的 Task,和在 Terminal 下指令相同,都會產生 HTML 格式的測試報告在對應 Module 的 build/reports/tests 目錄下。但如果是在 Terminal 下指令則要自行用瀏覽器開啟測試報告的 HTML 檔,而使用 IDE 執行 Task 則可以在 IDE 中檢視測試的結果,並點選如下圖所示的「Open Gradle test report」圖示啟動並顯示測試報告的內容。

Open Gradle test report

而與測試有著密切關連的 Code Coverage 需求,由於 Android Studio 內建就有整合了 Code Coverage 的功能,所以只要是屬於測試類型的 Configuration 項目都可以使用「Run 'xxx' with Coverage」的功能,如果不是測試類型的 Configuration 項目在 Toolbar 上的圖示會被 Disable。相關的操作細節可以參考官網的 Running with CoverageViewing Code Coverage Results 的說明文件。

最後一項需求是 Data Driven,在 Android Studio 所支援的 JUnit 和 TestNG 都有提供特定的方法來達成目的。但在這裡有一個比較不一樣的選擇:Spock,對,就是那個尖耳朵、瓜呆頭的半 Vulcan 星人的名字。這是一個和 JUnit 相容的測試框架,也就是說可以無縫式地被整合在支援 JUnit 的 IDE 中,再說得白話一點就是可以在 Android Studio 裡使用 JUnit 的 Configuration 項目執行 Spock 的測試程式、產出測試報告、執行 Code Coverage 等。

為什麼為想要使用 Spock 來做為測試的框架?主要是長久以來軟體設計的生命週期裡,需求和程式之間都有一道明顯的鴻溝,原因是主流的程式語言還沒有進化到可以使用自然語言來表達,所以就需要靠程式撰寫人員來轉譯,把需求文件中的文字轉成可執行的程式碼。就算是導入 TDD 來協助開發,程式碼可以透過先寫好的測試程式來檢查是否符合需求,然而目前的測試程式也還都是相同的程式語言所構成的,需求裡描述的情境還是要再被轉一手。

轉換就會有出現落差的風險,但是 Spock 使用 BDD 的概念填補了需求文件和測試程式間的差距,讓測試案例可以不被大幅轉譯的情況下,在測試程式碼中以接近自然語言的語法來呈現(可惜是當然地使用英文的語法),使轉譯失真的風險有效地被降低。就 Spock 這項特色來說,可以讓文件和測試建立直接的關連並且用來驗證實作的結果,是相當具有吸引力的。當然,Spock 也可以使用 Data Driven 的方式來撰寫測試程式,而且能夠以更直覺的的式來建立測試時所需的資料。

Spock 的測試類別是以 Groovy 為基礎,要在原本是 Java 的 Module 上使用 Groovy 要先設定讓 Module 支援 Groovy,詳細的操作步驟可以參考官網的 Configuring Groovy-Based Frameworks 說明文件。並且在 build.gradle 裡應該包含以下示範的內容:


在使用 Data Driven 產出的測試報告時有一個要注意的細節,通常測試報告顯示的單位都是以測試項目為基準,但由於 Data Driven 是在一個單一的測試項目中重覆地輸入不同資料的方式來進行。在使用 Data Driven 產出的測試報告沒有辦法顯示每一個受測資料樣本的測試結果時,會造成閱讀報告時一個很大的困擾。因為使用的樣本數有可能成百上千組,當測試報告顯示某個項目測試失敗,但卻無法顯示造成失敗的資料樣本,甚至連失敗樣本組數都沒有的話,錯誤根本就無從定位,也沒有辦法被修正。

在 Spock 中提供了一個 @Unroll 的 Annotation,可以讓測試報告顯示的項目揭露到每一組資料樣本的層級。透過 Gradle 的 test Task 產出的報告檔就會根據這個 Annotation 調整內容,將原本以測試項目為單位改為以受測的樣本組為單位。

但在 Android Studio 裡會有一個小狀況是,如果只單獨執行一個測試類別,在 Statistics 裡可以檢視到每一組資料樣本的測試結果。當同時執行多個類別的測試,Statistics 檢視不到相同的結果。所以這時可能就不能使用 JUnit 的 Configuration 來執行測試,要改為 Gradle 的 Configuration,並且在瀏覽器中來檢視測試報告。

截至目前為止,研究的結果大致都符合原先設定的需求條件,所以可以暫時完全先放下 Eclipse,開開心心地使用 Android Studio 上工囉!



2015/5/20

使用 Android Studio 開發 Web 程式 - 偵錯

偵錯

這是「使用 Android Studio 開發 Web 程式」系列的第三篇文章,接續前一篇文章的內容,程式碼照著規格打完了,第一件事當然就是先執行看看成果,如果有出現不符預期的結果,就要進到了偵錯的程序以便修正程式碼。但如果負責的是 Server 端的元件,還要先準備好 Container 的環境、佈署編譯好的檔案、調整設定檔等等的程序。過往大部份人可能都會選擇 Tomcat 做為 Container,而現在有一個輕量化的選擇 Jetty。

2015/4/19

使用 Android Studio 開發 Web 程式 - 設定共用函式庫

設定共用函式庫

接續前一篇文章,雖然程式碼編寫已大致滿足工作上的需求,但是還有一項未來潛在性的需求要確認是否能夠達成。目前在開發設計上的主流是物件導向,物件導向的基本精神是提高重用性,也就是在設計時要讓程式碼儘可能地異中求同。所以在不斷地重構之下就會形成很多共用的 Class,共用的 Class 集合起來就會形成一個共用的 Package 來讓不同的程式碼專案來引用。

2015/3/18

使用 Android Studio 開發 Web 程式 - 程式碼編寫

Google 發佈了正式版的 Android Studio,並宣示 Android Studio 成為了官方的開發工具。官方網站上也建議使用 Eclipse 搭配 ADT 的開發人員要移轉至 Android Studio,這代表著 Google 要讓 Android Studio 代替 Eclipse 成為開發 Android App 的主流 IDE。所以,要把手上的 Android App 專案移到 Android Studio 上開發是遲早的事,但這也衍生出了一個問題,就是其他非 Android 平台的專案怎麼辦?畢竟一個進階一點的 App 通常都是需要有 Server 端的服務做搭配,再複雜一點可能還會有函式庫類型的專案是 App 與 Server 專案所共用的。為了使未來開發的工作可以順暢的進行,看來花點時間蒐集資料和研究是免不了的了!

2015/2/14

2015/1/12

軟體測試經驗分享

測試自動化

這裡先暫且放下 BDD、TDD 等進階的軟體工程理論,講到測試,許多人的刻板印象,第一個想到的就是手動式的測試方法。把程式執行起來,照著幾個情境人工觸發程式處理程序看看程式的行為、輸出的結果符不符合預期,有問題的話就修改程式再週而復始相同的過程。但其實這是一個很吊詭的現象,程式開發的用意是要協助人們將工作自動化,以減少人力的負載。結果我們有能力幫別人將工作自動化,而自己做的工作卻仍然在使用落後的人工處理!如果讓客戶知道,客戶不會懷疑我們的程式能用嗎? 就像做餐飲,如果連自己做出來的餐點自己都不吃,會有客人想吃嗎?

2014/12/26

使用 Git 來備份每天的工作成果

備份的重要性

很多人對於版本控管系統的刻板印象都是認為只有軟體開發那種高科技領域才用得到,可是事實上在很多中小型的開發團隊中,版本控管也不見得被應用在開發流程中。有不少的開發人員甚至還是使用人工的方式在做備份,例如:將每天的工作成果以目錄為單位備份並使用日期做為目錄名稱以協助辨識,更有不少人是完全不做備份、交由老天來決定。