android单元测试

在实际开发中,开发android应用程序的过程中是需要不断的进行单元测试的,使用JUnit测试框架,是正规android开发比用技术,良好的测试习惯,一是能减少后期维护和增强软件的健壮性。在JUnit中可以得到组件,可以模拟发送事件和检测程序处理的正确性。

其实android中也是扩展了JUnit,派生出好几个类倾向于不同情况下的测试。这一点与Spring中初始化容器相似,你可以通过BeanFactory也可以通过ApplicationContext来完成。只不过他们的倾向点不同。在android中你可以使用这些类来完成单元测试:

Test—TestCase—AndroidTestCase:多用于对业务逻辑的单元测试

Test—TestCase—InstrumentationTestCase:用于测试与组件交互的功能

Test—TestSuite—InstrumentationTestSuite:一组测试用例

TestListener——BaseTestRunner—AndroidTestRunner

Instrumentation—InstrumentationTestRunner

我们常用到的一般是前前两个,你会发现他们的基类都是Test。只不过各自的应用场景不同。

第一步:在AndroidManifest.xml中加入下面蓝色代码:

<!--EndFragment-->

Xml代码收藏代码

<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">

<!--使用的类库-->

<spanstyle="color:#0000ff;"><uses-libraryandroid:name="android.test.runner"/></span>

android:label="@string/app_name">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

<!--这里的targetPackage的内容与上面package内容需相同。表示该测试运行在此包下,说白了就是在同一个进程-->

<spanstyle="color:#0000ff;"><instrumentationandroid:name="android.test.InstrumentationTestRunner"

第二步,看代码

首先是AndroidTestCase的简单应用

Java代码收藏代码

importjunit.framework.Assert;

importandroid.test.AndroidTestCase;

importandroid.util.Log;

/**

*需要测试类要继承AndroidTestCase

*AndroidTestCase多用于对系统中业务逻辑的测试

*需要与界面交互的测试一般采用InstrumentationTestCase

*@authorandroidtoast

*

*/

publicclassSomeServiceTestextendsAndroidTestCase{

privatestaticfinalStringTAG="SomeServiceTest";

SomeServicesome;

protectedinta;

protectedintb;

//初始化测试环境在实例化当前类的时候自动调用此方法

@Override

protectedvoidsetUp()throwsException{

super.setUp();

some=newSomeService();

a=3;

b=8;

}

//测试结束后调用此方法,用于清理测试环境中得变量

@Override

protectedvoidtearDown()throwsException{

super.tearDown();

Log.i(TAG,"TestOver!");

}

//测试getAdd方法

publicvoidtestAdd()throwsException{

Log.d(TAG,"testAdd");

intresult=some.getAdd(a,b);

Assert.assertEquals(11,result);

}

}

InstrumentationTestCase应用代码:

Java代码收藏代码

importandroid.content.Intent;

importandroid.os.SystemClock;

importandroid.test.InstrumentationTestCase;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

/**

*InstrumentationTestCase多用于测试与组件相关的操作

*@authorandroidtoast

*

*/

publicclassJUnitActivityTestextendsInstrumentationTestCase{

JUnitActivitymActivityTested;

publicJUnitActivityTest(){

}

/**

*初始化测试环境

*/

@Override

protectedvoidsetUp()throwsException{

super.setUp();

//意图用于激活Activity

Intentintent=newIntent();

//设置用于激活哪个Activity

//启动一个新的任务并在后台运行

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//获得Instrumentation启动一个活动

mActivityTested=(JUnitActivity)getInstrumentation().startActivitySync(intent);

}

//清理资源

@Override

protectedvoidtearDown()throwsException{

mActivityTested.finish();//测试完成后关闭Activity

super.tearDown();

}

//测试方法(其实就是一个点击按钮然后隐藏自身显示文本这么一简单功能)

publicvoidtestClickButtonToShowText()throwsException{

TextViewtv=(TextView)mActivityTested.findViewById(R.id.text);

SystemClock.sleep(2000);//等待两秒

//如果当前的TextView的状态是隐藏的则正确通过

assertEquals("TextViewshouldbeGonebeforeButtonClicking",

View.GONE,tv.getVisibility());

Buttonbtn=(Button)mActivityTested.findViewById(R.id.button);

//在主线程里执行点击按钮这一动作

getInstrumentation().runOnMainSync(newPerformClick(btn));

SystemClock.sleep(2000);

assertEquals("TextViewshouldbeVisibleafterButtonClicking",

View.VISIBLE,tv.getVisibility());

}

privateclassPerformClickimplementsRunnable{

ButtonmBtnClicked;

publicPerformClick(Buttonbutton){

mBtnClicked=button;

}

publicvoidrun(){

mBtnClicked.performClick();

}

}

}

相关推荐