最近接触到 单元测试 概念,准备学习一下。查阅了很多资料和书籍,发现很多资料上说的都是android studio比较早的版本用法。目前 as 2.2.2已经很完善了,并不用在工程创建完成后,再添加依赖什么的了。直接去编写测试用例就行了,很是方便的。
新建的项目,总共分三部分:
1:androidTest 目录为编写Android测试用例使用,需要在模拟器上或者真机下测试。
2:我们的项目代码
3:test目录下是编写Java测试用例使用,在本地环境下就能测试,不需要模拟器或真机。
当然测试目录,你也可以自己新建一个。不过在我们在一开始创建项目时,人家就帮我们自动创建好了。建议就用自动创建好的。
(1)ExampleInstrumentedTest 类
这是我们在一开始创建项目时,人家就帮我们自动创建好的。它是使用注解的方式。
/**
* Instrumentation test, which will execute on an Android device.
*
* @see Testing documentation
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.everyoo.broadcastbestpractice", appContext.getPackageName());
}
@Test
public void testAddActivity() {
assertEquals(0, 1);//方法第一个参数的意思是,我们预期的值;第二个参数的意思是,实际结果值。很显然它会报错。
assertEquals(1, 1);//这个就不会报错啦。
}
}
(2)InstrumentationTestCase 类
Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。
举个例子,利用InstrumentationTestCase 启动一个activity:
在androidTest下新建一个java类,并且继承自InstrumentationTestCase,编写一个public void的方法,但是必须要是方法名以test打头,比如testPublishSubject,并不需要@Test注解。
public class TestAndroidClass extends InstrumentationTestCase {
private static final String TAG = "TestAndroidClass";
public void test() throws Exception {
assertEquals(0, 0);
}
public void testPublishSubject() {
launchActivity("com.everyoo.broadcastbestpractice", LoginActivity.class, null);
}
(2)ApplicationTestCase 类
ApplicationTestCase——测试整个应用程序的类。它允许你注入一个模拟的Context到应用程序中,在应用程序启动之前初始化测试参数,并在应用程序结束之后销毁之前检查应用程序。
使用Context,你可以浏览资源,文件,数据库等等。基类是AndroidTestCase,一般常见的是它的子类,和特定组件关联。
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
String app_name = getResources().getString(R.string.app_name);
Log.i("MyApp", ".........MyApp....app_name.........." + app_name);
}
}
public class ApplicationTest extends ApplicationTestCase<MyApp> {
public ApplicationTest() {
super(MyApp.class);
}
public void testStart() {
String str = null;
str = mContext.getResources().getString(R.string.app_name);
Log.i("..", ".............ApplicationTest ...........app_name............." + str);
}
(2)ActivityUnitTestCase 类
ActivityUnitTestCase——对单个Activity进行单一测试的类。使用它,你可以注入模拟的Context或Application,或者两者。它用于对Activity进行单元测试。也就是说你可以用于测试单独的activity ,虽然也需要利用模拟机或真机启动,但你启动的只是你需要做测试的activity,于其他activity无关。
总结:还有很多常见的测试,比如ServiceTestCase,ProviderTestCase2等,大家需要慢慢琢磨。
第二部分,就是我们的项目代码,不在多说啦。
比如我需要测试一段java代码,而这段java代码跟android没关系,也就是不用到android的资源,如context,activity 等,说白了就是简单的 java 测试,当然android studio也是可以做java代码测试的。同样,在我们一开始创建好工程时,人家就自动帮我们创建好了。
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see Testing documentation
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
如果要想脱离 模拟器 或 真机,又要做使用android资源的测试,如:使用Context,浏览资源,文件,数据库等等。 也是可以的! 那就只有第三方测试框架了 Robolectric。目前Robolectric3.0就是很好的一个单元测试框架。经查阅资料发现,写这篇博客时,Robolectric3.0只兼容到sdk=21。
Robolectric3.0相关资料:
git地址
官方地址
Robolectric使用时的一些坑:
http://blog.csdn.net/ethanco/article/details/52350019
Android单元测试框架Robolectric3.0介绍(一)
Android单元测试框架Robolectric3.0介绍(二)
可用学习参考的博客:
简单谈谈android studio 的单元测试
http://www.jb51.net/article/90449.htm
鸿洋微信推荐地址(Android测试之旅(一))