Java 单元测试 JUnit4 快速入门

时间:2022-12-08 05:06:22
JUnit最佳实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  class  CardServiceTest {
     /**
      * 最佳实践:
      * 1. 测试方法上必须使用@Test进行修饰
      * 2. 测试方法必须使用public void 进行修改,不能带任何的参数
      * 3. 新建一个源代码目录存放我们的测试代码,测试类的包和被测试的一致
      * 4. 测试单元中每个方法必须独立测试,不能有任何依赖
      * 5. 测试类使用Test作为后缀,测试方法使用Test作为后缀(看个人喜好) 
      */
     
     @Test
     public  void  addTest(){
         // 使用断言
         assertEquals( 6 new  CardService().add( 3 , 3 ));
     }
     
}
如下目录结构
         Java 单元测试 JUnit4 快速入门

运行结果说明

         Java 单元测试 JUnit4 快速入门
        1. Failure 一般由于单元测试使用的断言方法判断失败所引起的,就是说程序输出的结果和我们预期的不一样。
        2. Errors 是由代码异常引起的,可能是测试代码本身错误或是被测试代码中的bug。
        3. 一切都成功进度条显示绿色

JUnit常用注解说明

1.  @BeforeClass修饰的方法会在所有方法被调用前执行,该方法是静态的,测试类被加载就会运行它,而且内存中只有一个实例存在,它比较适合加载配置文件等。
2.  @AfterClass所修饰的方法通常用来对资源的清理,如管理数据库的连接等
3.  @Before@After会在每个测试方法的前后各执行一次。
4.  @Test 将一个普通的方法修饰成一个测试方法
    @Test(expected=XX.class) -预测的异常
    @Test(timeout=2000) - 超时,单位毫秒
5.  @Ignore 会被测试运行器忽略
6.  @RunWith 可以更改测试运行器 org.junit.runner.Runner
7.  @FixMethodOrder(MethodSorters.NAME_ASCENDING) // 类注解,设置运行类时方法的执行顺序规则,具体参数说明查看MethodSorters源码

JUnit4中的测试套件

1
2
3
4
5
6
7
8
9
10
@RunWith (Suite. class )
@Suite .SuiteClasses({ EquipmentServiceTest. class , UserServiceTest. class  })
public  class  CardServiceTest {
     /**
      * 测试套件就是组织测试类一起运行
      * 1. 写一个作为测试套件的入口类,这个类里不包含其他方法
      * 2. 更改测试类的运行器Suite.class
      * 3. 将要测试的类作为数组传入到Suite.SuiteClass({})
      */
}   

JUnit4的参数化设置

        Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@RunWith (Parameterized. class )
public  class  CardServiceTest {
     /**
      * 1. 更改默认的测试运行器为@RunWith(Parameterized.class)
      * 2. 为每一列测试数据创建一个实例变量。
      * 3. 声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰,它返回一个对象的集合(数组)来作为测试数据集合。
      * 4. 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
      */
     int  expected =  0 ;
     int  input1 =  0 ;
     int  input2 =  0 ;
 
     @Parameters
     public  static  Collection<Object[]> t() {
         return  Arrays.asList( new  Object[][] { {  3 1 2  }, {  4 2 2  } });
     }
 
     public  CardServiceTest( int  expected,  int  input1,  int  input2) {
         this .expected = expected;
         this .input1 = input1;
         this .input2 = input2;
     }
 
     @Test
     public  void  addTest() {
         // 会运行两次,以下的变量分别对应的是上面@Parameters声明的数值{ 3, 1, 2 }和 { 4, 2, 2 }, 所以输出两次true
         assertEquals(expected,  new  CardService().add(input1, input2));
     }
}


参考:慕课网