1、Junit是什么?
2、Junit有什么用?
我们知道 Junit 是一个单元测试框架,那么使用 Junit 能让我们快速的完成单元测试。
通常我们写完代码想要测试这段代码的正确性,那么必须新建一个类,然后创建一个 main() 方法,然后编写测试代码。如果需要测试的代码很多呢?那么要么就会建很多main() 方法来测试,要么将其全部写在一个 main() 方法里面。这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。
3、Junit相比平常的测试方法有什么优点?
1、在实现自动单元测试的情况下可以大大的提高开发的效率。
2、减小回归错误的纠错难度。
3、减少回归错误造成的时间消耗。
4、Junit的用法
一、首先下载 Junit jar 包
二、下载完成之后,在项目中将 下载的 jar 包添加啊进去。
三、下面编写测试类
package com.nf147.bookstore_ssm.Test;
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;
}
}
1、不用Junit:
package com.nf147.bookstore_ssm.Test;
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()方法正确");
}
}
}
2、使用Junit:
package com.nf147.bookstore_ssm.Test;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Main {
@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);
}
}
从上面两种方法中,我们可以看出,不使用Junit 要把代码写入Main里面,这里只有两个方法,如果有十几个方法,代码就会很乱,如果出错了也很难寻找错误所在地。
接下来我们就运行测试类检查我们的代码
如果运行成功,代码没有错误,我们会出现1、1、0、0,而且颜色是为绿色的
如果运行失败,会出现1、0、1、0,颜色为红色,并且会告诉你错误的地方在哪,方便我们去修改代码
那么由上面可以看到,使用 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 中
package com.nf147.bookstore_ssm.Test;
import org.junit.*;
import org.testng.Assert;
public class Main {
Calculator c = null;
@Before
public void testClass(){
c = new Calculator();
}
@Test
//测试add方法
public void TestAdd(){
int result = c.add(1,2);
System.out.println("加法");
Assert.assertEquals(result,3);
}
@Test
//测试sub方法
public void TestSub(){
int result = c.sub(2,1);
Assert.assertEquals(result,1);
}
}
同理:别的注解用法我们用一个类来看:
package com.nf147.bookstore_ssm.Test;
import org.junit.*;
public class JunitTest {
public JunitTest() {
System.out.println("构造函数");
}
@Before
public void befor(){
System.out.println("@Before");
}
@BeforeClass
public static void beforeClass(){
System.out.println("@BeforeClass");
}
@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");
}
}
注意:编写测试类的原则:
①测试方法上必须使用@Test进行修饰
②测试方法必须使用public void 进行修饰,不能带任何的参数
③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
④测试类所在的包名应该和被测试类所在的包名保持一致
⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
⑥测试类使用Test作为类名的后缀(不是必须)
⑦测试方法使用test作为方法名的前缀(不是必须)