在Android开发中,常常需要测试编写的是否正确,一般运行应用就能发现问题,但是在模块化开发中,为了检测某一个模块是否正确,就需要使用使用基于Junit的Android测试框架

基本概念包括

Android测试的基础知识

  • 基本Java代码测试,使用Junit原生注解测试
  • Activity Testing 侧重于Activity的测试,介绍了如果使用Instrumentation 在正常Activity生命周期之外来控制Activity,然后测试Activity的特定的功能和测试UI的一些技巧。
  • Content Provider Testing 侧重测试Content Provider。
  • Service Testing 侧重测试Service。

一.在Android Studio中直接使用Junit测试

在使用Junit测试过程中,会发现,@Test是无法运行的,提示don't hava testcase ,在度娘的过程中,发现是环境的问题.

0.添加依赖

compile 'com.android.support.test:runner:0.3'
compile 'com.android.support:support-annotations:23.0.0'

1.添加Runner

但其首先需要了解的是Junit的运行原理 当你把测试代码提交给JUnit框架后,框架如何来运行你的代码呢?答案就是——Runner。在JUnit中有很多个Runner,他们负责调用你的测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。可能你会觉得奇怪,前面我们写了那么多测试,并没有明确指定一个Runner啊?这是因为JUnit中有一个默认Runner,如果你没有指定,那么系统自动使用默认Runner来运行你的代码。

在APP buildGradle 中添加如下代码:

 defaultConfig {
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

测试Java功能代码极简用例

public class GreetingTest extends TestCase {

/***
 * JUnit 把以test开头的方法作为一个实例,
 * 也可以使用annotation @Test 表示一个方法为测试方法。
 * GreetingTest 由TestCase 派生,
 * 因为这里测试是一个普通Java类(和Android 平台无关),
 * 也可以使用Android中的TestCase 作为基类。
 */
@Test
public void  testGetGreeting()
{
    assertTrue("Hello World".compareTo("Hello World")==0);
    System.out.println("is run now ,I don't know");
}
}

测试Java功能代码

 /***
 * 参数化测试用例注解,调用Paramerter Runner来运行
 */
@RunWith(Parameterized.class)
public class SquareTest {
private static Caculator caculator = new Caculator();
private double param;
private double result;

 /***
 * 参数实例化
 * 在实例化SquareTest过程中,会将Object[]中的数组赋值给param与result
 * @return
 */
@Parameterized.Parameters
public static Collection data() {
    return Arrays.asList(new Object[][]{
            {2.0, 4.0}, {0.0, 0.0}, {-3.0, 9.0},});
}

public SquareTest(double param, double result) {
    this.param = param;
    this.result = result;
}

/***
 * 一个测试用例
 */
@Test
public void square()
{
    System.out.println("执行示例,参数如下:("+param+","+result+")");
    caculator.square(param);
    System.out.println(caculator.getResule());
    assertEquals(result,caculator.getResule());
}

/***
 * 用例执行 前执行
 */
@Before
public void ready()
{
    System.out.println("所有测试在执行前,均将执行此操作:一般为测试用例创建实例,或设置参数");
}

/***
 * 用例执行完成 后执行
 */
@After
public void clear()
{
    System.out.println("在执行完用例后,清除实例或参数或释放资源");
}

/***
 * 未完成的用例 忽略
 */
@Ignore
public void ignorTestCaset()
{
    System.out.println("需要测试的代码实际还没有完成,或此测试用例还没有编写完成,在运行过程中将不忽略此项目");
}

/***
 * 测试抛出异常
 * @throws NullPointerException
 */
@Test(expected = NullPointerException.class)
public void testException() throws NullPointerException
{
    throw new NullPointerException("error 0");
}
}

打包测试

这个功能也需要使用一个特殊的Runner,因此我们需要向@RunWith标注传递一个参数Suite.class。同时,我们还需要另外一个标注@Suite.SuiteClasses,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。

@RunWith(Suite.class)
@Suite.SuiteClasses(
{SquareTest.class,
MyTestCase.class,
GreetingTest.class,
MainActivityTest.class}
)
public class TestAllTest {
}

参考文章

测试专题