简介
JUnit是一个Java语言的单元测试框架。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
一些注意点
1.测试方法上必须使用@Test进行修饰
2.测试方法必须使用public void 进行修饰,不能带任何的参数
3.新建一个源代码目录来存放我们的测试代码
4.测试类的包应该和被测试类保持一致
5.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
6.测试类使用Test作为类名的后缀(不是必须)
7.测试方法使用test作为方法名的前缀(不是必须)
8.Failure一般由单元测试使用的断言方法判断失败所引起的,这经表示 测试点发现了问题,就是说程序输出的结果和我们预期的不一样。
9.error是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏的bug。
10.测试用例不是用来证明你是对的,而是用来证明你没有错。
测试方法则按照对应的方法名运行方法,测试运行一个类则运行该类下所有@Test修饰的方法,以线程运行,没有先后。
在Idea中使用Junit4生成测试类
在你要创建测试用例的类中按Ctrl + Shift + T,Create New Test...
Junit常用注解
@Test
@Test:将一个普通的方法修饰成为一个测试方法
@Test(expected=异常类.class)用来指示期望抛出的异常类型,抛出指定的异常类型,则测试通过 。
@Test(timeout=毫秒)当测试方法的时间超过这个时间值时测试就会失败。(注意超时了报的是Errors,如果是值错了是Failures)。
import static org.junit.Assert.assertEquals;
@Test public void testAdd() { assertEquals(6, new Calculate().add(3,3)); }
Test(expected=ArithmeticException.class)//不会抛出异常,显示成功 public void testDivide() { assertEquals(3, new Calculate().divide(6, 0)); } @Test(timeout=2000) public void testWhile() { while(true) { System.out.println("run forever..."); } }
@Before&@After注解
1.@BeforeClass修饰的方法会在所有方法被调用前被执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件。
2.@AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的连接
3.@Before和@After会在每个测试方法的前后各执行一次。
import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class JunitFlowTest { @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("this is beforeClass..."); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("this is afterClass..."); } @Before public void setUp() throws Exception { System.out.println("this is before..."); } @After public void tearDown() throws Exception { System.out.println("this is after..."); } @Test public void test1() { System.out.println("this is test1..."); } @Test public void test2(){ System.out.println("this is test2..."); } }
输出:
this is beforeClass...
this is before...
this is test1...
this is after...
this is before...
this is test2...
this is after...
this is afterClass...
@Ignore
@Ignore:所修饰的测试方法会被测试运行器忽略。
会在控制台输出参数信息但不执行下面的Test方法。
@Ignore("输出一些信息。。。") @Test(timeout=2000) public void testWhile() { while(true) { System.out.println("run forever..."); } }
@RunWith
@RunWith:可以更改测试运行器 org.junit.runner.Runner。
Junit4中测试套件
测试套件就是组织测试类一起运行的
写一个作为测试套件的入口类,这个类里不包含其他的方法(主要是使用注解)
更改测试运行器Suite.class
将要测试的类作为数组传入到Suite.SuiteClasses({})
importorg.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})//执行TaskTest1~3中的@Test方法 public class SuiteTest {}
Junit参数化设置
1.更改默认的测试运行器为RunWith(Parameterized.class)
2.声明变量来存放预期值和结果值
3.声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰
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)); } }