我知道你覺得寫單元測試很麻煩非竿,所以蜕着。。。
我們開源了一個單元測試框架承匣,里面提供了一系列的utility蓖乘,希望能幫助你更快更輕松的寫單元測試,能夠少寫一點boilerplate code韧骗,少一點痛苦嘉抒,多一點愉悅!
地址在這里:https://github.com/mogujie/natasha
這個project是怎么來的袍暴?
蘑菇街目前采用組件化的開發(fā)方式些侍,一個app由很多個模塊組成,每個模塊都有單元測試的部分政模,然而有很多代碼都是類似的岗宣。因此,為了減少重復勞動淋样,我們花時間抽出來一個獨立的project耗式,專門做unit testing用的。
這個project能幫你做什么趁猴?
如前所述刊咳,這個project里面主要是一些單元測試都會用到的公共代碼,來幫助你更快的做unit testing儡司,減少一些boilerplate code娱挨。
說白了就是一些幫助類,里面有些幫助方法捕犬。
最核心的是以下幾個:
TestBase
TestBase應該是每一個Test Class最頂層的父類让蕾,它給你提供的幫助有:
- 一個MockitoRule 成員變量,所以在你自己的Test Class里面就不用每次需要
@Mock
的時候或听,都定義這個成員變量了探孝。如果你看不懂這里說的什么意思,請看文章: 安卓單元測試(九):使用Mockito Annotation快速創(chuàng)建Mock - 一個
CountDownLatch
誉裆,以及相應的await()
和countDown()
方法顿颅,方便你使用CountDownLatch
來測試異步代碼,不用每次都自己new一個CountDownLatch
對象足丢。默認的CountDown次數是1粱腻,你可以用resetLatch(count)
來設置次數。如果你看不懂這里這的是什么意思斩跌,請看文章: 安卓單元測試(十一):異步代碼怎么測試 - 讀取資源文件的方法:
readResource(file_name)
把你的資源文件放在src/test/resources
文件夾下面绍些,然后通過這個方法就能讀出來。比如你有一個文件名為:person.json
耀鸦,放在src/test/resources
文件夾下面柬批,那么readResource("person.json")
會把person.json
的內容讀出來啸澡,返回String。 - 根據我的經驗氮帐,一般來說嗅虏,你的資源文件里面是Json String,經過上面的方法讀出來以后上沐,如果你想變成Java Object皮服,那么TestBase里面也有對應的方法:
dataFromResource(file_name, clazz)
,比如上面的例子:dataFromResource(“person.json”, Person.class)
参咙,就會把person.json
里面的內容讀出來龄广,使用Gson變成Person類的對象。 - 一系列Assert.assert*的方法蕴侧,簡化你的書寫择同,比如:
-
ae(expected, actual);
等同于Assert.assertEquals(expected, actual);
-
at(boolValue);
等同于Assert.assertTrue(boolValue);
;類似的戈盈,af(boolValue);
等同于Assert.assertFalse(boolValue);
-
ann(obj);
等同于Assert.assertNotNull(obj);
;類似的谆刨,an(obj);
等同于Assert.assertNull(obj);
-
以上是一些寫TestCase最常用到的東西塘娶,TestBase給你提供了一些便捷。另外還有一些不那么常用的痊夭,這里就不綴述了刁岸。如果你覺得自己經常用到一個東西,那么可以看看TestBase里面有沒有她我,如果沒有的話怎么辦呢虹曙?那當然是Fork & PR啦!
ViewTestBase
這個類一般是用來測試Custom View的番舆,你的CustomView對應的TestClass可以繼承這個類酝碳。它給你提供的輔助有
- 上面提到的TestBase的所以輔助,因為ViewTestBase是繼承處TestBase的恨狈。
- 一個需要你現(xiàn)實的
createView()
方法疏哗,這個方法返回的View就應該是待測的View,你可以通過mTargetView獲得這個View的實例禾怠。 -
child(viewId)
方法返奉,返回這個待測的View的一個子view -
assertViewVisible(view)/assertViewGone(view)
用來assert 某一個view的visibility是VISIBLE/GONE,這兩個方法需要你傳一個View對象吗氏。類似的有assertChildVisible(view)/assertChildGone(view)
芽偏,這兩個類只需要你傳待測View的子View的id就好了。
ActivityTestBase
顧名思義弦讽,這個類是用來測試Activity的污尉,所以你的Activity對應的測試類應該繼承這個類。它給你提供的便利有:
- 上面提到的ViewTestBase和TestBase提到的所以便利,因為這個類是繼承自ViewTestBase的十厢。
- 一個待實現(xiàn)的
activityClass()
方法等太,這個方法返回的應該是你要測的Activity的Class。ActivityTestBase會自動創(chuàng)建這個Activity實例蛮放,并保存在mActivity field里面缩抡,你可以通過這個field,或者是getActivity()
方法獲得這個Activity實例對象包颁。如果你要自定義創(chuàng)建這個Activity的Intent瞻想,可以overrideactivityIntent()
這個方法。 -
assertToast(text)
assert 彈出了一個toast娩嚼,內容為text
-
assertEnabled(viewId)/assertDisabled(viewId)
assert id為viewId
的View的狀態(tài)是Enabled/Disabled蘑险。 -
view(viewId)
簡化令人厭煩的findViewById(viewId)
-
assertViewHasText(viewId, text)
assert id 為viewId
的View上面的文字含有text
,類似的有assertViewText(viewId, text)
岳悟,這個是將text進行是否相等的對比佃迄。 -
click(viewId)
觸發(fā)id為viewId的view的點擊事情。 -
assertNextActivity(clazz)
assert 啟動了一個類是clazz的Activity贵少。 - 呵俏。。滔灶。普碎。。录平。
再說一遍麻车,這不是一個完整的列表,只是列了一些最為常用的斗这。如果有漏掉的动猬,歡迎PR補上!
怎么樣使用表箭?
目前項目已經發(fā)布到了jcenter枣察,在build.gradle
的dependencies
里面加上
dependencies {
testCompile 'com.github.mogujie:natasha:0.6.3'
}
就OK了。
Enjoy燃逻!