软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的。本文将介绍在android下利用eclipse进行开发时如何使用JUnit进行单元测试。

一、测试的分类(仅举例其中一些方法)

【根据测试是否知道代码】

1、黑盒测试(测试的时候不知道具体代码):指的是把被测的软件看作是一个黑盒子,我们不去关心盒子里面的结构是什么样子的,只关心软件的输入数据和输出结果。它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

2、白盒测试(测试的时候需要了解具体的代码):指的是把盒子盖子打开,去研究里面的源代码和程序结果。是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。

3、灰盒测试(灰盒测试介于黑盒测试与白盒测试之间):可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样的一种灰盒的方法。

【根据测试的粒度】

1、方法测试(function test):验证模块的功能。

2、单元测试(unit test):在最低的功能/参数上验证程序的准确性,比如测试一个函数的正确性。

3、集成测试(intergration test):验证几个互相有依赖关系的模块的功能。

【根据测试的次数】

1、冒烟测试(smoke test):指的是测试人员在同一时间对软件进行大量的点击或者功能测试,测试软件遭到这样的压力时是否能够扛得住,关键在于同一个用户在极短的时间内对软件进行大量重复的测试。

2、压力测试(pressure test):指的是软件或者网站在同一时间内被大量的用户访问,突出的是软件或者网站被大量客户访问时的抗压能力,一般运用于大型网站的测试。

二、举例对其中的JUnit测试进行讲解

这里我们想要对安卓应用程序中AppService类中的randomArray()方法进行单元测试。

注:试直接使用java的JUnit是无效的,应为java应用程序时在java虚拟机(JVM)运行的,而安卓程序则是在终端的Dalvik虚拟机运行的,所以直接对其进行JUnit测试会报错,故我们可以使用以下方法进行测试。

1、创建一个包,并在包下新建一个测试类(TestService)用来测试该方法,具体代码如下:

AppService 的randomArray方法: 
 package com.app.wolf;

 public class AppService {
/**
* 随机指定范围内N个不重复的数 在初始化的无重复待选数组中随机产生一个数放入结果中,
* 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换 然后从len-2里随机产生下一个随机数,如此类推
*
* @param max
* 指定范围最大值
* @param min
* 指定范围最小值
* @param n
* 随机数个数
* @return int[] 随机数结果集
*/
public static int[] randomArray(int min, int max, int n) {
int len = max - min + 1; if (max < min || n > len) {
return null;
} // 初始化给定范围的待选数组
int[] source = new int[len];
for (int i = min; i < min + len; i++) {
source[i - min] = i;
} int[] result = new int[n];
Random rd = new Random();
int index = 0;
//这个算法666,我理解的步骤应该是这样的
//1、首先初始化一个数组source,这个数组的长度是用户选择要开始游戏的人数,接着将数组中的元素分别是0~数组长度-1;
//2、接着借用一个一个随机变量index,这个变量产生的随机数范围是0~数组长度-1;
//3、最后将每一个index对应的source的内容对应到最后返回的result数组中;
//最厉害的地方就是首先用index索引取得source数组中的内容,此时数组的长度减1,接着用数组的最后一个元素来代替之,
//这样就不会出现数组中元素被重复使用的情况了。
for (int i = 0; i < result.length; i++) {
// 待选数组0到(len-2)随机一个下标
index = Math.abs(rd.nextInt() % len--);
// 将随机到的数放入结果集
result[i] = source[index];
// 将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
source[index] = source[len];
}
for(int i:result){
System.out.print(i+"\t");
}
return result;
} }
  
  TestService类:
 package com.app.wolf.testService;

 import com.app.wolf.AppService;

 import android.R.integer;
import android.test.AndroidTestCase; public class TestService extends AndroidTestCase { /**
* 用JUnit测试randomArray方法
* @throws Exception
*/
public void testRandomArray() throws Exception {
AppService service=new AppService();
int[] resultArray=service.randomArray(2, 7, 6);
for(int result:resultArray){
System.out.print(result+"\t");
}
} }

2、如果直接在outline中对 testRandomArray()方法右击进行Android JUnit Test ,则会曝出以下异常:

“WolfApp does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml”

这是因为在AndroidManifest.xml中没有对 InstrumentationTestRunner 以及 uses-library 进行配置。

3、对于上面的错误,我们可以在AndroidManifest.xml文件加上以下的代码进行配置:

<!-- 使用该行语句对instrumentation进行配置,但是值得注意的是targetPackage应该选择你想要测试的方法所在的包 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.app.wolf" >
</instrumentation> <!-- 使用改行代码可以对uses-library进行配置,但是必须放在application节点下 -->
<uses-library android:name="android.test.runner" />

