【声明】

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

生命壹号: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. smartstore-net

    记录一下,抽空下载源码了研究下

  2. PHP 操作socket 实现简易聊天室

    <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP ); socket_bind($socket ,'127.0.0.1', ...

  3. ADO.NET 完整的修改和删除

    namespace 完整修改{ class Program { static void Main(string[] args) { bool has = false; Console.Write(&q ...

  4. Error writing file‘frm‘(Errcode: 28)

    Error writing file‘frm‘(Errcode: 28)   mysql出现这个错误,表示磁盘已经满了,该增加容量了.

  5. Angular 核心概念2

    自定义指令 指令增强了 HTML,提供额外的功能 内置的指令基本上已经可以满足我们的绝大多数需要了 少数情况下我们有一些特殊的需要,可以通过自定义指令的方式实现 普通指令 语法 <div hel ...

  6. 通过FTP连接Azure上的网站

    下载发布文件 使用记事本(或其他文本工具)打开 找到ftp连接地址以及用户名.密码 使用ftp工具进行连接 输入相应参数,连接即可

  7. SharePoint 2010 文档管理之点击次数

    前言:很多场景下,我们都需要对一篇文章或者文档的点击次数进行统计,然而SharePoint本身并没有给我们设计这样一个字段,所以我们需要通过简单的字段开发来实现这样一个功能. 一.创建项目: 1. 创 ...

  8. 【原】兼容IOS6以及旧版本的旋转处理方法,心得总结

    最近的项目需要频繁处理屏幕的旋转以及各控件的自适应坐标.IOS6出来之后,屏幕旋转的处理方法变得复杂很多.在查阅了很多资料以及动手测试之后,得出以下几点精简的体会: 对于IOS6.0以上版本: 1.如 ...

  9. nodejs socket

    server.js var net = require('net'); var clientList = []; var HOST = '127.0.0.1'; var PORT = 6969; va ...

  10. iOS开发之保存照片到自己创建的相簿

    iOS开发之保存照片到自己创建的相簿 保存照片还可以用ALAssetsLibrary,ALAssetsLibrary提供了我们对iOS设备中的相片.视频的访问,是连接应用程序和相册之间访问的一个桥梁. ...