美文网首页
Android单元测试---Junit

Android单元测试---Junit

作者: 积木Blocks | 来源:发表于2018-09-17 13:49 被阅读35次

    简介


    本文基于Junit4.12版本,记录Junit的基本使用以及常见的API说明。

    • 版本说明
    • 基本依赖
    • 基本使用
    • 相关注解
    • 断言API

    版本说明



    基本依赖


    • 在Module的build.gradle文件中
    dependencies {
        testImplementation 'junit:junit:4.12'
    }
    
    • 现在默认创建一个Module会自动添加依赖

    基本使用


    • 编写Test用例的位置

      基于Project目录的Test Location
    • androidTest目录和test目录的区别

      目录 用途 需要模拟器或者真机?
      androidTest 一般用于UI层测试
      test 一般用于单元功能测试
    • 一个基础的测试类

      Base Test
      • 测试类命名:xxxTest , 如果项目测试类过多记得根据业务来分包
      • 标记了@Test注解的方法,即为测试方法,左边也会出现一个运行按钮
      • ExampleUnitTest类左边的按钮表示运行这个类所有的被@Test标记的方法
    • 运行测试用例

      Run Test
      • 3种运行方法
        • 运行测试用例
        • debug运行测试用例
        • 测试用例的覆盖率
      • 测试成功
        Test Success
      • 测试失败
        • 修改代码
         @Test
         public void addition_isCorrect() {
             assertEquals(4, 3 + 2);
         }
        
        • 结果


          Test Failed
        • 失败了这里控制台会告诉你,测试预期的结果是4,而实际的结果是5,所以导致失败。不通过的代码位于类的15行

    相关注解


    • 目录
      • @Test
      • @After
      • @AfterClass
      • @Before
      • @BeforeClass
      • @Ignore
      • @FixMethodOrder
      • @Rule
      • @ClassRule
        ...
    • @Test
      • 标记该方法为测试方法
      • 被修饰的方法需要是public void
      • 支持2种可选参数
        • expected
          • 表示预测到了相关的异常,测试异常不会影响测试结果
           @Test(expected = IndexOutOfBoundsException.class)//抛出数组越界异常,也表示测试可以通过
           public void outOfBounds() {
             new ArrayList().get(1);
           }
          
        • timeout
          • 表示到达指定的时间,还没执行完毕,则测试结果为失败
           @Test(timeout = 100)
           public void sleep100() throws InterruptedException {
             Thread.sleep(100);
           }
          
    • @After
      • 用于释放在@Before修饰的方法中初始化的资源
      • @Test修饰的方法之后执行
      • 即使在@Before或者@Test中,抛出异常。@After修饰的方法也会执行
      • 修饰 public void 方法
    • @AfterClass
      • 用于释放在@BeforeClass修饰的方法中初始化的高成本资源
      • 即使在@BeforeClass中,抛出异常。@AfterClass修饰的方法也会执行
      • 修饰 public static void 方法
    • @Before
      • 初始化资源
      • @Test修饰的方法之前执行
      • 修饰 public void 方法
    • @BeforeClass
      • 初始化成本比较高的资源
      • 修饰 public static void 方法
    • 执行顺序

    public class ExampleUnitTest {
    
    
        @BeforeClass
        public static void beforeClass(){
            System.out.println("@BeforeClass");
        }
    
        @Before
        public void setUp(){
            System.out.println("@Before");
        }
    
        @Test
        public void addition_isCorrect() {
            System.out.println("@Test");
        }
    
        @After
        public void tearDown(){
            System.out.println("@After");
        }
    
        @AfterClass
        public static void afterClass(){
            System.out.println("@AfterClass");
        }
    
    }
    
    • 控制台结果


      执行顺序
    • @Ignore
      • 表示测试的时候忽略该方法
      • 可以添加自己的说明
        @Ignore("暂时忽略该方法")
        @Test
        public void addition_isCorrect() {
            System.out.println("@Test");
            assertEquals(4, 2 + 2);
        }
      
    • @FixMethodOrder
      • 允许用户选择测试类中测试方法的执行顺序
         @FixMethodOrder(MethodSorters.NAME_ASCENDING)//按照方法名排序
         public class ExampleUnitTest {
         }
        
        • MethodSorters.NAME_ASCENDING
          • 根据方法名称,按字母排列
        • MethodSorters.JVM
          • 根据JVM的顺序(代码编写顺序),JVM的顺序可能因运行而异
        • MethodSorters.DEFAULT
          • 以确定但不可预期的顺序执行
    • @Rule
    • @ClassRule

    断言API


    • assertTrue 断言条件为真

      • assertTrue(boolean condition)
      • assertTrue(String message, boolean condition)
        • message 断言失败以后的标识消息
        • condition 待检查条件
    • assertFalse 断言条件为假

      • assertFalse(boolean condition)
      • assertFalse(String message, boolean condition)
    • fail 指定测试失败

      • fail(String message)
      • fail()
    • assertEquals 断言2个对象相等

      • assertEquals(String message, Object expected,Object actual)
      • assertEquals(Object expected, Object actual)
        • expected 预期的对象
        • actual 实际的对象
        • 除了比较Object,还可以是long,float,double,Object[]
        • 如果比较double和float,还可以添加一个精度值参数delta
          • assertEquals(double unexpected,double actual, double delta)
            • delta 表示精度值
    • assertNotEquals 断言2个对象不相等

      • assertNotEquals(String message, Object unexpected,Object actual)
      • assertNotEquals(Object unexpected, Object actual)
        • unexpected 非预期的对象
        • actual 实际的对象
        • 除了比较Object,还可以是long,float,double
        • 如果比较double和float,还可以添加一个精度值参数delta
    • assertArrayEquals 断言2个数组相等

      • assertArrayEquals(String message, Object[] expecteds,
        Object[] actuals)
      • assertArrayEquals(Object[] expecteds, Object[] actuals)
        • 参数除了Object[],还可以是java基础类型数组
          boolean[]byte[]char[]short[]int[]double[]long[]float[]
    • assertNotNull 断言这个对象不为空

    • assertNull 断言这个对象为空

    • assertSame 断言2个对象相等

    • assertNotSame 断言2个对象不相等

    • assertThat 断言是否匹配某个条件


    后记


    • @Rule和@ClassRule等注释需要补充说明
    • 断言中assertThat需要补充说明

    相关文章

      网友评论

          本文标题:Android单元测试---Junit

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