单元测试是针对程序模块来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.单元测试有助于及早发现修改和重构导致的bug,从而确保基础库的稳定和可用.
Java单元测试框架JUnit
使用Android studio创建应用工程的时候,在src/test下默认生成单元测试目录,同时给出JUnit的简单例子.
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
使用规则:
单元测试类的命名一般以Test结尾.
单元测试方法需要使用@Test注解标记.
验证单元测试的结果一般使用Assert类中的方法:assertEquals,assertTrue,assertNotEquals,fail等.
在JUnit中,除了@Test,常用的注解还有:
@Before:表示在每个被@Test标记的测试方法调用之前,都要先调用被@标记的方法.
@After:表示在每个被@Test标记的测试方法之后,都要接着调用被After标记的方法.
@BeforeClass:在执行一个测试类的所有测试方法之前,会调用一次这个测试类中被@BeforeClass标志的方法.
@AfterClass:在执行一个测试类的所有测试方法之后,会调用一次这个测试类中被@AfterClass标志的方法.
@Ignore:测试类中某些测试方法可能暂时处于不可测试阶段,那么为了保证不影响整个测试类的正常运行,可以使 用@Ignore标记这些测试方法.
Android单元测试框架Robolectric3.0
Robolectric3.0的设计思想是通过实现一套JVM能够运行的Android代码,从而实现脱离Android环境进行测试.
Robolectric3.0集成:Robolectric3.0依赖于JUnit
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.0'
Robolectric可以方便地对Android中的Activity,fragment,service,broadcastReceiver等组件进行单元测试,还可以测试Activity的生命周期,然后判断控件的取值是否正确.
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class RoboTest {
@Test
public void titleIsCorrect() throws Exception {
Activity activity = Robolectric.setupActivity(MainActivity.class);
assertTrue(activity.getTitle().toString().equals("myTest"));
}
@Test
public void testLifecycle() throws Exception {
ActivityController<MainActivity> activityController =
Robolectric.buildActivity(MainActivity.class).create().start();
Activity activity = activityController.get();
TextView textView = activity.findViewById(R.id.tv);
assertEquals("onCreate",textView.getText().toString() );
activityController.resume();
assertEquals("onResume",textView.getText().toString());
}
}
Robolectric不仅支持对UI组件的测试,同时还支持向日志输出,网络请求,数据库等方面的测试.