美文网首页
Android单元测试详解

Android单元测试详解

作者: BigP | 来源:发表于2018-09-25 15:00 被阅读0次

前言:要做单元测试,首先要明白,什么是单元测试。关于单元测试的相关内容,这里就不多做介绍了,若要了解单元测试的相关内容,可以参见Android单元测试框架选择,其中对什么是单元测试,该用哪些框架进行测试,做了详细的说明。这里将直接采用JUnit4+Mockito+PowerMock+Robolectric的方式,对Android进行单元测试。

JUnit4

JUnit是java最基础的测试框架,主要作用就是进行断言。在不需要模拟方法或者类的行为的时候,可以直接使用JUnit进行基本的单元测试。也是为了代码覆盖率数据不可缺少的部分。

  • 使用

在Studio中添加依赖,这里Studio已经为我们自动添加了依赖:

testCompile 'junit:junit:4.12'

并且已经为我们创建了测试文件目录:


测试Package
  • 断言Assert类中主要方法如下

方法名 方法描述
assertEquals 断言传入的预期值与实际值是相等的
assertNotEquals 断言传入的预期值与实际值是不相等的
assertArrayEquals 断言传入的预期数组与实际数组是相等的
assertNull 断言传入的对象为空
assertNotNull 断言传入的对象不为空
assertTrue 断言条件为真
assertFalse 断言条件为假
assertSame 断言两个对象引用同一个对象,相当于“==”
assertNotSame 断言两个对象引用不同的对象,相当于“!=”
assertThat 断言实际值是否满足指定的条件
  • JUnit中重要的注解:

注解名 含义
@Test 表示此方法为测试方法
@Before 在每个测试方法前执行,可做初始化操作
@After 在每个测试方法后执行,可做释放资源操作
@Ignore 忽略的测试方法
@BeforeClass 在类中所有方法前运行。此注解修饰的方法必须是static void
@AfterClass 在类中最后运行,同上。
@RunWith 指定该测试类使用某个运行器
@Parameters 指定测试类的测试数据集合
@Rule 重新制定测试类中方法的行为
@FixMethodOrder 指定测试类中方法的执行顺序

执行的顺序:@BeforeClass->@Before->@Test->@After->@AfterClass

JUnit用法

先来看一段源码:

/**
     * 将带万的转换成数字字符串<br>
     *
     * @param data
     * @return String<br>
     */
    public static String getNumFromFormat(String data) {
        String endData = "0";
        if (data != null) {
            if (data.contains("万")) {
                endData = data.substring(0, data.length() - 1);
                endData = String.valueOf(Float.parseFloat(endData) * 10000);
            }  else {
                endData = data;
            }
            if (endData.contains(".")) {
                endData = endData.substring(0, endData.indexOf("."));
            }
        }
        return endData;
    }

他的作用是把带单位的数量字符串转换成全部是数字的字符创。一般情况下,如果要测试该方法的输出是否正确,我们要在代码将输入参数写死,再在Android环境下运行,再去到对应界面,才能看到结果。但是用单元测试,就能很方便的验证方法的正确性了:

public class StringUtilTest {
    @Before
    public void setUp() {
        System.out.println("测试开始");
    }

    @After
    public void tearDown() {
        System.out.println("测试结束");
    }

    @Test
    public void getNumFromFormatTest() {
        assertEquals("30000", StringUtil.getNumFromFormat("3万"));
    }
}
测试结果

可以看到测试结果是pass,并且只用了4毫秒,可以说很快了。

  • 参数化测试

这样其实还是挺麻烦的,因为每次测试一个方法都要去设置对应的很多值,需要不断修改入参,不断点击测试。为了解决这个问题,可以进行参数化测试。首先在测试类上添加注解@RunWith(Parameterized.class),在创建一个由@Parameters注解的public static方法,让返回一个对应的测试数据集合。最后创建构造方法,方法的参数顺序和类型与测试数据集合一一对应。

@RunWith(Parameterized.class)
public class StringUtilTest {
    private String mExpected;
    private String mActual;

    /**
     * 这里模拟了创建对象的过程,Juit会自动把@Parameters里面的数据集合,
     * 按照顺序依次放入构造方法中
     */
    public StringUtilTest(String expected, String actual) {
        this.mExpected = expected;
        this.mActual = actual;
    }

    @Parameterized.Parameters
    public static Collection<Object[]> moneys() {
        return Arrays.asList(new Object[][]{
            {"660000", "66万"},
            {"60000", "6万"},
            {"6666", "6666"},
        });
    }

    @Before
    public void setUp() {
        System.out.println("测试开始");
    }

    @After
    public void tearDown() {
        System.out.println("测试结束");
    }

    @Test
    public void getNumFromFormatTest() {
        assertEquals(mExpected, StringUtil.getNumFromFormat(mActual));
    }
}
测试结果

以上就是一个简单的例子,可以看到这个Test方法,连续执行了3次,且全部和设定的预期值相同,全部pass。

参考文档:
JUnit单元测试框架的使用

相关文章

网友评论

      本文标题:Android单元测试详解

      本文链接:https://www.haomeiwen.com/subject/occanftx.html