• JUnit4学习笔记(五):Theory(理论)测试


    一、简介

    JUnit4引入了Theory(理论)机制,在JUnit的官方介绍上(https://github.com/junit-team/junit/wiki/Theories)看了半天,发现其实这个概念类似于参数化测试。在参数化测试中,我们需要给定所有具体的测试数据组,而在理论测试中,用户只需给定了一些数据,JUnit自动利用这些数据组合出各种各种可能的组合来执行测试。

    二、使用

    要执行Theory测试,必须要使用org.junit.experimental.theories.Theories这个Test Runner。

     1 @RunWith(Theories.class)  
     2 public class TheoryTest {  
     3     //允许的最大误差  
     4     private static final double DELTA = 0.01;  
     5   
     6     @DataPoint  
     7     public static int ZERO = 0;  
     8   
     9     @DataPoint  
    10     public static int TWO = 2;  
    11   
    12     @DataPoint  
    13     public static int EIGHT = 8;  
    14   
    15     //标志这个测试为Theory测试  
    16     @Theory  
    17     public void testDivide(int dividend, int divisor) {  
    18         //跳过除数为0的case  
    19         assumeThat(divisor, not(0));  
    20         //Calculator.divide(dividend, divisor)方法返回他们相除的结果  
    21         assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);  
    22         System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);  
    23     }  
    24 }  

     在上面的测试中,@DataPoint用于注解静态变量,表示这个变量是个数据点。当执行testDivide这个Theory测试时,JUnit会把所有的DataPoint数据两两组合(JUnit会根据测试方法的参数决定数据的组合)形成一组组的测试数据(也就是9组)并用这些数据分别执行测试。执行上面的测试会输出以下信息:

    1. Passed with: dividend=0, divisor=2  
    2. Passed with: dividend=0, divisor=8  
    3. Passed with: dividend=2, divisor=2  
    4. Passed with: dividend=2, divisor=8  
    5. Passed with: dividend=8, divisor=2  
    6. Passed with: dividend=8, divisor=8  

    也可以使用@DataPoints注解一个静态方法以返回数据,下面的测试与上面的等价

     1 @RunWith(Theories.class)  
     2 public class TheoryTest {  
     3     //允许的最大误差  
     4     private static final double DELTA = 0.01;  
     5   
     6     @DataPoints  
     7     public static int[] getTestData() {  
     8         return new int[]{0, 2, 8};  
     9     }  
    10   
    11     //标志这个测试为Theory测试  
    12     @Theory  
    13     public void testDivide(Integer dividend, Integer divisor) {  
    14         //跳过除数为0的case  
    15         assumeThat(divisor, not(0));  
    16         //Calculator.divide(dividend, divisor)方法返回他们相除的结果  
    17         assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);  
    18         System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);  
    19     }  
    20 }  
    21  

    上面两个例子都是方法的两个参数分别遍历DataPoint进行组合,如果需要限定某个参数,可以像下面的例子一样使用@TestOn注解:

    @RunWith(Theories.class)  
    public class TheoryTest {  
        //允许的最大误差  
        private static final double DELTA = 0.01;  
      
        //标志这个测试为Theory测试  
        @Theory  
        public void testDivide(  
                @TestedOn(ints = {0, 2, 8}) int dividend,  
                @TestedOn(ints = {2, 8}) int divisor  
        ) {  
            //Calculator.divide(dividend, divisor)方法返回他们相除的结果  
            assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);  
            System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);  
        }  
    }  

     这样,JUnit就只会使用给定的数据进行组合测试,去掉了除数为0的情况,也就不必要对除数进行假设(assume)了。

  • 相关阅读:
    scp 一个最简单的Linux 数据copy
    ORA-65096: invalid common user or role 解决方法
    SQL Server 查询 数据库 & 表格 大小
    SQL Server 配置 Job 监控 tempdb 变化
    SQL Server 邮箱告警配置
    浅谈 SQL Server 中的等待类型(Wait Type)
    Oracle 常用命令大全(持续更新)
    连接Oracle 12c R2 报错ORA-28040:No matching authentication protocal
    Oracle 数据库启动和关闭
    SQL Server 日志收缩方法
  • 原文地址:https://www.cnblogs.com/johnson-blog/p/3890555.html
Copyright © 2020-2023  润新知