junit百度百科:
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
junit作用:
我们知道 Junit 是一个单元测试框架,那么使用 Junit 能让我们快速的完成单元测试。
通常我们写完代码想要测试这段代码的正确性,那么必须新建一个类,然后创建一个 main() 方法,然后编写测试代码。如果需要测试的代码很多呢?那么要么就会建很多main() 方法来测试,要么将其全部写在一个 main() 方法里面。这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。
junit用法:
使用IDEA创建project时将自动导入junit框架。在文件目录能够看到在src目录下包含着main和test文件夹
编写需要测试的用例:
1 public class Calculator { 2 3 /** 4 * 传入两个参数,求和 5 * @param a 6 * @param b 7 * @return 8 */ 9 public int add(int a,int b){ 10 return a+b; 11 } 12 13 /** 14 * 传入两个参数,求差 15 * @param a 16 * @param b 17 * @return 18 */ 19 public int sub(int a,int b){ 20 return a-b; 21 } 22 23 }
不用junit编写测试类:
1 public class CalculatorTest { 2 3 public static void main(String[] args) { 4 Calculator c = new Calculator(); 5 6 //测试 add()方法 7 int result = c.add(1, 2); 8 if(result == 3){ 9 System.out.println("add()方法正确"); 10 } 11 12 //测试 sub()方法 13 int result2 = c.sub(2, 1); 14 if(result2 == 1){ 15 System.out.println("sub()方法正确"); 16 } 17 } 18 }
那么我们可以看到,不用 Junit 只能写在 main()方法中,通过运行结果来判断测试结果是否正确。这里需要测试的只有两个方法,如果有很多方法,那么测试代码就会变得很混乱。
使用junit编写测试类:
1 public class CalculatorTest { 2 3 @Test 4 //测试 add()方法 5 public void testAdd(){ 6 Calculator c = new Calculator(); 7 int result = c.add(1, 2); 8 Assert.assertEquals(result, 3); 9 } 10 11 @Test 12 //测试 sub()方法 13 public void testSub(){ 14 Calculator c = new Calculator(); 15 int result = c.sub(2, 1); 16 Assert.assertEquals(result, 1); 17 } 18 }
那么由上面可以看到,使用 Junit 不需要创建 main() 方法,而且每个测试方法一一对应,逻辑特别清晰。可能有读者会问,这样写代码量也并不会减少啊,那么你接着往下看:
首先介绍 Junit 的几种类似于 @Test 的注解:
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 中
1 public class CalculatorTest { 2 Calculator c = null; 3 4 @Before 5 public void testBeforeClass(){ 6 c = new Calculator(); 7 } 8 @Test 9 //测试 add()方法 10 public void testAdd(){ 11 int result = c.add(1, 2); 12 //Assert.assertEquals(result, 3); 13 //等价于: 14 if(result == 3){ 15 System.out.println("add()方法正确"); 16 } 17 } 18 19 @Test 20 //测试 sub()方法 21 public void testSub(){ 22 int result = c.sub(2, 1); 23 //Assert.assertEquals(result, 1); 24 //等价于: 25 if(result == 1){ 26 System.out.println("sub()方法正确"); 27 } 28 } 29 30 }
同理:别的注解用法我们用一个类来看:
1 public class JunitTest { 2 public JunitTest() { 3 System.out.println("构造函数"); 4 } 5 6 @BeforeClass 7 public static void beforeClass(){ 8 System.out.println("@BeforeClass"); 9 } 10 11 @Before 12 public void befor(){ 13 System.out.println("@Before"); 14 } 15 16 @Test 17 public void test(){ 18 System.out.println("@Test"); 19 } 20 21 @Ignore 22 public void ignore(){ 23 System.out.println("@Ignore"); 24 } 25 26 @After 27 public void after(){ 28 System.out.println("@After"); 29 } 30 31 @AfterClass 32 public static void afterClass(){ 33 System.out.println("@AfterClass"); 34 } 35 }
结果:
1 @BeforeClass 2 构造函数 3 @Before 4 @Test 5 @After 6 @AfterClass
注意:编写测试类的原则:
①测试方法上必须使用@Test进行修饰
②测试方法必须使用public void 进行修饰,不能带任何的参数
③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
④测试类所在的包名应该和被测试类所在的包名保持一致
⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
⑥测试类使用Test作为类名的后缀(不是必须)
⑦测试方法使用test作为方法名的前缀(不是必须)