Android 单元测试

  写程序少不了debug,但每次为了debug都编译全部代码和安装到真机上在进入对应的activity,效率实在太低.,所以需要用到单元测试。

Android Studio自带了2种基于JUnit4的测试。

1.Local unit tests.

位于 module-name/src/test/java/.
 如果不调用Android framework APIs,就将Test类放在这里,这些测试运行在JVM上,所以免去了安装到真机或模拟机的麻烦。
  使用方法和eclipse单元测试一样。

package util;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import util.Adder;

/**
 * @author PanQi
 * junit4注解:
 1. @Test: 将一个 普通的方法修饰成为一个测试方法
 2. @BeforeClass: 他会在所有的方法运行前被执行,static修饰
 3. @AfterClass 他会在所有方法运行结束后被执行,static修饰
 4. @Before:会在每一个测试方法被运行前执行一次
 5. @After 会在每个测试方法被运行后执行一次
 6. @Ignore 所修饰的测试方法会被测试运行器忽略
 7. @RunWith: 可以修改测试运行器 org.junit.runner.Runner
 */
public class AddTest {

    private Adder adder;

    @Before
    public void setUp() throws Exception { // 初始化
        adder = new Adder();
    }

    @After
    public void tearDown() throws Exception { // 结束 释放内存
        adder = null;
    }

    @Test
    public void addInt() { // Junit4之后无需开头test命名
        assertEquals(2, adder.add(1, 1));
    }


}

2.Instrumented tests

 位于 module-name/src/androidTest/java/.
 当需要用到Android framework APIs或完整的activity时,就将Test类放在这里. 这些测试运行在真机或模拟机上。

 1.只需要Context的测试
很多工具类可能会需要获得Context,如获得资源,获取内部文件(夹)路径等。继承AndroidTestCase,调用getContext()即可得到getContext

public class ContextTest extends AndroidTestCase {
    @Test
    public void anyTest(){
        Context context=getContext(); 
    }
}

 2.单独测试activity

 更多时候需要打开acticity测试,继承ActivityInstrumentationTestCase2<T>可以直接打开要测试的acticity,免去每次点n个步骤进入activity的繁琐。
 假设测activity的加法功能
这里写图片描述

测试代码
“`
package com.example.panqi.unittestdemo;

import android.test.ActivityInstrumentationTestCase2;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.junit.Test;

/**
* Created by PanQi on 2016/11/18.
*/

public class TestActivityTest extends ActivityInstrumentationTestCase2 {

private TestActivity testActivity;
private TextView tvAnswer;
private Button buttonClick;
private EditText editText1;
private EditText editText2;

public TestActivityTest() {
    super(TestActivity.class);  //初始化
}

@Override
public void setUp() throws Exception {
    super.setUp();
    testActivity = getActivity(); //得到acticity实例
    initView();
}

private void initView() {
    tvAnswer = (TextView) testActivity.findViewById(R.id.tv_answer);
    buttonClick = (Button) testActivity.findViewById(R.id.button);
    editText1 = (EditText) testActivity.findViewById(R.id.et1);
    editText2 = (EditText) testActivity.findViewById(R.id.et2);
}

@Test
public void testButtonCLick() throws Exception {    //method命名必须test开头
    testActivity.runOnUiThread(new Runnable() {   //Test不在UI线程运行
        @Override
        public void run() {
            editText1.setText("2");
            editText2.setText("8");
            buttonClick.performClick(); //点击button
        }
    });

    getInstrumentation().waitForIdleSync();   //等待ui线程执行完毕
    int num = Integer.parseInt(tvAnswer.getText().toString().trim());
    assertEquals(10, num);


}

}
测试成功:
测试结果

 第一次测试确实比较麻烦,还要写代码,直接运行app测更方便,但代码就是擅长重复性工作,一劳永逸的东西,你测得越多后期回报越大。100%稳的代码就没必要测了,就像我上面加法运算一样,我只是举个简单例子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值