Android单元测试Junit (一)
1、在eclips中建立一个Android工程,具体信息如下:
2、配置单元测试环境,打开AndroidManifest.xml,具体代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.milan.junit" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.milan.junit.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--使用单元测试库--> <uses-library android:name="android.test.runner"/> </application> <!-- 声明Android框架和目标测试包--> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.milan.junit" /> </manifest>
说明:
1、<uses-library android:name="android.test.runner"/> 这句,放在application内部。
2、android:targetPackage 这个属性,一般为应用程序的包名,必须和xml中manifest节点的package同名。
3、创建一个包com.milan.service,这个包下面再创建一个类 Person,用于测试的时候调用。
package com.milan.service; public class Person { public int getAge(String age){ return new Integer(age); } }
4、在com.milan.junit包下面,建一个PersonTest类,代码如下:
package com.milan.junit; import com.milan.service.Person; import android.test.AndroidTestCase; public class PersonTest extends AndroidTestCase { ///用例1,传入非数字 public void test01(){ Person person = new Person(); person.getAge("milan"); } //用例2,传入数字 public void test02(){ Person person = new Person(); person.getAge("1"); } }
5、选中PersonTest.java,右键选择Run As 选择Android Junit Test 运行单元测试,如图:
从上图可以看到,test01的测试结果为失败。失败原因为:java.lang.NumberFormatException: Invalid int: "milan",
test02的测试结果为通过。
如果没有Junit运行结果,可以在eclips的Window菜单下,选择Show View--Other--Java--Junit 中打开。
6、运行单个测试用例
eclips的Window菜单下,选择Show View--Other--General--Outline打开大纲视图,右键测试用例,即可运行单个测试用例。如图:
同理,如果需要执行整个项目的测试用例,可选中整个项目,用Android Junit Test运行即可。
7、断言
当我们获得程序的运行结果,我们希望Junit能够自动判断 将实际结果和期望结果是否一致。这个时候我们就可以用到Junit自带的断言。
修改PersonTest类,为以下代码:
package com.milan.junit; import com.milan.service.Person; import android.test.AndroidTestCase; public class PersonTest extends AndroidTestCase { ///用例1,传入非数字 public void test01(){ Person person = new Person(); int i= person.getAge("milan"); assertEquals(1, i); } //用例2,传入数字,断言有message public void test02(){ Person person = new Person(); int i= person.getAge("1"); assertEquals("传入数字",2,i); } //用例2,传入数字,断言无message public void test03(){ Person person = new Person(); int i= person.getAge("1"); assertEquals(1,i); } }
然后运行结果为:
如果传入了message,一旦用例不通过,会在右边的错误详细里,列出message。
8、其他断言
JUnit提供丰富的断言,来满足我们不同的比对需求。按住Ctrl键,点击代码中的assertEquals,可以看到Assert类里面多支持的断言函数的参数类型:
大家有空可以多试试。这里就不一一讲解了。
其他信息
如出现Test run failed:Unable to find instrumentation target package错误
是因为 android:targetPackage="com.milan.junit" 必须和
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.milan.junit"
package相同的包名