【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4020443.html

【正文】

一、单元测试的引入:

如果只是普通的一个小程序,编写测试是有些多此一举,但是当项目比较庞大的时候,一般都应该去编写单元测试。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代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.m05_sharedpreferencestest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" /> <instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.m05_sharedpreferencestest" >
</instrumentation>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" /> <activity android:name="com.example.m05_sharedpreferencestest.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>
</application> </manifest>

上方11至14行以及21行是我们所添加的代码。请将第13行改为自己的包名。

编写一个类,我们需要做的是在里面实现记住密码的功能:

通过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代码如下:

 package com.example.m05_sharedpreferencestest;

 import java.util.Map;
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;
} //方法:通过SharedPreferences保存用户输入的用户名、密码(各种数据类型)
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;
} //方法:数据存储之后,然后读出来
public Map<String, ?> getSharePreference(String fileName) {
Map<String, ?> map = null;
SharedPreferences preferences = context.getSharedPreferences(fileName,
Context.MODE_PRIVATE);
map = preferences.getAll();
return map;
} }

MyTest.java代码如下:

 package com.example.m05_sharedpreferencestest;

 import java.util.HashMap;
import java.util.Map; import android.test.AndroidTestCase;
import android.util.Log; public class Mytest extends AndroidTestCase { private final String TAG = "Mytest";
public Mytest() {
// TODO Auto-generated constructor stub
} public void save(){
LoginService loginService = new LoginService(getContext());
boolean flag = loginService.saveLoginMsg("smyhvae", "smyh");
//如果数据保存成功,saveLoginMsg()方法将返回true值。
Log.d(TAG, ""+flag);
} public void save2() {
LoginService service = new LoginService(getContext());
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "jack");
map.put("age", 23);
map.put("salary", 3000.0f);
map.put("id", 1010010101l);
map.put("isManager", true);
boolean flag = service.saveSharePreference("msg", map);
Log.i(TAG, "--->>" + flag);
} public void read() {
LoginService service = new LoginService(getContext());
Map<String, ?> map = service.getSharePreference("msg");
Log.i(TAG, "--->" + map.get("name"));
Log.i(TAG, "--->" + map.get("age"));
Log.i(TAG, "--->" + map.get("salary"));
Log.i(TAG, "--->" + map.get("id"));
Log.i(TAG, "--->" + map.get("isManager"));
}
}

如果执行read()方法的单元测试,后台输出如下:

三、常见测试方法:

黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。

白盒测试: 又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。

单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。

功能测试: 根据产品特性、操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求。

压力测试: 主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为。

集成测试: 是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口

备注:黑盒测试,不看代码结构,从用户的角度测试功能,例如玩某一款游戏来测试。白盒测试:通过代码测试功能。

软件测试可以从不同的角度加以分类:
基于是否关注软件结构与算法:

  • 黑盒测试
  • 白盒测试

基于是否执行被测试软件:

  • 静态测试
  • 动态测试

基于测试的不同阶段:

  • 单元测试
  • 集成测试
  • 系统测试
  • 验收测试

此外还有压力测试等。

Android系列----JUnit单元测试的使用的更多相关文章

  1. 单元测试系列:JUnit单元测试规范

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...

  2. 单元测试系列之三:JUnit单元测试规范

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...

  3. Android使用JUnit进行单元测试

    前言:为什么要进行单元测试?单元测试能快速是开发者,找到代码中的问题所在,因为是单元测试,所以代码只执行响应的测试单元,执行快解决问题的效率高,同时提高代码的质量. Android中的单元测试可简单分 ...

  4. JUnit单元测试框架的使用

    http://blog.csdn.net/mao520741111/article/details/51462215 原文地址 http://www.open-open.com/lib/view/op ...

  5. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  6. 在Android中进行单元测试遇到的问题

    问题1.Cannot connect to VM  socket closed 在使用JUnit进行测试的时候,遇到这个问题.网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还 ...

  7. Android(java)学习笔记165:Android的Junit调试

    编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题 ...

  8. Android上的单元测试

    Android上的单元测试 http://www.sina.com.cn  2009年12月04日 16:07  IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...

  9. Android(java)学习笔记108:Android的Junit调试

    1. Android的Junit调试: 编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一 ...

随机推荐

  1. abap 选择屏幕事件AT SELECTION-SCREEN

    AT SELECTION-SCREEN (1).其实就像一个FORM,所以在这个事件里声明的变量都是局部变量. (2).根据SY-UCOMM这个系统变量可以判断用户的命令 (3).在这个事件里响应的是 ...

  2. SharePoint 更新文档库文档标题(Title)字段

    前言:记录下写代码中遇到的小问题,帮同事写一个批量更新文档库标题字段的小程序,本来以为就Update一下就可以了,10分钟可以搞定.结果10分钟过去了,代码写好了,执行起来不报错,调试也没问题,只是要 ...

  3. How to Use Telnet to Test SMTP Communication

    Topic Last Modified: 2005-05-24 Telnet is an extremely useful tool for troubleshooting issues relate ...

  4. 高性能JS笔记2——数据存取

    数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...

  5. 参加2015年TOP100会议的零散笔记

    2015年出差很少,感到整个技术都已经荒废了,收到12月份TOP100的会议通知后,还是去充点电吧,不然心慌啊.对于软件大会这种大杂烩式的会议已经没有多少兴趣了,看看这个TOP100组织得有何不同? ...

  6. IOS编程思想

    从今天起想走进IOS架构的大门,一直不屑于学习第三方框架,觉得框架也是一点点代码给垒起来的,只要掌握了代码就可以了,殊不知垒代码的过程才是最重要的,而这个过程又岂是一朝一夕就能达到完美境界的,达到完美 ...

  7. E/AndroidRuntime(1636): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.***.app.wx.MainActivity} : android.view.InflateException: Binary XML file line #51 :

    类中加载的xml中,所自定义组件的包名错误(xml中51行错误:自定义组件包名写错了).

  8. 【读书笔记】iOS-NSNumber

    NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int,float或struct.但是你可以用对象来封装基本数值.例如,将int型数据封装到一个对象中,然后就 ...

  9. IOS之UI--小实例项目--综合使用

    前言: 本博文是基于前一个小实例项目:IOS之UI--小实例项目--添加商品和商品名 进行继续综合学习积累的. 内容大纲 01-综合使用01-plist的使用 02-综合使用02-模型取代字典的好处分 ...

  10. IOS设计模式-抽象工厂

    抽象工厂的灵活性要比简单工程的灵活性强. 抽象工厂的UML图(第一次画UML图,可能关系和箭头的图意义有错误,但是请不要以建模规范去看图,以最基本的结合后面OC代码,理解相关关系): 抽象工厂原理:抽 ...