Junit总结

mac2022-07-05  33

什么是Junit

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

Junit官网

官网地址

 

使用步骤 

1、创建一个Java project项目,取名为Junit

2、创建Junit类,定义四个方法,即加减乘除。

public class Junit { public int add(int a, int b) { return a+b; } public int subtraction(int a ,int b) { return a-b; } public int division(int a,int b) { return a/b; } public int multiplication(int a,int b) { return a*b; } }

3、导入jar包

从官网上下载jar包,之后导入eclipse中,右键点击jar----> build path----->Add to Build Path即可。

或者右键点击项目名------>Build Path----->Add Libraries(不用下载那些jar包,因为eclipse内部集成了,我们只需要引入即可)

 

选择Junit,点击next

 

选择Junit5,点击finish 

4、测试

①不用Junit

public class JunitTest { public static void main(String[] args) { Junit junit = new Junit(); //测试 add()方法 int result = junit.add(1, 2); if(result==3) { System.out.println("add()方法正确"); } //测试 subtraction()方法 int result2 = junit.subtraction(2, 1); if(result2==1) { System.out.println("subtraction()方法正确"); } //测试 multiplication()方法 int result3 = junit.multiplication(2, 3); if(result3==6) { System.out.println("multiplication()方法正确"); } //测试 division()方法 int result4 = junit.division(6, 2); if(result4==3) { System.out.println("division()方法正确"); } } }

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

②使用Junit方法

import org.junit.Assert; import org.junit.Test; public class JunitTest { @Test public void testAdd() { Junit junit = new Junit(); Assert.assertEquals(3, junit.add(1, 2)); } @Test public void testSubtraction() { Junit junit = new Junit(); Assert.assertEquals(1, junit.subtraction(2, 1)); } @Test public void testDivision() { Junit junit = new Junit(); Assert.assertEquals(2, junit.division(6, 3)); } @Test public void testMultiplication() { Junit junit = new Junit(); Assert.assertEquals(6, junit.multiplication(2, 3)); } }

运行结果如图所示

 

错误案例

当绿条变成红色的时候,代表测试对象有误,其中包括两种错误,一个是Failure,另一个是Error。Failure的出现代表程序运行的实际值和预期值不符,而Error的出现代表代码本身有误或者有隐藏的bug。

在这里将testAdd方法里面的结果改为4

结果如图

 

注解

注解与注释不同,注释是由“//”等开头,而注解是“@”开头。两者的区别是注解不会对程序本身有任何影响,其作用仅仅是方便我们更好的理解代码。而注解是对程序本身又影响的,它相当于是一个可执行的代码。  JUnit常用注解及其作用有:

注解名作用@Before初始化方法@After释放资源@Test测试方法,在这里可以测试期望异常和超时时间@Ignore忽略的测试方法@BeforeClass针对所有测试,只执行一次,且必须为static void@AfterClass针对所有测试,只执行一次,且必须为static void@RunWith指定测试类使用某个运行器@Parameters指定测试类的测试数据集合@Rule允许灵活添加或重新定义测试类中的每个测试方法的行为@FixMethodOrder指定测试方法的执行顺序

让我们来测试一把吧

import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; 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"); } }

 测试结果如图:

从上述测试可知: 1. 被@BeforeClass注解修饰的方法第一个执行  2. 被@Before注解修饰的方法会在每个@Test方法执行前执行一次  3. 被@After注解修饰的方法会在每个@Test方法执行后执行一次  4. 被@AfterClass注解修饰的方法最后一个执行  利用以上特性我们可以有效的实现初始化以及结尾清除功能  

进阶使用

@Test有两个可控的参数,分别为timeout和expected

public class JunitTest { @Test(timeout=1) public void test() { while(true) { System.out.println("running....."); } } @Test(expected=ArithmeticException.class) public void test2() { Assert.assertEquals(3, new Junit().division(6, 0)); } }

test()方法中写入的是一个死循环,按照常理来说应该是死循环直到内存溢出,现在我们对test()进行测试,控制台的结果是 

 

可以看到,程序自动停止了。这就是timeout参数的作用,规定程序在n毫秒之内结束,如果测试代码没有在n毫秒内结束,在第n毫秒时会强制停止。test()上的timeout规定在了1毫秒,所以死循环也就只执行了1毫秒。

test2()函数中写入的是一个断言,判断6/0是否等于3,按照之前的测试来看,测试应该是报Error,因为除数不能为0,但我们加上expected之后,程序测试结果如下

绿条表示测试成功。  expected参数的含义是指期望抛出什么异常(也就是说加上这个参数后,测试的目的就变成了看它是否会抛出指定异常,如果抛出了就是绿条,没抛出指定异常就变红条)

 

最后

 

注意:编写测试类的原则: 

    ①测试方法上必须使用@Test进行修饰

         ②测试方法必须使用public void 进行修饰,不能带任何的参数

         ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开

         ④测试类所在的包名应该和被测试类所在的包名保持一致

         ⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖

         ⑥测试类使用Test作为类名的后缀(不是必须)

         ⑦测试方法使用test作为方法名的前缀(不是必须)

 

原文链接:https://blog.csdn.net/yu514950381/article/details/79773914

最新回复(0)