Junit基本使用

一、Junit 是什么?

JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

注意:Junit 测试也是程序员测试,即所谓的白盒测试,它需要程序员知道被测试的代码如何完成功能,以及完成什么样的功能

二、Junit 能做什么?

使用 Junit 能让我们快速的完成单元测试。
  通常我们写完代码想要测试这段代码的正确性,那么必须新建一个类,然后创建一个 main() 方法,然后编写测试代码。如果需要测试的代码很多呢?那么要么就会建很多main() 方法来测试,要么将其全部写在一个 main() 方法里面。这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。

三、Junit 的用法

1、编写代码(需要测试的类)

public class Calculator {
    
    
    /**
     * 传入两个参数,求和
     * @param a
     * @param b
     * @return
     */
    public int add(int a,int b){
    
    
        return a+b;
    }
    /**
     * 传入两个参数,求差
     * @param a
     * @param b
     * @return
     */
    public int sub(int a,int b){
    
    
        return a-b;
    }
}

2、编写测试类

①不用Junit

public class CalculatorTest {
    
    
 
    public static void main(String[] args) {
    
    
        Calculator c = new Calculator();
        //测试 add()方法
        int result = c.add(1, 2);
        if(result == 3){
    
    
            System.out.println("add()方法正确");
        }
         
        //测试 sub()方法
        int result2 = c.sub(2, 1);
        if(result2 == 1){
    
    
            System.out.println("sub()方法正确");
        }
    }
}

不用 Junit 只能写在 main()方法中,通过运行结果来判断测试结果是否正确。这里需要测试的只有两个方法,如果有很多方法,那么测试代码就会变得很混乱。

②、使用 Junit

public class CalculatorTest {
    
    
     
    @Test
    //测试 add()方法
    public void testAdd(){
    
    
        Calculator c = new Calculator();
        int result = c.add(1, 2);
        Assert.assertEquals(result, 3);
    }
     
    @Test
    //测试 sub()方法
    public void testSub(){
    
    
        Calculator c = new Calculator();
        int result = c.sub(2, 1);
        Assert.assertEquals(result, 1);
    }
}

3、运行 Junit

在这里插入图片描述
结果出现如下的绿色横条,则测试通过,红色横条,则测试失败
在这里插入图片描述
那么由上面可以看到,使用 Junit 不需要创建 main() 方法,而且每个测试方法一一对应,逻辑特别清晰。可能有读者会问,这样写代码量也并不会减少啊,那么你接着往下看:

四、Junit 注解

  1. @Test: 测试方法
       a)(expected=XXException.class)如果程序的异常和XXException.class一样,则测试通过
       b)(timeout=100)如果程序的执行能在100毫秒之内完成,则测试通过
  2. @Ignore: 被忽略的测试方法:加上之后,暂时不运行此段代码
  3. @Before: 每一个测试方法之前运行
  4. @After: 每一个测试方法之后运行
  5. @BeforeClass: 方法必须必须要是静态方法(static 声明),所有测试开始之前运行,注意区分before,是所有测试方法
  6. @AfterClass: 方法必须要是静态方法(static 声明),所有测试结束之后运行,注意区分 @After

那么上面的例子,我们可以看到,每个 @Test 方法中都有 Calculator c = new Calculator();即类的实例化,那么我们可以将其放入到 @Before 中

public class CalculatorTest {
    
    
    Calculator c = null;
     
    @Before
    public void testBeforeClass(){
    
    
        c = new Calculator();
    }
    @Test
    //测试 add()方法
    public void testAdd(){
    
    
        int result = c.add(1, 2);
        //Assert.assertEquals(result, 3);
        //等价于:
        if(result == 3){
    
    
            System.out.println("add()方法正确");
        }
    }
     
    @Test
    //测试 sub()方法
    public void testSub(){
    
    
        int result = c.sub(2, 1);
        //Assert.assertEquals(result, 1);
        //等价于:
        if(result == 1){
    
    
            System.out.println("sub()方法正确");
        }
    }
}

同理:别的注解用法我们用一个类来看:

public class JunitTest {
    
    
    public JunitTest() {
    
    
        System.out.println("构造函数");
    }
 
    @BeforeClass
    public static void beforeClass(){
    
    
        System.out.println("@BeforeClass");
    }
     
    @Before
    public void befor(){
    
    
        System.out.println("@Before");
    }
     
    @Test
    public void test(){
    
    
        System.out.println("@Test");
    }
     
    @Ignore
    public void ignore(){
    
    
        System.out.println("@Ignore");
    }
     
    @After
    public void after(){
    
    
        System.out.println("@After");
    }
     
    @AfterClass
    public static void afterClass(){
    
    
        System.out.println("@AfterClass");
    }
}

结果为:

@BeforeClass
构造函数
@Before
@Test
@After
@AfterClass

五、编写测试类原则

  • ①测试方法上必须使用@Test进行修饰
  • ②测试方法必须使用public void 进行修饰,不能带任何的参数
  • ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
  • ④测试类所在的包名应该和被测试类所在的包名保持一致
  • ⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
  • ⑥测试类使用Test作为类名的后缀(不是必须)
  • ⑦测试方法使用test作为方法名的前缀(不是必须)

猜你喜欢

转载自blog.csdn.net/weixin_41544662/article/details/117597534
今日推荐