android studio 2.2单元测试

最近接触到 单元测试 概念,准备学习一下。查阅了很多资料和书籍,发现很多资料上说的都是android studio比较早的版本用法。目前 as 2.2.2已经很完善了,并不用在工程创建完成后,再添加依赖什么的了。直接去编写测试用例就行了,很是方便的。

先上一张图:
android studio 2.2单元测试_第1张图片

新建的项目,总共分三部分:
1:androidTest 目录为编写Android测试用例使用,需要在模拟器上或者真机下测试。
2:我们的项目代码
3:test目录下是编写Java测试用例使用,在本地环境下就能测试,不需要模拟器或真机。

当然测试目录,你也可以自己新建一个。不过在我们在一开始创建项目时,人家就帮我们自动创建好了。建议就用自动创建好的。


第一部分讲解 (androidTest 目录):

(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等,大家需要慢慢琢磨。
第二部分,就是我们的项目代码,不在多说啦。


第三部分讲解 (test 目录):

比如我需要测试一段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测试之旅(一))

你可能感兴趣的:(【android】)