Android單元測試在蘑菇街支付金融部門的實踐(5)

發表于:2016-06-12來源:推酷作者:鄒小創點擊數: 標簽:單元測試
這兩種方法,也是解決static method, final class/method不能mock的主要方式。 2. 盡量寫出易于測試的代碼 static method、直接new object、singleton、Global state等等這些都

  這兩種方法,也是解決static method, final class/method不能mock的主要方式。

  2. 盡量寫出易于測試的代碼

  static method、直接new object、singleton、Global state等等這些都是一些不利于測試的代碼方式,應該盡量避免,用依賴注入來代替這些方式。

  3. 不要重復你的unit test

  比如說你使用了一個builder模式來創建了一個類,這個builder有一個validator,來validate一些參數情況。那么這種情況,builder跟validator分開測,用各種正確的錯誤的參數情況去測試validator,然后測builder的時候,就不用遍歷各種有效的跟無效的參數去測試了。

  因為如果這樣的話,到時候Validator的邏輯改了,那么針對Validator的測試跟針對Builder的測試都要修改,這個其實是重復的。這里只需要測試這個builder里面有一個Validator就好了。

  4. 公共的單元測試library

  如果你們公司也是組件化開發的話,抽出一個公共的單元測試類庫來做單元測試,里面可以放一些公共的helper、utils、rules等等,這個可以極大的提高寫單元測試的速度。

  5. 把安卓里面的“純java”代碼copy一份到自己的項目里面

  安卓里面有些類其實跟安卓沒太大關系的,比如說TextUtils、Color等等,這些類完全可以把代碼copy出來,放到自己的項目里面,然后其他地方就用這個類,這樣也能部分擺脫android的依賴,使用JUnit而不是Robolectric,提高運行test的速度。

  6. 充分發揮JUnit Rule的作用

  JUnit Rule是個很強大的工具,然而知道的人卻不多。它的基本作用是,讓你在執行某個測試方法前后,可以做一些事情。如果你的好幾個測試類里面有很多的共同的setup、teardown工作,你可能會傾向于使用繼承,結合@Before、@After來減少duplication,這里更建議大家使用JUnit Rule來實現這個目的,而不是用繼承,這樣可以有更大的靈活性。

  比如,為了方便測試Activity的method,我們有一個ActivityRule,在跑一個測試方法之會啟動target Activity,然后跑完以后自動finish這個activity。

  其中一個比較有趣的用JUnit Rule實現的功能,是實現類似于BDD測試框架的命名方式。做單元測試的時候,你經常需要為同一個方法寫好幾個測試方法,每個測試方法測試不同的點。為了讓命名更具可讀性,我們往往會把名字寫的很長,在這種情況下,如果用駝峰命名的話,需要不斷切換大小寫,寫起來麻煩,可讀性也不高。如果用下劃線的話,寫起來也很麻煩。如果你使用過BDD的一些框架(比如RSpec、Cucumber、Jasmine等),你就會異常懷念那種“命名”方式。如果你沒用過的話,那種“命名”方式大概是這樣的:

  describe Hash do

  # 一下是一個測試方法,it后面的字符串就是這個測試方法的“命名”

  it "hashes the correct information in a key" do

  expect(hash[:hello]).to eq('world')

  end

  end

  這里的關鍵是,當測試方法失敗的時候,這個字符串是要能被加到錯誤信息里面的。我們做了個JUnit Rule來達到這個效果。做法是結合一個自定義的annotation,這個annotation接收一個String,來描述這個測試方法的測試目的。在Rule里面將這個annotation讀出來,如果測試沒通過的話,把這個描述性的String加到輸出的error message里面。這樣在批量運行的時候,一看就知道沒通過的測試是測什么東西的。而測試方法的命名則可以比較隨意。

  達到的效果如下:

  如果運行失敗,得到如下的結果

  關于JUnit Rule的使用,大家可以自行google一下,也不難。

  7. 善于利用AndroidStudio來加快你寫測試的速度

  AndroidStudio有很多feature可以幫助我們更快的寫代碼,比如code generation和live template。這點對于寫正式代碼也適用,不過對于寫測試代碼來說,效果更為突出。因為大部分測試代碼的結構、風格都是類似的,在這里live template能起非常大的作用。此外,如果你先寫測試,可以直接寫一些還不存在的Class或method,然后alt+enter讓AndroidStudio自動幫你生成。

原文轉自:http://www.jianshu.com/p/9f7a992fe9ec

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97