安卓下如何使用JUnit进行软件测试

软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的。本文将介绍在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方法: 
 1 package com.app.wolf;
 2
 3 public class AppService {
 4 /**
 5      * 随机指定范围内N个不重复的数 在初始化的无重复待选数组中随机产生一个数放入结果中,
 6      * 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换 然后从len-2里随机产生下一个随机数,如此类推
 7      *
 8      * @param max
 9      *            指定范围最大值
10      * @param min
11      *            指定范围最小值
12      * @param n
13      *            随机数个数
14      * @return int[] 随机数结果集
15      */
16     public static int[] randomArray(int min, int max, int n) {
17         int len = max - min + 1;
18
19         if (max < min || n > len) {
20             return null;
21         }
22
23         // 初始化给定范围的待选数组
24         int[] source = new int[len];
25         for (int i = min; i < min + len; i++) {
26             source[i - min] = i;
27         }
28
29         int[] result = new int[n];
30         Random rd = new Random();
31         int index = 0;
32         //这个算法666,我理解的步骤应该是这样的
33         //1、首先初始化一个数组source,这个数组的长度是用户选择要开始游戏的人数,接着将数组中的元素分别是0~数组长度-1;
34         //2、接着借用一个一个随机变量index,这个变量产生的随机数范围是0~数组长度-1;
35         //3、最后将每一个index对应的source的内容对应到最后返回的result数组中;
36         //最厉害的地方就是首先用index索引取得source数组中的内容,此时数组的长度减1,接着用数组的最后一个元素来代替之,
37         //这样就不会出现数组中元素被重复使用的情况了。
38         for (int i = 0; i < result.length; i++) {
39             // 待选数组0到(len-2)随机一个下标
40             index = Math.abs(rd.nextInt() % len--);
41             // 将随机到的数放入结果集
42             result[i] = source[index];
43             // 将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
44             source[index] = source[len];
45         }
46         for(int i:result){
47             System.out.print(i+"\t");
48         }
49         return result;
50     }
51
52 }
    TestService类:
 1 package com.app.wolf.testService;
 2
 3 import com.app.wolf.AppService;
 4
 5 import android.R.integer;
 6 import android.test.AndroidTestCase;
 7
 8 public class TestService extends AndroidTestCase {
 9
10     /**
11      * 用JUnit测试randomArray方法
12      * @throws Exception
13      */
14     public void testRandomArray() throws Exception {
15         AppService service=new AppService();
16         int[] resultArray=service.randomArray(2, 7, 6);
17         for(int result:resultArray){
18             System.out.print(result+"\t");
19         }
20     }
21
22 }

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

时间: 04-02

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

安卓笔记2——安卓下的测试和数据存储方式

今天开始介绍安卓的另一个基础知识,安卓下的测试和数据存储的几种方式. 以后后同步发出对应笔记.老规矩,用一张图来介绍今天的内容. 图片看不清的话可以右键新窗口打开. 一.测试 1,分类 黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 功能测试: 根据产品特性.操作描述和用户方案,测试一个产品的特

安卓下cocos2dx实现cpp部分在线更新

目前cocos2dx + lua的方式可以动态更新所有的脚本文件,但是却无法动态更新cpp部分的代码(这部分东西一般我们称之为底包),事实上采用同样的方案在android下也是可以实现动态更新的,只需要将java代码里加载libgame.so的代码稍微做些修改即可 static { System.loadLibrary("game"); } 将上面的代码移到onCreate里大概如下 protected void onCreate(Bundle savedInstanceState)

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

安卓下点击a标签不跳转的解决办法,是不用href做跳转的链接,改为用JS控制跳转 1 <a href="javascript:;" ontouchstart="window.location.href='https://www.baidu.com/'"><img src="xxx"></a> 这样写虽然解决了安卓下点击a标签不跳转的问题,但还是没有解决点击a标签,在手机真机上会调出手机键盘的行为 不过将a标签换

前端移动开发之安卓下存在的问题

一.点击input,textarea,select等表单类元素,出现一个多余文本窗口  解决办法: input,textarea,select{ -webkit-appearance: none; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-user-modify: read-write-plaintext-only; } 注:-webkit-user-modify影响密码框,密码框显示明文,所以单独使用. 二:滚动条设置问题 通过ov

new Date()在安卓下正常,在IOS下显示不出来

之前用JS在做一个倒计时,在PC端和安卓下面显示没问题,在IOS下显示不出来. 查找了资料,链接我忘记了. 原因是: 在IOS下,new Date("2000-2-22 00:10"),返回的是undefined,因为IOS不支持这种类型格式. 解决方案: 更换下格式:new Date("2000/2/22") 可以正常显示.

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

在安卓上安装Python: 请参考:https://github.com/kuri65536/python-for-android/blob/master/README.md下载程序文件需要访问 https://github-cloud.s3.amazonaws.com ,一般需要FQ 下载如下文件: sl4a-r6.1.1-arm-debug.apk, PythonForAndroid-debug.apk, python_r26.zip, python_extras_r26.zip, pyth

安卓下H5弹窗display:table的bug

表单以弹窗的形式弹出时,若设置了表单的div:display:table下,安卓打开页面输入法的时候,表单顶到屏幕顶部之后,再也无法上滑,键盘遮住了下面的输入框.在ios下,一切显示正常,因为iOS会自动将输入框居中到显示的区域,那么这种情况下怎么办呢? 解决方案:将display:table改成display:block,然后再将表单居中即可

Unity 安卓下DLL热更新一(核心思想)

大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章之后只是认识DLL热更新的方式和概念,掌握热更新的实战框架还需要你自己=.=   我们通常的做法是编译成的DLL打成AssetBundle文件, Unity通过WWW下载AB文件获取里面DLL.通过反射的方式把里面的C# 组件绑定到GameObject游戏物体上面,这就是DLL热更新的原理. 假设项

在安卓下打包cocos2d-js 3.6项目with ProtoBuf.js

项目用到了cocos2d-js 3.6和ProtoBuf.js,但是打包成apk时运行时总是报错(evaluatedOK == JS_FALSE),没有具体的文件和行号报错信息. 只能一个一个文件排查,最终终于定位到是ProtoBuf.min.js的问题.iOS和各个浏览器均没有问题,只有安卓的apk有问题,估计是spidermonkey的android版本的问题. 一般出现(evaluatedOK == JS_FALSE)是js文件的语法有问题,但是检查了一遍也没有发现语法错误. 没办法,只好