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();
}
}
}