首页 > 代码库 > Android系列----JUnit单元测试的使用
Android系列----JUnit单元测试的使用
?【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:http://www.cnblogs.com/smyhvae/p/4020443.html
联系方式:smyhvae@163.com
【正文】
一、单元测试的引入:
如果只是普通的一个小程序,编写测试是有些多此一举,但是当项目比较庞大的时候,一般都应该去编写单元测试。JUnit测试是白盒测试,即主要是程序员自己对开发的方法进行功能性测试。JUnit是一套框架,Android中也沿用了这一套框架。
在Android中使用JUnit测试大致分如下几个步骤:
- (1)在AndroidManifest.xml中增加对JUnit的支持,并制定测试项目包。
- (2)在AndroidManifest.xml中<application.../>节点中增加一个<uses-library...>节点,name属性为android.test.runner。
- (3)在编写待测试方法后,新建一个类,继承AndroidTestCase,在其中编写测试用例代码。
- (4)鼠标左键在测试用例方法上,Run As→Android JUnit Test。
二、步骤详解:
(1)配置清单文件:
新建Android工程文件,命名为m05_SharedPreferencesTest,
首先在AndroidManifest.xml添加一个Instrumentation:
指定Instrumentation的name与TargetPackage:
然后保存。
紧接着在<application.../>节点中增加<uses-library android:name="android.test.runner" />。
完成后,AndroidManifest.xml代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.m05_sharedpreferencestest" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="16" />10 11 <instrumentation12 android:name="android.test.InstrumentationTestRunner"13 android:targetPackage="com.example.m05_sharedpreferencestest" >14 </instrumentation>15 16 <application17 android:allowBackup="true"18 android:icon="@drawable/ic_launcher"19 android:label="@string/app_name"20 android:theme="@style/AppTheme" >21 <uses-library android:name="android.test.runner" />22 23 <activity android:name="com.example.m05_sharedpreferencestest.MainActivity"24 android:label="@string/app_name" >25 <intent-filter>26 <action android:name="android.intent.action.MAIN" />27 28 <category android:name="android.intent.category.LAUNCHER" />29 </intent-filter>30 </activity>31 </application>32 33 </manifest>
上方11至14行以及21行是我们所添加的代码。
编写一个类,我们需要做的是在里面实现记住密码的功能:
通过SharedPreferences保存用户输入的用户名、密码:
package com.example.m05_sharedpreferencestest;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;public class LoginService { private Context context; //为了获取SharedPreferences这个类,我们需要一个上下文对象 public LoginService(Context context) { // TODO Auto-generated constructor stub this.context = context; } //方法:通过SharedPreferences保存用户输入的用户名、密码 public boolean saveLoginMsg(String name,String pwd) { boolean flag = false; SharedPreferences sp = context.getSharedPreferences("login", 0); Editor editor = sp.edit(); editor.putString("username", name); editor.putString("password", pwd); flag = editor.commit(); return flag; }}
编写一个测试类,这个类需要继承AndroidTestCase,针对上面的方法进行测试:
package com.example.m05_sharedpreferencestest;import android.test.AndroidTestCase;import android.util.Log;public class Mytest extends AndroidTestCase { public Mytest() { // TODO Auto-generated constructor stub } public void save(){ LoginService loginService = new LoginService(getContext()); boolean flag = loginService.saveLoginMsg("smyhvae", "smyh"); //如果数据保存成功,saveLoginMsg()方法将返回true值。 Log.i("Mytest", ""+flag); }}
现在来运行单元测试中的这个方法。右键选中save()方法,选中run as -->Android JUnit Test:
当执行成功后,会显示绿色,如果是其他颜色,则出错:
我们同样也能在login.xml文件中查看到内容:
我们刚刚保存的只是字符串类型。如果想要保存任何数据类型,可以在LoginService.java中添加如下方法:
public boolean saveSharePreference(String fileName, Map<String, Object> map) { boolean flag = false; SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE); Editor editor = preferences.edit(); for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object object = entry.getValue(); if (object instanceof Boolean) { Boolean new_name = (Boolean) object; editor.putBoolean(key, new_name); } else if (object instanceof Integer) { Integer integer = (Integer) object; editor.putInt(key, integer); } else if (object instanceof Float) { Float f = (Float) object; editor.putFloat(key, f); } else if (object instanceof Long) { Long l = (Long) object; editor.putLong(key, l); } else if (object instanceof String) { String s = (String) object; editor.putString(key, s); } } flag = editor.commit(); return flag; }
运行单元测试后,msg.xml中的内容如下:
我们既然将数据存进去了,然后想将它读出来。需要再增加一个方法。代码实现见下面的内容。
【代码汇总】
总的来说,完整版代码如下:
LoginService.java代码如下:
1 package com.example.m05_sharedpreferencestest; 2 3 import java.util.Map; 4 import android.content.Context; 5 import android.content.SharedPreferences; 6 import android.content.SharedPreferences.Editor; 7 8 public class LoginService { 9 10 private Context context; //为了获取SharedPreferences这个类,我们需要一个上下文对象11 public LoginService(Context context) {12 // TODO Auto-generated constructor stub13 this.context = context;14 }15 16 //方法:通过SharedPreferences保存用户输入的用户名、密码(字符串类型)17 public boolean saveLoginMsg(String name,String pwd) {18 boolean flag = false;19 SharedPreferences sp = context.getSharedPreferences("login", 0);20 Editor editor = sp.edit();21 editor.putString("username", name);22 editor.putString("password", pwd);23 flag = editor.commit();24 return flag; 25 }26 27 //方法:通过SharedPreferences保存用户输入的用户名、密码(各种数据类型)28 public boolean saveSharePreference(String fileName, Map<String, Object> map) {29 boolean flag = false;30 SharedPreferences preferences = context.getSharedPreferences(fileName,31 Context.MODE_PRIVATE);32 Editor editor = preferences.edit();33 for (Map.Entry<String, Object> entry : map.entrySet()) {34 String key = entry.getKey();35 Object object = entry.getValue();36 if (object instanceof Boolean) {37 Boolean new_name = (Boolean) object;38 editor.putBoolean(key, new_name);39 } else if (object instanceof Integer) {40 Integer integer = (Integer) object;41 editor.putInt(key, integer);42 } else if (object instanceof Float) {43 Float f = (Float) object;44 editor.putFloat(key, f);45 } else if (object instanceof Long) {46 Long l = (Long) object;47 editor.putLong(key, l);48 } else if (object instanceof String) {49 String s = (String) object;50 editor.putString(key, s);51 }52 }53 flag = editor.commit();54 return flag;55 }56 57 //方法:数据存储之后,然后读出来58 public Map<String, ?> getSharePreference(String fileName) {59 Map<String, ?> map = null;60 SharedPreferences preferences = context.getSharedPreferences(fileName,61 Context.MODE_PRIVATE);62 map = preferences.getAll();63 return map;64 }65 66 }
MyTest.java代码如下:
1 package com.example.m05_sharedpreferencestest; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import android.test.AndroidTestCase; 7 import android.util.Log; 8 9 public class Mytest extends AndroidTestCase {10 11 private final String TAG = "Mytest";12 public Mytest() {13 // TODO Auto-generated constructor stub14 }15 16 public void save(){17 LoginService loginService = new LoginService(getContext());18 boolean flag = loginService.saveLoginMsg("smyhvae", "smyh");19 //如果数据保存成功,saveLoginMsg()方法将返回true值。20 Log.d(TAG, ""+flag);21 }22 23 24 public void save2() {25 LoginService service = new LoginService(getContext());26 Map<String, Object> map = new HashMap<String, Object>();27 map.put("name", "jack");28 map.put("age", 23);29 map.put("salary", 3000.0f);30 map.put("id", 1010010101l);31 map.put("isManager", true);32 boolean flag = service.saveSharePreference("msg", map);33 Log.i(TAG, "--->>" + flag);34 }35 36 37 public void read() {38 LoginService service = new LoginService(getContext());39 Map<String, ?> map = service.getSharePreference("msg");40 Log.i(TAG, "--->" + map.get("name"));41 Log.i(TAG, "--->" + map.get("age"));42 Log.i(TAG, "--->" + map.get("salary"));43 Log.i(TAG, "--->" + map.get("id"));44 Log.i(TAG, "--->" + map.get("isManager"));45 }46 }
如果执行read()方法的单元测试,后台输出如下:
Android系列----JUnit单元测试的使用