建築釺


Android Logcat和JUnit:一個不可阻擋的組合測試

朱利安·康特拉斯 通過朱利安·康特拉斯2019年2月8日

在銅焊,我們做我們的盡職調查,以確保一切都在我們控製在最佳狀態為客戶工作。manbetx万博全站客户端一個關鍵元素,我們總是測試?我們的釺Android軟件開發工具包(SDK)。我們的sdk釺平台的一個重要部分;和我們的目標是通過高代碼覆蓋率沒有bug的代碼。沒有bug的代碼在我們的Android SDK對我們是非常重要的,不僅因為我們船SDK數以百萬計的設備,還因為一個幹淨的代碼意味著更加無縫的客戶的經驗。manbetx万博全站客户端當我們找到SDK代碼中的一個錯誤,這意味著我們必須運出一個更新,那麼客戶需要升級,推出一個新版本的應用程序,然後有他們所有的終端用戶需要下載更新。manbetx万博全站客户端最終,這意味著不必要的錯誤可以在野外很長一段時間。

的目標沒有錯誤意味著大量的測試,甚至更多的時間來應對失敗測試。下麵是一個片段的SDK模塊測試報告從我們的基地。

在編寫一個新特性時,重要的是要知道如何以及為什麼盡快測試失敗。如果你經常寫測試Logcat(安卓的係統消息工具),您可以調試通過尋找在你的日誌失敗發生。然而,在測試Logcat可能非常冗長。

在釺,我們使用JUnit的TestRule自動化檢索相關logcat輸出的過程,當一個測試失敗。

一個簡單的測試

以下是一個簡單的實效方法用於我們的代碼,一個日誌消息第一行:

現在,如果我們修改方法的相應的測試失敗,像這樣:

然後,可以預見的是,我們得到以下輸出:

然而,假設我們想記錄我們最初logcat輸出在測試期間與原測試失敗的信息。與一些特殊的邏輯,它將理想的樣子如下:

多幹淨!我們得到了重要的日誌消息。這個改進測試失敗消息將在詹金斯是可見的,測試失敗後簡化調試。

得到Logcat

閱讀logcat,我們首先獲得的一個實例運行時並運行一些logcat命令。然而,有幾件事情要考慮:

1。自logcat過濾設備上的任何其他應用程序的輸出,我們想隻獲取日誌匹配我們的測試的進程ID。

2。我們隻需要與我們的測試相關的日誌。他們方便所有類似的開始,包括測試的名稱。

聚合的方法匹配我們的進程ID和出現的任何行後“TestRunner:開始”。我們也隻在必要的情況下運行這個方法,測試失敗後立即。為此,我們需要利用TestRules。

使用JUnit

JUnit的TestRule是一個非常強大的工具,允許測試執行精細控製。我將跳過基本JUnit步驟設置在這篇文章中,但是你可以檢查這個鏈接為更多的信息。

標準化測試類,我們有一個房子我們的JUnit測試基類特定的邏輯,像TestRules:

寫一個TestRule

JUnit4,測試由測試運行器語句得到評估。你能想到的聲明評估運行測試。微不足道的TestRule例子簡單地評估輸入語句並返回它。

TestRule評估聲明之後,將這句話傳遞給其他TestRules,形成一個鏈。你可以閱讀的RuleChainjavadoc如果你感興趣這是如何工作的引擎蓋下麵!

幕後看TestRule

在JUnit測試失敗時,它實際上隻是拋出AssertionError被抓的測試運行器。下麵是JUnit斷言的來源:

如果我們想重新包裝一個真正的自定義消息測試失敗,我們會在別處引發一個異常。

自定義TestRule

現在我們logcat捕捉方法是準備好了,下一步是創建一個自定義TestRule測試失敗時將調用它。

最終的產品

這是我們修改測試運行器如何顯示從先前的測試。注意,頂部的消息包含我們的定製信息類的原始誤差和logcat輸出:

測試快樂!

在銅焊工作感興趣?看看我們目前的職位空缺!


朱利安·康特拉斯

朱利安·康特拉斯

相關內容

內容的卡片

釺克服基礎設施如何挑戰推出大規模內容的卡片嗎

閱讀更多

帆布流

重新編排:釺建造我們的帆布流動客戶旅行工具

閱讀更多

從B2C研究B2B研究:我的用戶體驗的旅程

閱讀更多

故事從黑客一天:釺軟件工程經理德裏克·舒爾茨競選評論

閱讀更多