Android开发中单元测试的两种方式

Android开发中单元测试的两种方式

一位优秀的程序员也同样不能保证自己的程序没有bug,因此编写合适的测试程序是完全有必要的,这样也会降低程序在后期出现各种奇奇怪怪bug的可能,降低维护成本,未雨绸缪将bug扼杀在摇篮之中。

看到网上有很多依旧用写java单元测试的方式在写android程序的单元测试程序——junit,当然我一直都反感将不合时宜的东西强搬到新的技术应用以获取一席之地的这种做法,不断的应用新的方法提高效率,完善程序才是真理!废话不多说,直接说到今天的重点:Android开发中单元测试的两种办法;第一种是直接附着在工程体内,第二种则是新建一个android测试工程;这两种方法都不错,也异曲同工;当然后一种更为正规,也更是我们应该掌握的。


第一种单元测试方法:

将测试类直接放在被测试工程中

  技术分享

编写一个测试类,这个类是直接放在需要测试的工程junitest中的;当然为了实现测试这个工程的目的进行相关的配置是必须的,在此之前我将这个工程的代码做简单说明:junitest工程源码中MainActivity.java是自带无修改的,PersonService.java是一个简单的功能类以作测试之用:

package com.example.server;
public class PersonService {
public PersonService() {
// TODO Auto-generated constructor stub
}
public void save(String username) {
String sub = username.substring(6);
}
public int add(int a, int b) {
return a+b;
}
}

重点就是测试PersonService.java中的两个函数saveadd的功能是否正常。


好,了解了工程代码之后我们开始配置做测试单元的准备工作,一共两点:

1、在AndroidManifest.xml文件中:

<uses-library android:name="android.test.runner"/>
这一行放在application节点之中

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.server"
        android:label="this is my test class"></instrumentation>
这一个节点放在application节点之外,注意将com.example.server替换成被测试的工程的包名。

2、编写测试类

我是以test.java做的demo,这个类的编写需要注意的是一定要继承一个测试框架类AndroidTestCase;然后在这个继承类中写被测试工程的各个函数的测试函数。

这里我将我配置的AndroidManifest.xml和测试类都贴出来:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.server"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.server.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>
        <uses-library android:name="android.test.runner"/>
        
    </application>
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.server"
        android:label="this is my test class"></instrumentation>
</manifest>
和测试用例:

package com.example.test;

import junit.framework.Assert;

import com.example.server.PersonService;

import android.test.AndroidTestCase;

public class test extends AndroidTestCase {

	
	public void testSave() throws Exception{
		PersonService service = new PersonService();
		service.save(null);
	}

	public void testAdd() throws Exception{
		PersonService service = new PersonService();
		int actual = service.add(1, 2);
		Assert.assertEquals(3, actual);
	}
}

然后我们点击测试类,在对应的outline框中应该是能看到对应函数的

 技术分享

选择需要测试的函数,选择Run as --> Android Junit Test然后选择指定的模拟器或真机应该就能通过Junit栏对应的标示来分析被测试之函数是否符合要求了。

技术分享(绿色表示是正确的)


技术分享(红色表示有错误,后面则将错误的详细信息都打印出来了)

 

附加:刚刚在做demo的时候突然一直出现Test fail ,no test resault。一直在需找问题的所在,最后又神奇的正常……写程序不怕错误,就怕错的不明不白,正常的不知所措!刚刚的问题很有可能是我私自删除了构造函数造成的……看来程序还是要精心呵护的。


第二中单元测试方法

单独写一个android测试工程来测试

这样做其实是更规范的做法,并且需要我们掌握,而且相对而言简单,省事儿。

1、首先就是新建android测试工程

 技术分享

2,按照提示,选择自己是要测试哪一个工程:

 技术分享

3、最后就直接新建测试类

如同方法一中所说进行测试就可以了。这时候我们打开这个测试类的Androidmanifest.xml文件我们发现,原先需要我们自己配置的早就已经配置好了,这就是这中测试方法的方便之处了。

最后:关于单元测试,自己总结的几点:

1、配置AndroidManifest.xml,其中就只有两处

2、继承AndroidTestCase

3、写的测试函数一定要是void public的;并且要throws Exception因为在测试框架中,这样写利于测试框架得到异常信息

4、写的测试函数名最好为Test + 被测函数名

 

本文中所述源码下载

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。