我知道你覺得寫單元測試很麻煩淳玩,所以,蘑菇街開源了一個安卓單元測試框架

我知道你覺得寫單元測試很麻煩非竿,所以蜕着。。。

我們開源了一個單元測試框架承匣,里面提供了一系列的utility蓖乘,希望能幫助你更快更輕松的寫單元測試,能夠少寫一點boilerplate code韧骗,少一點痛苦嘉抒,多一點愉悅!
地址在這里:https://github.com/mogujie/natasha

這個project是怎么來的袍暴?

蘑菇街目前采用組件化的開發(fā)方式些侍,一個app由很多個模塊組成,每個模塊都有單元測試的部分政模,然而有很多代碼都是類似的岗宣。因此,為了減少重復勞動淋样,我們花時間抽出來一個獨立的project耗式,專門做unit testing用的。

這個project能幫你做什么趁猴?

如前所述刊咳,這個project里面主要是一些單元測試都會用到的公共代碼,來幫助你更快的做unit testing儡司,減少一些boilerplate code娱挨。
說白了就是一些幫助類,里面有些幫助方法捕犬。
最核心的是以下幾個:

TestBase

TestBase應該是每一個Test Class最頂層的父類让蕾,它給你提供的幫助有:

  1. 一個MockitoRule 成員變量,所以在你自己的Test Class里面就不用每次需要@Mock的時候或听,都定義這個成員變量了探孝。如果你看不懂這里說的什么意思,請看文章: 安卓單元測試(九):使用Mockito Annotation快速創(chuàng)建Mock
  2. 一個CountDownLatch誉裆,以及相應的await()countDown() 方法顿颅,方便你使用CountDownLatch來測試異步代碼,不用每次都自己new一個CountDownLatch對象足丢。默認的CountDown次數是1粱腻,你可以用resetLatch(count)來設置次數。如果你看不懂這里這的是什么意思斩跌,請看文章: 安卓單元測試(十一):異步代碼怎么測試
  3. 讀取資源文件的方法:readResource(file_name)把你的資源文件放在 src/test/resources文件夾下面绍些,然后通過這個方法就能讀出來。比如你有一個文件名為:person.json耀鸦,放在src/test/resources文件夾下面柬批,那么readResource("person.json")會把person.json的內容讀出來啸澡,返回String。
  4. 根據我的經驗氮帐,一般來說嗅虏,你的資源文件里面是Json String,經過上面的方法讀出來以后上沐,如果你想變成Java Object皮服,那么TestBase里面也有對應的方法:dataFromResource(file_name, clazz),比如上面的例子:dataFromResource(“person.json”, Person.class)参咙,就會把person.json里面的內容讀出來龄广,使用Gson變成Person類的對象。
  5. 一系列Assert.assert*的方法蕴侧,簡化你的書寫择同,比如:
    1. ae(expected, actual); 等同于Assert.assertEquals(expected, actual);
    2. at(boolValue);等同于Assert.assertTrue(boolValue);;類似的戈盈, af(boolValue);等同于Assert.assertFalse(boolValue);
    3. ann(obj);等同于Assert.assertNotNull(obj);;類似的谆刨,an(obj);等同于Assert.assertNull(obj);

以上是一些寫TestCase最常用到的東西塘娶,TestBase給你提供了一些便捷。另外還有一些不那么常用的痊夭,這里就不綴述了刁岸。如果你覺得自己經常用到一個東西,那么可以看看TestBase里面有沒有她我,如果沒有的話怎么辦呢虹曙?那當然是Fork & PR啦!

ViewTestBase

這個類一般是用來測試Custom View的番舆,你的CustomView對應的TestClass可以繼承這個類酝碳。它給你提供的輔助有

  1. 上面提到的TestBase的所以輔助,因為ViewTestBase是繼承處TestBase的恨狈。
  2. 一個需要你現(xiàn)實的createView()方法疏哗,這個方法返回的View就應該是待測的View,你可以通過mTargetView獲得這個View的實例禾怠。
  3. child(viewId)方法返奉,返回這個待測的View的一個子view
  4. assertViewVisible(view)/assertViewGone(view)用來assert 某一個view的visibility是VISIBLE/GONE,這兩個方法需要你傳一個View對象吗氏。類似的有 assertChildVisible(view)/assertChildGone(view)芽偏,這兩個類只需要你傳待測View的子View的id就好了。

ActivityTestBase

