蘑菇街开源的安卓单元测试框架

rmpp2195 8年前
   <h2>我知道你觉得写单元测试很麻烦,所以。。。</h2>    <p>我们开源了一个单元测试框架,里面提供了一系列的utility,希望能帮助你更快更轻松的写单元测试,能够少写一点boilerplate code,少一点痛苦,多一点愉悦!</p>    <h2>这个project是怎么来的?</h2>    <p>蘑菇街目前采用组件化的开发方式,一个app由很多个模块组成,每个模块都有单元测试的部分,然而有很多代码都是类似的。因此,为了减少重复劳动,我们花时间抽出来一个独立的project,专门做unit testing用的。</p>    <h2>这个project能帮你做什么?</h2>    <p>如前所述,这个project里面主要是一些单元测试都会用到的公共代码,来帮助你更快的做unit testing,减少一些boilerplate code。</p>    <p>说白了就是一些帮助类,里面有些帮助方法。</p>    <p>最核心的是以下几个:</p>    <h3>TestBase</h3>    <p>TestBase应该是每一个Test Class最顶层的父类,它给你提供的帮助有:</p>    <ol>     <li>一个MockitoRule 成员变量,所以在你自己的Test Class里面就不用每次需要 @Mock 的时候,都定义这个成员变量了。如</li>     <li>一个 CountDownLatch ,以及相应的 await() 和 countDown() 方法,方便你使用 CountDownLatch 来测试异步代码,不用每次都自己new一个 CountDownLatch 对象。默认的CountDown次数是1,你可以用 resetLatch(count) 来设置次数。</li>     <li>读取资源文件的方法: readResource(file_name) 把你的资源文件放在 src/test/resources 文件夹下面,然后通过这个方法就能读出来。比如你有一个文件名为: person.json ,放在 src/test/resources 文件夹下面,那么 readResource("person.json") 会把 person.json 的内容读出来,返回String。</li>     <li>根据我的经验,一般来说,你的资源文件里面是Json String,经过上面的方法读出来以后,如果你想变成Java Object,那么TestBase里面也有对应的方法: dataFromResource(file_name, clazz) ,比如上面的例子: dataFromResource(“person.json”, Person.class) ,就会把 person.json 里面的内容读出来,使用Gson变成Person类的对象。</li>     <li>一系列Assert.assert*的方法,简化你的书写,比如:      <ol>       <li>ae(expected, actual); 等同于 Assert.assertEquals(expected, actual);</li>       <li>at(boolValue); 等同于 Assert.assertTrue(boolValue); ;类似的, af(boolValue); 等同于 Assert.assertFalse(boolValue);</li>       <li>ann(obj); 等同于 Assert.assertNotNull(obj); ;类似的, an(obj); 等同于 Assert.assertNull(obj);</li>      </ol> </li>    </ol>    <p>以上是一些写TestCase最常用到的东西,TestBase给你提供了一些便捷。另外还有一些不那么常用的,这里就不缀述了。如果你觉得自己经常用到一个东西,那么可以看看TestBase里面有没有,如果没有的话怎么办呢?那当然是Fork & PR啦!</p>    <h3>ViewTestBase</h3>    <p>这个类一般是用来测试Custom View的,你的CustomView对应的TestClass可以继承这个类。它给你提供的辅助有</p>    <ol>     <li>上面提到的TestBase的所以辅助,因为ViewTestBase是继承处TestBase的。</li>     <li>一个需要你现实的 createView() 方法,这个方法返回的View就应该是待测的View,你可以通过mTargetView获得这个View的实例。</li>     <li>child(viewId) 方法,返回这个待测的View的一个子view</li>     <li>assertViewVisible(view)/assertViewGone(view) 用来assert 某一个view的visibility是VISIBLE/GONE,这两个方法需要你传一个View对象。类似的有 assertChildVisible(view)/assertChildGone(view) ,这两个类只需要你传待测View的子View的id就好了。</li>    </ol>    <h3>ActivityTestBase</h3>    <p>顾名思义,这个类是用来测试Activity的,所以你的Activity对应的测试类应该继承这个类。它给你提供的便利有:</p>    <ol>     <li>上面提到的ViewTestBase和TestBase提到的所以便利,因为这个类是继承自ViewTestBase的。</li>     <li>一个待实现的 activityClass() 方法,这个方法返回的应该是你要测的Activity的Class。ActivityTestBase会自动创建这个Activity实例,并保存在mActivity field里面,你可以通过这个field,或者是 getActivity() 方法获得这个Activity实例对象。如果你要自定义创建这个Activity的Intent,可以override activityIntent() 这个方法。</li>     <li>assertToast(text) assert 弹出了一个toast,内容为 text</li>     <li>assertEnabled(viewId)/assertDisabled(viewId) assert id为 viewId 的View的状态是Enabled/Disabled。</li>     <li>view(viewId) 简化令人厌烦的 findViewById(viewId)</li>     <li>assertViewHasText(viewId, text) assert id 为 viewId 的View上面的文字含有 text ,类似的有 assertViewText(viewId, text) ,这个是将text进行是否相等的对比。</li>     <li>click(viewId) 触发id为viewId的view的点击事情。</li>     <li>assertNextActivity(clazz) assert 启动了一个类是clazz的Activity。</li>     <li>。。。。。。</li>    </ol>    <p>再说一遍,这不是一个完整的列表,只是列了一些最为常用的。如果有漏掉的,欢迎PR补上!</p>    <h2>怎么样使用?</h2>    <p>目前项目已经发布到了jcenter,在 build.gradle 的 dependencies 里面加上</p>    <pre>  <code class="language-java">dependencies {      testCompile 'com.github.mogujie:natasha:0.6.3'  }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/25039f23a9e1</p>    <p> </p>