4、对AndroidManifest.xml进行配置好了之后就回到第2步对该方法进行Android JUnit Test就能够成功执行了。

三、总结

在测试的过程中应该适当地使用断言assert对程序进行测试,这对于检验程序的运行以及检查出错地方具有很有效的用处,但是本测试实验由于输出的为数组,要判断的话应该检查数组中的元素是否为要求的元素,这样检验起来会比较麻烦,所以笔者选择了打印输出的方式进行检验。

                                2016-04-04

BOB

安卓下如何使用JUnit进行软件测试的更多相关文章

  1. 安卓下junit测试

    安卓下junit测试 第一种方法: 1,在AndroidManifest.xml下,加入如下红色代码 <manifest xmlns:android="http://schemas.a ...

  2. U3D安卓下OnApplicationQuit不执行的解决方法

    安卓下当你按Home键,程序会进入暂停状态.所以只能改成调用OnApplicationPause. Unity论坛上说实现IDispose接口也可以,似乎IOS可以,但安卓测试了,无效.

  3. 安卓下点击a标签不跳转;点击a标签在手机真机上会调出手机键盘的解决办法

    安卓下点击a标签不跳转的解决办法,是不用href做跳转的链接,改为用JS控制跳转 <a href="javascript:;" ontouchstart="wind ...

  4. 微信下输入法在IOS和安卓下的诡异

    1.验证window.innerHeight 系统版本 iOS9.1.1 安卓4.4.4 没有输入法的情况下 504 567 有输入法的情况下 208 273 看来两者的window.innerHei ...

  5. min-height在安卓下不起作用

    正常情况下,min-height可以当height使用 如: <div class="father"> <div class="child"& ...

  6. 在安卓下使用python连接蓝牙串口模块(HC-06)

    在安卓上安装Python: 请参考:https://github.com/kuri65536/python-for-android/blob/master/README.md下载程序文件需要访问 ht ...

  7. cocos2dx jsb 在IOS与安卓下的一些不同之处

    cocos2dx版本 2.1.4 1:字体大小 cocosbuilder publish后应该注意IOS和安卓目录下的字体文件的规格是否齐全: 2:cc.LabelTTF 在ios下,cc.Label ...

  8. windows下eclipse跑junit报错:CreateProcess error=206

    from:http://isuifengfei.iteye.com/blog/1684262 windows下,eclipse中运行junit出现错误提示: Exception occurred ex ...

  9. 安卓下H5弹窗display:table的bug

    表单以弹窗的形式弹出时,若设置了表单的div:display:table下,安卓打开页面输入法的时候,表单顶到屏幕顶部之后,再也无法上滑,键盘遮住了下面的输入框.在ios下,一切显示正常,因为iOS会 ...

随机推荐

  1. [转]virtualenv建立多个Python独立开发环境

    不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复 ...

  2. 【原创】Kakfa common包源代码分析

    初一看common包的代码吓了一跳,这么多scala文件!后面仔细一看大部分都是Kafka自定义的Exception类,简直可以改称为kafka.exceptions包了.由于那些异常类的名称通常都定 ...

  3. ASP.NET Core 开发-Logging 使用NLog 写日志文件

    ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 .NET Core 和 ASP.NET Core . ASP.NET Core已经内置了日志支持,可以 ...

  4. Xcode开发工具问题

    昨天打开Xcode 发现鼠标光标变成了黑色的块状,不能编辑内容了,且Content区域还多出了一个显示文件路径的框框 如下图: 然后自己百度,到论坛提问.到QQ群里问;卸载重装Xcode.重装系统各种 ...

  5. Oracle-- (RANK) 排名函数

    内容来自: Oracle® Database SQL Language Reference 11g Release 2 (11.2) E41084-03. empolyees表来自hr方案. RANK ...

  6. 背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向

    [源码下载] 背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向 作者:webabcd 介绍背水一战 Windows 10 之 UI UI 设计概述 启动屏幕(闪屏) 屏 ...

  7. 【Java每日一题】20161028

    package Oct2016; public class Ques1028 { public static void main(String[] args){ new B().out(); // 输 ...

  8. 算法:二分查找(python版)

    #!/usr/bin/env python #coding -*- utf:8 -*- #二分查找#时间复杂度O(logn)#一个时间常量O(1)将问题的规模缩小一半,则O(logn) import ...

  9. Java主要知识结构

    Java基础(建议看java编程规范): Java语言基础:数据类型,命名规则,权限控制符,注释 操作符:算术操作符,逻辑操作符,关系操作符,移位操作符,按位操作符 流程控制 数组 字符串 Java高 ...

  10. c#事务用法

    ado.net2.0的SqlTransaction使用方法 /////ado.net1.0中使用Transacation(事务) string connectionString = "dat ...