蘑菇街開源的安卓單元測試框架

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

我們開源了一個單元測試框架,里面提供了一系列的utility,希望能幫助你更快更輕松的寫單元測試,能夠少寫一點boilerplate code,少一點痛苦,多一點愉悅!

這個project是怎么來的?

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

這個project能幫你做什么?

如前所述,這個project里面主要是一些單元測試都會用到的公共代碼,來幫助你更快的做unit testing,減少一些boilerplate code。

說白了就是一些幫助類,里面有些幫助方法。

最核心的是以下幾個:

TestBase

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

  1. 一個MockitoRule 成員變量,所以在你自己的Test Class里面就不用每次需要 @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);
    </li> </ol>

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

    ViewTestBase

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

    1. 上面提到的TestBase的所以輔助,因為ViewTestBase是繼承處TestBase的。
    2. 一個需要你現實的 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. 一個待實現的 activityClass() 方法,這個方法返回的應該是你要測的Activity的Class。ActivityTestBase會自動創建這個Activity實例,并保存在mActivity field里面,你可以通過這個field,或者是 getActivity() 方法獲得這個Activity實例對象。如果你要自定義創建這個Activity的Intent,可以override activityIntent() 這個方法。
    3. assertToast(text) assert 彈出了一個toast,內容為 text
    4. assertEnabled(viewId)/assertDisabled(viewId) assert id為 viewId 的View的狀態是Enabled/Disabled。
    5. view(viewId) 簡化令人厭煩的 findViewById(viewId)
    6. assertViewHasText(viewId, text) assert id 為 viewId 的View上面的文字含有 text ,類似的有 assertViewText(viewId, text) ,這個是將text進行是否相等的對比。
    7. click(viewId) 觸發id為viewId的view的點擊事情。
    8. assertNextActivity(clazz) assert 啟動了一個類是clazz的Activity。
    9. 。。。。。。

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

    怎么樣使用?

    目前項目已經發布到了jcenter,在 build.gradle 的 dependencies 里面加上

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

     

     

    來自:http://www.jianshu.com/p/25039f23a9e1

     

 本文由用戶 rmpp2195 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!