美文网首页
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