Junit4的注意事项

来源:互联网 发布:经济学 知乎 编辑:程序博客网 时间:2024/05/16 11:27

注重规范

这里写图片描述

代码

package com.zxq;public class Calculate {    public int add(int a , int b){        return a+b ;    }    public int subtract(int a , int b){        return a - b ;    }    public int multiply(int a , int b){        return a * b ;    }    public int divide(int a , int b){        return a / b ;    }}

测试类

package com.zxq;import static org.junit.Assert.*;import org.junit.Test;import com.zxq.Calculate;public class CalculateTest {    @Test    public void testAdd() {        //测试值是否相同         assertEquals(4, new Calculate().add(1, 3)) ;    }    @Test    public void testMultiply() {        assertEquals(9, new Calculate().multiply(3, 3)) ;    }    @Test    public void testSubtract() {        assertEquals(0, new Calculate().subtract(3, 3)) ;    }    @Test    public void testDivide() {        assertEquals(1, new Calculate().divide(3, 3)) ;    }}

注意事项:
1.测试方法上必须使用@Test进行修饰
2.测试方法必须使用public void进行修饰,不能带任何参数
3.新建一个源代码目录来存放我们的测试代码
4.测试类的包应该和被测试类保持一致
5.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
6.测试类使用Test作为类名的后缀(规范)
7.测试方法使用test作为方法名的前缀(规范)

测试的结果

  • 成功
    @Test    public void testMultiply() {        assertEquals(9, new Calculate().multiply(3, 3)) ;    }

这里写图片描述

  • 失败
  /*     * failures 一般由单元测试使用的预言方法判断失败导致的。     * 表示测试的结果和预期的结果不一致     * errors 代码异常引起的      *  可以产生于测试代码本身的错误 也可以是测试代码中的一个bug     *       *  测试不是用来证明你是对的,而是来证明你没有错。     */    @Test    public void testSubtract() {        //预期值 不一样 出现failures        assertEquals(1, new Calculate().subtract(3, 3)) ;    }    @Test    public void testDivide() {        //除数为0 抛异常        assertEquals(1, new Calculate().divide(3, 0)) ;    }

预期值不一样

这里写图片描述

抛异常

这里写图片描述

运行流程

package com.zxq;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class JunitDemo {    /*     * 1.@BeforeClass修饰的方法会在所有方法被调用前被执行,     *       而且该方法是静态的,所以当测试类被加载后接着就会运行它,     *       而且在内存中它只会存在一份实例,它比较适合加载配置文件。     * 2.@AfterClass所修饰的方法通常用来对资源的清理,     *       如关闭数据库的连接     * 3.@Before和@After会在每个测试方法的前后各执行一次。     *       */    @BeforeClass    public static void setUpBeforeClass() throws Exception {        System.out.println("setUpBeforeClass") ;    }    @AfterClass    public static void tearDownAfterClass() throws Exception {        System.out.println("tearDownAfterClass") ;    }    @Before    public void setUp() throws Exception {        System.out.println("setUp") ;    }    @After    public void tearDown() throws Exception {        System.out.println("tearDown") ;    }    @Test    public void test1() {        System.out.println("test1") ;    }    @Test    public void test2() {        System.out.println("test2") ;    }}

这里写图片描述

Junit4常用注解

/*@Test:将一个方法修饰成测试方法         @Test(expected=xxx(异常类).class):会抛出该异常         @Test(timeout=毫秒 ):设置执行的时间,用于结束死循环或是性能测试 @BeforeClass:所有方法之前执行,且执行一次 static修饰 @AfterClass:所有方法之后执行 static修饰 @Before:每一个测试方法之前执行 @After:每一个测试方法后执行 @Ignore:所修饰的测试方法会被测试运行器忽略@RunWith:可以更改测试运行器,    通过继承org.junit.runner.Runner这个类来写自己的运行器 */    //此处运行不会抛异常    @Test(expected=ArithmeticException.class)    public void testDivide() {     assertEquals(3,new Calculate().divide(10, 0)) ;    }    //出现error     @Test(timeout=2000)    public void testWhile(){        while(true)        {            System.out.println("Hello World") ;        }    }    @Ignore("....")    public void testIgnore(){        while(true)        {            System.out.println("testIgnore") ;        }    }    //不会抛异常    @Test(timeout=3000)    public void testTimeout(){        try {            Thread.sleep(2000) ;        } catch (InterruptedException e) {            e.printStackTrace();        }    }

测试套件
这里写图片描述

package com.suit;import org.junit.Test;public class TestTask1 {    @Test    public void test() {        System.out.print("This is TestTask1...")  ;    }}
package com.suit;import org.junit.Test;public class TestTask2 {    @Test    public void test() {        System.out.print("This is TestTask2...")  ;    }}
package com.suit;import org.junit.Test;public class TestTask3 {    @Test    public void test() {        System.out.print("This is TestTask3...")  ;    }}
package com.suit;import org.junit.runner.RunWith;import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({TestTask1.class,TestTask2.class,TestTask3.class}) public class SuitTest {     /*      * 测试套件就是组织测试类一起运行的        写一个作为测试套件的入口类,这个类里不包含其他的方法        更改测试运行器Suite.class        将要测试的类作为数组传入Suite.SuiteClasses({})        */}

这里写图片描述

package com.suit;import static org.junit.Assert.*;import java.util.Arrays;import java.util.Collection;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;import com.zxq.Calculate;/* *  * 总结: 1.更改默认的测试运行器为RunWith(Parameterized.class) 2.声明变量存放预期值和结果值 3.声明一个返回值为Collection的公共静态方法, 并使用@Parameters进行修饰 例如: public static Collection<Object[]>t(){ return Arrays.asList(new Object[][]{{3,2,1}{4,2,2}}); } 4.为测试类声明一个带有参数的公共构造函数, 并在其中为之声明变量赋值(预期值、输入参数值等) * */@RunWith(Parameterized.class)public class ParameterTest {    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 ParameterTest(int expected, int input1, int input2) {        this.expected = expected;        this.input1 = input1;        this.input2 = input2;    }    @Test    public void testAdd() {        assertEquals(expected, new Calculate().add(input1, input2));    }}

这里写图片描述

0 0