写程序少不了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%稳的代码就没必要测了,就像我上面加法运算一样,我只是举个简单例子。