Android系列----JUnit单元测试的使用
【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号: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单元测试的使用的更多相关文章
- 单元测试系列:JUnit单元测试规范
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...
- 单元测试系列之三:JUnit单元测试规范
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...
- Android使用JUnit进行单元测试
前言:为什么要进行单元测试?单元测试能快速是开发者,找到代码中的问题所在,因为是单元测试,所以代码只执行响应的测试单元,执行快解决问题的效率高,同时提高代码的质量. Android中的单元测试可简单分 ...
- JUnit单元测试框架的使用
http://blog.csdn.net/mao520741111/article/details/51462215 原文地址 http://www.open-open.com/lib/view/op ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- 在Android中进行单元测试遇到的问题
问题1.Cannot connect to VM socket closed 在使用JUnit进行测试的时候,遇到这个问题.网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还 ...
- Android(java)学习笔记165:Android的Junit调试
编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题 ...
- Android上的单元测试
Android上的单元测试 http://www.sina.com.cn 2009年12月04日 16:07 IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...
- Android(java)学习笔记108:Android的Junit调试
1. Android的Junit调试: 编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一 ...
随机推荐
- java微信开发(wechat4j)——access_token中控服务器实现
access_token是与微信服务器交互过程中的一个凭证,每次客户服务器主动与微信服务器通信都需要带上access_token以确认自己的身份.wechat4j内部封装了对access_token的 ...
- 向java的main()传入大量参数
项目中有一些用java写成的可执行的工具,需要调用者传入大量的参数.最开始,我使用的是最传统的方式,直接一个传入参数数组,于是有如下这么壮观的代码: public static void main(S ...
- HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释
<!-- -->是HTML的注释标签,使用<和>是符合HTML标签语法规则的. /* */(注释代码块).//(注释单行)是CSS和JS的注释标签. 两种注释有各自的使用环境, ...
- 2015年第6本(英文第5本):Harry Potter 1 哈利波特与魔法石
书名: Harry Potter 1 – Harry Potter and the Sorcerer’s Stone 作者:J.K. Rowling 单词数:7.8万 不重复单词数:6000(我怎么感 ...
- 搭建Android 5.0开发环境
1.Android SDK的安装 下载地址:http://developer.android.com/index.html 访问网站的话请自备梯子 选择:adt-bundle-windows-x86_ ...
- Static Cell-静态TableView
使用静态TableView有两个前提,1.要在Storyboard上 2.需要使用TableViewController PS:如果需要设置不同的cell的高度不同的话,还是需要使用tableVie ...
- 【转】self.myOutlet=nil、viewDidUnload、dealloc的本质剖析
对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大,设计再漂亮,如果内存控制不好,也难逃程序莫名退出的噩运,这与网页开发是完全不同的. 内存控制里面有很多门道,在这里分析一下 ...
- 网易新闻iOS版使用的18个开源组件
转载来自:http://www.jianshu.com/p/8952944f7566 原文最后编辑时间:2015.05.19 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFN ...
- SQL Server智能感知如何更新
经常用sql server发现一个问题,比如说我刚刚添加个表或者字段,这时候在sqlserver里面写sql语句时,没有智能提示,这个问题我以前一直不是太注意.今天好好找了下解决方法,这里做下分享. ...
- Maven学习遇到的第一个错误
现在开始学习maven,我是在极客学院看的视频学习的,学习当然会遇到异常,下面是我遇到的第一个异常 [ERROR] Failed to execute goal org.apache.maven.pl ...