[Android开发常见问题-17] Android JUnit Test (两种方法)
2013-08-13 17:19
295 查看
自动化单元测试可以做许多的事,并帮你节省时间。它也可以被用作快速检验新建工程或进行冒烟测试。始终,单元测试是作为一种有效的、系统的检验应用程序各功能执行的方式。AndroidSDK支持JUnit的自动化单元测试。本教程假设你已熟悉Android和JUnit在Eclipse的使用。
单元测试方式一:[基于应用的工程上进行单元测试]
根据上面的程序代码结构图,例如我们要测试包com.andyidea.demo包中的JUnitService.java中的某个方法的正确性。例如该对象中有个add方法,计算两个整型数据的和
[html]view
plaincopy
packagecom.andyidea.demo;
publicclassJUnitService{
publicintadd(inta,intb){
returna+b;
}
}
然后我们在MyJnuitTest.java中编写单元测试代码,[注意:该测试类一定要继承AndroidTestCase类]以验证程序结果是否是我们所期望的一致
[html]view
plaincopy
packagecom.andyidea.jnuit;
importjunit.framework.Assert;
importandroid.test.AndroidTestCase;
importcom.andyidea.demo.JUnitService;
publicclassMyJnuitTestextendsAndroidTestCase{
publicvoidtestAdd()throwsException{
JUnitServicejs=newJUnitService();
intsum=js.add(1,2);
Assert.assertEquals(3,sum);
}
}
同时我们还需要在Manifest.xml清单配置文件中配置下:以红色标志出来需要配置的地方。
[html]view
plaincopy
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.andyidea.demo"
android:versionCode="1"
android:versionName="1.0">
<spanstyle="color:#ff0000;"><!--代表把单元测试框架中的一些依赖库引入进来-->
<uses-sdkandroid:minSdkVersion="8"/></span>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<uses-libraryandroid:name="android.test.runner"/>
<activity
android:name="com.andyidea.demo.JUnitTestDemoActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<spanstyle="color:#ff0000;"><!--代表配置单元测试框架的启动装置,启动装置有好几个类,可以选择,一般情况下我们使用上面这个。
targetPackage与上面的package相同,代表单元测试框架和当前应用是处于同一个进程中-->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Testformyapp"
android:targetPackage="com.andyidea.demo"/></span>
</manifest>
最后,打开eclipse中的outline窗口,其中会显示单元测试类的所有的方法然后想要测试哪个方法,则在哪个测试方法上右键鼠标,选择RunAs,然后再选择AndroidJUnitTest即可,如果是正常的,则会如下:
如果有异常或者错误,则会出现如下情况:
单元测试方式二:
其实这种方式更加简单,这种方式是单独创建一个单元测试的工程来进行测试。即创建一个AndroidTestProject,然后选择需要单元测试的项目就OK了,通过这种方式进行单元测试的话就不用进行上面的配置,其实创建这种工程的时候,默认已经帮我们配置好了。如何进行测试如下:
创建一个Android的JUnit项目
如果你的Eclipse中已经有Android项目,就不用再创建了。如果你的Eclipse中没有Android项目,你可以创建一个JUnit项目,在创建JUnit项目的同时也会为你创建Android项目。
对现有的Android项目,在Eclipse中右键单击,选择“AndroidTools”,然后“NewTestProject...”,如下图:
如果是新建Android项目,在“NewAndroidProject”对话框中,按“Next”按钮,如下图:
无论按照上面哪种方式,你都会在这个时候创建Android项目的新测试项目。创建测试项目的对话框,如下图所示,通常会自动填写上一些标准的命名约定等细节。如果没有,请自己填写,并创造该项目。
在Android中创建一个JUnit测试用例
Android应用程序通常是由一些Activity类组成的。事实上,每一个ACtivity都可以是一个独立实体,进行测试。AndroidSDK中包含了几个类来测试ACtivity类。现在我们将使用一个。
右键单击你的测试项目。选择“New”,然后“JUnitTestCase”:
在新建JUnit测试用例对话框上填写,使用超类是android.test.ActivityInstrumentTestCase2,其中T是我们要测试的Activity,如下图:
点击“完成”按钮,这个类就创建成功了。注意:由向导创建的默认构造函数是不正确的。我们需要修改它,让它不带任何参数,调用不同的super()的方法,代码如下:
setUp()方法中,应配置运行这个测试用例所需的所有东西。Activity实例随时可以被getActivity()方法调用。例如:如果我们想在测试中显示一个TextView在Activity上,我们可以实现setUp()方法,如下:
在Android中添加单元测试
此时你可以创建各种测试。你可以获取到Activity布局上所有控件,以及在应用程序的任何代码。由于使用Activity测试用例,我们可能感兴趣于用户界面,布局,及功能。让我们看看TextView控件显示在屏幕上。
所有的测试方法必须用“test”做前缀。上面,我们已经创建了一个测试名为“HelloTextVisibility”的方法。如果测试通过或失败,assertFalse()都会被调用。(assertTrue()方法只有是true时调用。)
运行JUnit测试用例
运行测试和测试用例,点击Eclipse的Debug,选择AndroidJUnit测试。如果你喜欢,你还可以创建一个AndroidJUnit测试配置,自定义这些设置。
如下图,我们的小应用程序在横屏模式下,“HelloTextVisibility”测试通过:
但在竖屏模式下,未能通过测试:
很显然,我们的布局设计在竖屏模式下显示不正确。(注:这可能是设置的宽度像素超过了手机的,而没有使用合适的单位,如DP或是match_parent。)
Android应用程序的质量在于单元测试
创建单元测试时,必须小心谨慎。如果测试用例不正确,测试的东西通过了,也没有价值。这是非常糟糕的,因为它可能掩盖了一些问题。所以测试用例与代码本身一样重要。测试测试用例的主要方式是通过做代码审查,并确保它们确实在测试。
当然,测试Android框架的功能对于你的app来说,没有起到特别大的作用。比如,测试设置文本字段的值,然后读取它,看它是否相同。测试常规的TextView,并不是特别有意义的(除非你的SDK在一个新的设备上使用)。然而,如果是测试你自己实现的TextView,那就有必要了。
这并不是说任何代码框架都是那样的完美无缺,但测试的事情是值得花许多心思的去写测试开始的。如果失败了,比起的你的应用程序,你将有更大的问题。还有是对SDK之间的细微差别的测试,在上面的例子中,我们没有这么做,是因为我们使用了正确的SDK。
因此,如果你是自动化单元测试的新手,我们建议你做一些这方面的课题研究。一个不错的地方是JUnit.org。
结论
在本教程中,你已经学会如何快速添加一个新的测试项目,并在Eclipse的Android项目中使用JUnit对你的app执行自动化测试。单元测试可以为逻辑测试,功能测试和用户界面测试等,不再是专门手动测试移动应用。然而,使用一个包含自动化单元测试的套件,有几大好处:它可以节省时间,金钱和资源,以及提供一套可靠的,重复性的测试,并且可以运行在许多不同的设备配置中。
单元测试方式一:[基于应用的工程上进行单元测试]
根据上面的程序代码结构图,例如我们要测试包com.andyidea.demo包中的JUnitService.java中的某个方法的正确性。例如该对象中有个add方法,计算两个整型数据的和
[html]view
plain
packagecom.andyidea.demo;
publicclassJUnitService{
publicintadd(inta,intb){
returna+b;
}
}
然后我们在MyJnuitTest.java中编写单元测试代码,[注意:该测试类一定要继承AndroidTestCase类]以验证程序结果是否是我们所期望的一致
[html]view
plain
packagecom.andyidea.jnuit;
importjunit.framework.Assert;
importandroid.test.AndroidTestCase;
importcom.andyidea.demo.JUnitService;
publicclassMyJnuitTestextendsAndroidTestCase{
publicvoidtestAdd()throwsException{
JUnitServicejs=newJUnitService();
intsum=js.add(1,2);
Assert.assertEquals(3,sum);
}
}
同时我们还需要在Manifest.xml清单配置文件中配置下:以红色标志出来需要配置的地方。
[html]view
plain
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.andyidea.demo"
android:versionCode="1"
android:versionName="1.0">
<spanstyle="color:#ff0000;"><!--代表把单元测试框架中的一些依赖库引入进来-->
<uses-sdkandroid:minSdkVersion="8"/></span>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<uses-libraryandroid:name="android.test.runner"/>
<activity
android:name="com.andyidea.demo.JUnitTestDemoActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<spanstyle="color:#ff0000;"><!--代表配置单元测试框架的启动装置,启动装置有好几个类,可以选择,一般情况下我们使用上面这个。
targetPackage与上面的package相同,代表单元测试框架和当前应用是处于同一个进程中-->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Testformyapp"
android:targetPackage="com.andyidea.demo"/></span>
</manifest>
最后,打开eclipse中的outline窗口,其中会显示单元测试类的所有的方法然后想要测试哪个方法,则在哪个测试方法上右键鼠标,选择RunAs,然后再选择AndroidJUnitTest即可,如果是正常的,则会如下:
如果有异常或者错误,则会出现如下情况:
单元测试方式二:
其实这种方式更加简单,这种方式是单独创建一个单元测试的工程来进行测试。即创建一个AndroidTestProject,然后选择需要单元测试的项目就OK了,通过这种方式进行单元测试的话就不用进行上面的配置,其实创建这种工程的时候,默认已经帮我们配置好了。如何进行测试如下:
创建一个Android的JUnit项目
如果你的Eclipse中已经有Android项目,就不用再创建了。如果你的Eclipse中没有Android项目,你可以创建一个JUnit项目,在创建JUnit项目的同时也会为你创建Android项目。
对现有的Android项目,在Eclipse中右键单击,选择“AndroidTools”,然后“NewTestProject...”,如下图:
如果是新建Android项目,在“NewAndroidProject”对话框中,按“Next”按钮,如下图:
无论按照上面哪种方式,你都会在这个时候创建Android项目的新测试项目。创建测试项目的对话框,如下图所示,通常会自动填写上一些标准的命名约定等细节。如果没有,请自己填写,并创造该项目。
在Android中创建一个JUnit测试用例
Android应用程序通常是由一些Activity类组成的。事实上,每一个ACtivity都可以是一个独立实体,进行测试。AndroidSDK中包含了几个类来测试ACtivity类。现在我们将使用一个。
右键单击你的测试项目。选择“New”,然后“JUnitTestCase”:
在新建JUnit测试用例对话框上填写,使用超类是android.test.ActivityInstrumentTestCase2,其中T是我们要测试的Activity,如下图:
点击“完成”按钮,这个类就创建成功了。注意:由向导创建的默认构造函数是不正确的。我们需要修改它,让它不带任何参数,调用不同的super()的方法,代码如下:
1 | public ScreenValidation() { |
2 | super ( "com.mamlambo.testingproject.TestingProjectActivity" , |
3 | TestingProjectActivity. class ); |
4 | } |
1 | TextView helloText; |
2 | protected void setUp() throws Exception { |
3 | super .setUp(); |
4 | helloText =(TextView)getActivity(). |
5 | findViewById(R.id.hello_textview); |
6 | } |
此时你可以创建各种测试。你可以获取到Activity布局上所有控件,以及在应用程序的任何代码。由于使用Activity测试用例,我们可能感兴趣于用户界面,布局,及功能。让我们看看TextView控件显示在屏幕上。
01 | public void testHelloTextVisibility() { |
02 | View container=getActivity().findViewById(R.id.container_layout); |
03 | int boundaryWidth =container.getWidth(); |
04 | int boundaryHeight =container.getHeight(); |
05 |
06 | int [] location= new int [ 2 ]; |
07 | container.getLocationOnScreen(location); |
08 |
09 | int [] helloTextLocation= new int [ 2 ]; |
10 | helloText.getLocationOnScreen(helloTextLocation); |
11 |
12 | Rect textRect= new Rect(); |
13 | helloText.getDrawingRect(textRect); |
14 |
15 | boolean widerThanBoundary =(textRect.width()>boundaryWidth); |
16 | boolean tallerThanBoundary =(textRect.height()>boundaryHeight); |
17 | boolean extendsOffRight =location[ 0 ] +boundaryWidth |
18 | > helloTextLocation[ 0 ] +textRect.width(); |
19 | assertTrue( "Text widerthanboundary" , widerThanBoundary); |
20 | assertTrue( "Text tallerthanboundary" , tallerThanBoundary); |
21 | assertTrue( "Text goesoffrightside" , extendsOffRight); |
22 |
23 | // ...andsoon |
24 | } |
运行JUnit测试用例
运行测试和测试用例,点击Eclipse的Debug,选择AndroidJUnit测试。如果你喜欢,你还可以创建一个AndroidJUnit测试配置,自定义这些设置。
如下图,我们的小应用程序在横屏模式下,“HelloTextVisibility”测试通过:
但在竖屏模式下,未能通过测试:
很显然,我们的布局设计在竖屏模式下显示不正确。(注:这可能是设置的宽度像素超过了手机的,而没有使用合适的单位,如DP或是match_parent。)
Android应用程序的质量在于单元测试
创建单元测试时,必须小心谨慎。如果测试用例不正确,测试的东西通过了,也没有价值。这是非常糟糕的,因为它可能掩盖了一些问题。所以测试用例与代码本身一样重要。测试测试用例的主要方式是通过做代码审查,并确保它们确实在测试。
当然,测试Android框架的功能对于你的app来说,没有起到特别大的作用。比如,测试设置文本字段的值,然后读取它,看它是否相同。测试常规的TextView,并不是特别有意义的(除非你的SDK在一个新的设备上使用)。然而,如果是测试你自己实现的TextView,那就有必要了。
这并不是说任何代码框架都是那样的完美无缺,但测试的事情是值得花许多心思的去写测试开始的。如果失败了,比起的你的应用程序,你将有更大的问题。还有是对SDK之间的细微差别的测试,在上面的例子中,我们没有这么做,是因为我们使用了正确的SDK。
因此,如果你是自动化单元测试的新手,我们建议你做一些这方面的课题研究。一个不错的地方是
结论
在本教程中,你已经学会如何快速添加一个新的测试项目,并在Eclipse的Android项目中使用JUnit对你的app执行自动化测试。单元测试可以为逻辑测试,功能测试和用户界面测试等,不再是专门手动测试移动应用。然而,使用一个包含自动化单元测试的套件,有几大好处:它可以节省时间,金钱和资源,以及提供一套可靠的,重复性的测试,并且可以运行在许多不同的设备配置中。
相关文章推荐
- [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法
- [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法
- Android 搭建开发环境 常见问题与解决方法
- Android开发常见问题及解决方法小结
- Android开发由eclipse转Android Studio中一些常见出错问题解决方法
- Android开发常见问题及解决方法
- Android开发环境搭建及常见问题解决方法
- Android开发中使用照相机功能 及其常见问题解法方法
- Android开发环境搭建及常见问题解决方法
- Android开发环境搭建和常见问题的解决方法
- Android开发环境搭建及常见问题解决方法
- Android开发常见问题及解决方法
- Android开发常见问题及解决方法
- Android常见问题及开发经验总结(三)
- android studio 开发环境搭建及常见问题解决方法
- WinCE6.0流驱动开发的两种方法及驱动加载失败问题解决
- 5个Android开发中比较常见的内存泄漏问题及解决办法
- 【转】android开发中关于模拟器emulation的常见问题
- Android遇到的各种问题(一)——开发中Theme.AppCompat.Light的解决方法
- Android开发常见bug及解决方法 (一)