Android单元测试

技术分享

Android提供了上面的多个测试类,可以允许我们对于单个方法、Activity、Service、Application等多个对象进行测试,单元测试可以很方便的让我们对代码进行测试,并且方便对重构后的代码进行检查。本篇将简要的讲解如何对Android中的对象进行测试。

 

一、准备工作

 

二、测试与Android运行环境无关的方法

2.1 InstrumentationTestCase

当你要测试与Android环境无关的方法时,推荐继承InstrumentationTestCase来进行测试。比如下面的比大小的方法就很适合做这样的测试。

    public static int getMax(int a, int b) {
        return a >= b ? a : b;
    }

得到版本号的代码因为涉及到了Context所以和android运行的环境有关,我们必须要传入一个上下文(context)对象,这时继承InstrumentationTestCase就没有办法进行测试了。

    /** 取得当前应用的版本号
     * @param context
     * @return
     */
    public static String getVersionName(Context context) {
        try {
            PackageInfo manager = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return manager.versionName;
        } catch (NameNotFoundException e) {
            return "Unknown";
        }
    }

那么是不是用它就不能对activity这样的东西进行测试了呢?也不是,我们仍旧可以用它来测试Activity,前题是要通过代码初始化对象,但因为它的子类可以针对Activity进行完善的测试,所以我们一般不用它来做测试activity的工作。第二节中,先给出了一个简单的demo,然后给出用它测试activity的demo。

 

2.2 举例

测试的目标类——MyUtils:

package com.kale.androidtest;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;

public class MyUtils {

    public static int getMax(int a, int b) {
        return a >= b ? a : b;
    }
}

 

测试类——MySimpleTest:

package com.kale.androidtest.test;
import com.kale.androidtest.MyUtils;
import android.test.InstrumentationTestCase;


public class MySimpleTest extends InstrumentationTestCase  {
    public void testGetMax(){
        int max = MyUtils.getMax(1, 3);
        assertEquals(3, max);
    }
}

 

附:测试Activity

activity的代码就不贴了,里面有个editText,这里的测试也是简单的例子,表示它可以用来测试activity,例子没有任何实际意义。

package com.kale.androidtest.test;

import android.content.Intent;
import android.os.SystemClock;
import android.test.InstrumentationTestCase;
import android.widget.EditText;

import com.kale.androidtest.MyActivity;

/**
 * @author:Jack Tony
 * @description  :
 * @web: http://www.oschina.net/question/54100_27061
 * @date  :2015年2月19日
 */
public class MySampleTest2 extends InstrumentationTestCase {
    MyActivity mActivity;
    EditText mEditText;

    @Override
    protected void setUp() throws Exception {
        // 用intent启动一个activity
        Intent intent = new Intent();
        intent.setClassName("com.kale.androidtest", MyActivity.class.getName());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mActivity = (MyActivity) getInstrumentation().startActivitySync(intent);
    }

    /**
     * @description 测试是否初始化完成
     *
     */
    public void testInit() {
        mEditText = mActivity.getEditText();
        assertNotNull(mActivity);
        assertNotNull(mEditText);
    }

    /**
     * @description 测试得到activity中editText中的文字
     *
     */
    public void testGetText() {
        mEditText = mActivity.getEditText();
        String text = mEditText.getText().toString();
        assertEquals("", text);
    }

    /**
     * @description 测试设置文字的方法
     *
     */
    public void testSetText() {
        mEditText = mActivity.getEditText();
        // 在主线程中设置文字
        getInstrumentation().runOnMainSync(new Runnable() {

            @Override
            public void run() {
                mEditText.setText("kale");
            }
        });
        // 暂停1500ms
        SystemClock.sleep(1000);
        assertEquals("kale", mEditText.getText().toString());
    }

    /**
     * 垃圾清理与资源回收
     * 
     * @see android.test.InstrumentationTestCase#tearDown()
     */
    @Override
    protected void tearDown() {
        mActivity.finish();
        try {
            super.tearDown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 

 

三、测试Application

 

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