2015/9/19

調整 Android Studio 編譯檢查規則

在 Android Studio 中進行程式碼的編輯時,會對程式碼進行即時的分析,並且在編輯窗格的右上方顯示分析的結果。檢查程序在進行中時,窗格右上方的角落會以一個眼睛的圖示來表達。如果程式碼通過所有檢查條件會顯示綠色的勾勾;程式碼有違反一項以上的警告規則顯示黃色的方塊;當程式碼有違反一項以上的錯誤規則顯示紅色的圓圈包著驚嘆號。

很多人在寫程式的時候都只關心編譯後能不能執行好進行測試,因為程式一旦有錯誤就會中斷編譯程序、阻擋工作的進行,要等到錯誤的程式碼被修正後才能繼績工作。而警告的訊息並不會阻擋工作的進行,就會變得無所謂、大多數的人都會選擇不予理會。

這並不是一個好的開發習慣,Android Studio 進行的程式碼分析就像健康檢查一樣,用來顯示程式碼的健康程度。當健康檢查的報告中有數值超出標準值,雖然沒有達到疾病的程度,但代表身體已經有一定的問題。如果繼續忽視不理,很有可能就會轉變成疾病,甚至危害生命。同樣的道理,當分析的結果出現警告的訊息代表程式的寫法有一定程度出錯的風險。所以一但有警告訊息出現,應該要和錯誤一樣認真地看待並謹慎地處理。

不過,有的時候特定的習慣性寫法或是團隊的 Coding Convetion 可能會和工具預設的檢查規則有衝突,但其實並不影響程式的執行結果。舉例來說,以下的程式碼是一般判斷布林值的慣用寫法:


但是這樣的寫法由於「!」的寬度不寬,和判斷布林值是 true 的程式碼差別沒有很大,很容易因為看漏而導致修改程式時誤判而發生改錯程式碼的情況。再者,我們的母語並不是英文,所以在命名變數時常常詞不達意,甚至在過去的工作經驗中遇到有人命名變數的語意與用途相反的情況,更大大地增加了這樣的情況出現的機率。

為了有效地提高防呆的機率,我都習慣性地使用以下的方式來撰寫判斷式:


雖然會多打好幾個字,但是卻可以換來表達意思明確的效果。閱讀程式碼的人容易判斷區塊中到底是要執行 true 還是 false 的邏輯,不會被變數的名稱誤導形成邏輯上的混亂。

但 Android Studio 預設的檢查規則在遇到以上的寫法卻會顯示以下的警告訊息:

flag == false can be simplified to !flag

Reports pointless or pointlessly complicated boolean expressions. Such expressions include anding with true, oring with false, equality comparison with a boolean literal, or negation of a boolean literal. Such expressions may be the result of automated refactorings not completely followed through to completion, and in any case are unlikely to be what the developer intended to do.


當這樣的訊息與其他的警告混在一起就會造成在寫程式時的困擾,因為沒有辦法在第一時間就利用編輯窗格右上角的綠色勾勾,了解程式是否已經通過其他的檢查規則。當看到窗格的右上角呈現黃色的方塊,如果要確認還要將滑鼠游標移到有問題的位置,才能夠判斷是不是因為以上的程式碼寫法所產生的警告訊息,或是還有其它的問題待修正!

這樣的動作如果在寫程式時頻繁的重複,會讓工作的效率下降很多,而且也會因為久了出現怠惰的心態,進而忽略警告訊息造成程式出問題的風險增加。

所幸 Android Studio 的檢查規則是可以調整的,在 Settings 的對話視窗中選擇「Editor->Inspections」項目,就可開啟或關閉特定的檢查規則。以文章中的示範程式碼寫法為例,可以切換到「Java->Control flow issues->Pointless boolean expression」項目。如下圖所示取消勾選該項目,Android Studio 就不會再針對這項寫法進行檢查。



有更動過的選項會以藍色的字體顯示,同時所屬的逐級向上分類項目也會顯示藍色,以方便識別。


2015/9/4

如何在 Android Studio 中批次執行不同性質的測試程式

當所開發的系統中,測試程式被依性質做區分,例如:單元測試(Unit Testing)、整合測試(Integation Testing)。通常會讓整合測試交給後端的 CI 系統來執行,因為相較於單元測試,整合測試所需的執行條件較高、所耗的時間也相對地較長。否則隨著程式日漸龐大,很有可能會出現只是幾分鐘的程式修改,但等測試執行完成卻要花上數倍時間的情況。

而單元測試就會被程式撰寫人員執行,用來確認程式是否依設計的內容來完成,所以這個時候就會需要有一個簡易的方法可以用來觸發單元測試的執行。在 Android Studio 中可以設定 Configuration 以便用來觸發不同的執行內容,像是要執行測試可以選擇新增 JUnit 或 TestNG  設定來啟動測試。

以 JUnit 為例,如果要在一堆的測試程式檔中只執行特定的測試項目,最直接的方法就是把檔案用不同的目錄或是 Package 分隔,在設定 Configuration 時指定對應的目錄或是 Package,就可以在測試啟動後只執行其下的測試檔案內容。

只是有的時候專案的結構較為複雜,因為規劃的關係同性質的測試檔案沒有辦法都歸在同一個目錄或 Package 下,更進一步可能檔案在不同階層的目錄或 Package 間交錯。而 Android Studio 的 JUnit Configuration 同時只能指定一個目錄或 Package,就算是可以指定多個,要一個一個的設定不但麻煩還會有遺漏的問題。當開發還在進行、專案結構還持續有異動時,要維持設定的正確更是個挑戰。

這時如果測試檔案的名稱有一定的規則,例如:單元測試以 UT 做為檔名的結尾、整合測試以 IT 做為檔名的結尾,可以使用 JUnit Configuration 裡的另一個選擇 - Pattern。不過這個部份在官方文件中沒有找到比較明確的說明,只有簡略地提一下可以透過搜尋由清單中選出所需的檔案。

實際上可以如下圖所示,在 Pattern 右方文字框中輸入 Regular Expression 內容,像是要過濾以 UT 結尾的檔案可以輸入 ^(.*UT$).*$。啟動後會依設定的搜尋範圍來進行比對,挑出檔案名稱符合樣板的測試檔案,並執行所有符合條件的測試程式。