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应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一 ...
随机推荐
- 【FFmpeg】ffplay播放rtsp视频流花屏问题
问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...
- Android 手机卫士15--程序锁
1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvide ...
- [ASP.NET MVC] Model Binding With NameValueCollectionValueProvider
[ASP.NET MVC] Model Binding With NameValueCollectionValueProvider 范例下载 范例程序代码:点此下载 问题情景 一般Web网站,都是以H ...
- 领域对象模型(domain object model)
在Play程序中,模型(model)占据了核心地位.它是程序操作的信息的特定领域的表现方式. Martin Fowler这样定义模型: 负责表达业务概念,业务状态信息以及业务规则.尽管保存业务状态的技 ...
- javascript --- 将共享属性迁移到原型中去
当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ th ...
- SAP_Web_Service开发配置
第一章 SAP创建WS 1.1 概要技术说明 1.2 创建RFC函数 1.3 创建WS 1.4 外部系统访问配置 第二章 SAP调用WS 2 ...
- UWP开发中的流媒体
写这篇的目的只是为了记住这个东西, win10原生支持HLS了 AdaptiveMediaSourceCreationResult amsResult = await AdaptiveMediaSou ...
- Android开发者的Git&Github(一)
安装Git: Linux(以Ubuntu为例): sudo apt-get install git-core Windows: 访问网址http://msysgit.github.io/下载安装包 下 ...
- C语言-02-基本运算
一.算术运算 种类 1> 加(+),同时可以表示正号 2> 减(-),同时可以表示负号 3> 乘(*) 4>除(/) 5>取余(%) 关于类型转换 1>自动类型转换 ...
- UVa 106 - Fermat vs Pythagoras(数论题目)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...