顧名思義弦讽,這個類是用來測試Activity的污尉,所以你的Activity對應的測試類應該繼承這個類。它給你提供的便利有:

  1. 上面提到的ViewTestBase和TestBase提到的所以便利,因為這個類是繼承自ViewTestBase的十厢。
  2. 一個待實現(xiàn)的activityClass()方法等太,這個方法返回的應該是你要測的Activity的Class。ActivityTestBase會自動創(chuàng)建這個Activity實例蛮放,并保存在mActivity field里面缩抡,你可以通過這個field,或者是getActivity()方法獲得這個Activity實例對象包颁。如果你要自定義創(chuàng)建這個Activity的Intent瞻想,可以override activityIntent()這個方法。
  3. assertToast(text) assert 彈出了一個toast娩嚼,內容為text
  4. assertEnabled(viewId)/assertDisabled(viewId) assert id為viewId的View的狀態(tài)是Enabled/Disabled蘑险。
  5. view(viewId) 簡化令人厭煩的findViewById(viewId)
  6. assertViewHasText(viewId, text) assert id 為viewId的View上面的文字含有text,類似的有assertViewText(viewId, text)岳悟,這個是將text進行是否相等的對比佃迄。
  7. click(viewId) 觸發(fā)id為viewId的view的點擊事情。
  8. assertNextActivity(clazz) assert 啟動了一個類是clazz的Activity贵少。
  9. 呵俏。。滔灶。普碎。。录平。

再說一遍麻车,這不是一個完整的列表,只是列了一些最為常用的斗这。如果有漏掉的动猬,歡迎PR補上!

怎么樣使用表箭?

目前項目已經發(fā)布到了jcenter枣察,在build.gradledependencies里面加上

dependencies {
    testCompile 'com.github.mogujie:natasha:0.6.3'
}

就OK了。

Enjoy燃逻!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末序目,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伯襟,更是在濱河造成了極大的恐慌猿涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆怪,死亡現(xiàn)場離奇詭異叛赚,居然都是意外死亡澡绩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門俺附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肥卡,“玉大人,你說我怎么就攤上這事事镣〔郊” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵璃哟,是天一觀的道長氛琢。 經常有香客問我,道長随闪,這世上最難降的妖魔是什么阳似? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮铐伴,結果婚禮上撮奏,老公的妹妹穿的比我還像新娘。我一直安慰自己当宴,他們只是感情好畜吊,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著即供,像睡著了一般定拟。 火紅的嫁衣襯著肌膚如雪于微。 梳的紋絲不亂的頭發(fā)上逗嫡,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音株依,去河邊找鬼驱证。 笑死,一個胖子當著我的面吹牛恋腕,可吹牛的內容都是我干的抹锄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼荠藤,長吁一口氣:“原來是場噩夢啊……” “哼伙单!你這毒婦竟也來了?” 一聲冷哼從身側響起哈肖,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤吻育,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淤井,有當地人在樹林里發(fā)現(xiàn)了一具尸體布疼,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡摊趾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了游两。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾层。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贱案,靈堂內的尸體忽然破棺而出肛炮,到底是詐尸還是另有隱情,我是刑警寧澤轰坊,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布铸董,位于F島的核電站,受9級特大地震影響肴沫,放射性物質發(fā)生泄漏粟害。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一颤芬、第九天 我趴在偏房一處隱蔽的房頂上張望悲幅。 院中可真熱鬧,春花似錦站蝠、人聲如沸汰具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留荔。三九已至,卻和暖如春澜倦,著一層夾襖步出監(jiān)牢的瞬間聚蝶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工藻治, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碘勉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓桩卵,卻偏偏與公主長得像验靡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雏节,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理胜嗓,服務發(fā)現(xiàn),斷路器钩乍,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 當窗外聲聲鳥鳴辞州, 你, 翻身出門件蚕, 騎上摩拜孙技, 觀光綠道产禾。 晨霧已散, 空氣宜人牵啦, 泥土氣息亚情, 悠悠飄來。 秧苗的...
    辰辰2008閱讀 347評論 0 2
  • 1 就像是摔碎了一角的瓶子,盡管從外觀看來還是完整的裳瘪,但那個碎掉的部分是真實存在的土浸。 而我,就是這樣一個破損的敏感...
    大學的故事閱讀 380評論 5 13
  • 本教程將告訴你在創(chuàng)建幾何背景色彭羹。這種技術使用矢量形狀圖層黄伊,圖層樣式,創(chuàng)建出一個驚人的背景派殷。 步驟1 創(chuàng)建一個新的3...
    3e39d85c28ab閱讀 478評論 0 0