Junit4单元测试

Posted zzp-biog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Junit4单元测试相关的知识,希望对你有一定的参考价值。

要点:   

       注解  断言  参数化  套件(testSuite)

 

 

一、引入Junit4单元测试框架

   项目上单击右键->new->other->JUnit->Junit Test Case->Next->New Juint 4 test ->Name->setup->teardown->Class Under Test->Next->勾选你要测试的函数 ->Finish->提示引入JUnit库->Finish

 

二、简单的实例代码

1.被测试类:

 1 package com.zhang.java;
 2 
 3 public class LoginSample {
 4     public LoginSample() {        //构造方法
 5         System.out.println("构造方法被调用!");
 6     }
 7 
 8     public boolean login(String ln, String pwd) {
 9         if (ln != null && ln.length() > 2 && ln.length() < 17 && pwd != null && pwd.length() > 2 && pwd.length() < 17) {
10             if (ln.equals("zzp") && pwd.equals("123456")) {
11                 System.out.println("恭喜您,登录成功!");
12                 return true;
13             } else {
14                 System.out.println("用户名或密码错误!");
15             }
16         } else {
17             System.out.println("参数错误!");
18         }
19         return false;
20     }
21 
22 }

2、测试类代码:

 1 package com.zhang.java;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.After;
 6 import org.junit.AfterClass;
 7 import org.junit.Before;
 8 import org.junit.BeforeClass;
 9 import org.junit.Test;
10 
11 public class LoginSampleTest {
12 
13     /**
14      * BeforeClass和Before做测试环境的初始化;
15      * AfterClass和After做数据的清理扫尾工作(如关闭数据库连接)
16      */
17     
18         private LoginSample login;
19     
20     //在测试类执行之前执行的方法
21     @BeforeClass
22     public static void setUpBeforeClass() throws Exception {
23         System.out.println("@BeforeClass方法被执行");
24     }
25 
26     //在测试类执行之后执行的方法
27     @AfterClass
28     public static void tearDownAfterClass() throws Exception {
29         System.out.println("@AfterClass方法被执行");
30     }
31 
32     @Before
33     public void setUp() throws Exception {
34         System.out.println("@Before被调用%%%%%%%%%%%%");
35         login = new LoginSample();
36     }
37 
38     @After
39     public void tearDown() throws Exception {
40         System.out.println("@After被调用&&&&&&&&&&&&&&&&&");
41     }
42 
43     //在一个测试类中可以有多个@test注解的测试方法
44     @Test
45     public void testLogin() {
46         System.out.println("testLogin()方法被调用");
47 //        fail("Not yet implemented");
48         boolean result = login.login("zzp", "123456");
49         if(result)
50             System.out.println("测试通过!");
51         else
52             fail("测试失败!");    //用到测试框架的断言fail()方法
53         
54         System.out.println("===========");
55     }
56 
57 }

测试类运行结果:

@BeforeClass方法被执行
@Before被调用%%%%%%%%%%%%
构造方法被调用!
testLogin()方法被调用
恭喜您,登录成功!
测试通过!
===========
@After被调用&&&&&&&&&&&&&&&&&
@AfterClass方法被执行

 

三、补充说明

技术分享图片

 

 四、Junit参数化数据驱动

 

 1、相关注解:

@RunWith(Parameterized.class):注解JUnit测试类,指定该测试类使用参数化方式运行,要写在测试类外面(不是类里面);

@Parameters:生成并返回测试数据,一般使用Object[][]二位数组来接收数据返回。该方法必须是静态方法,因为要在测试方法运行之前生成测试数据。

 

2、相关方法:

  在JUnit参数化的类中,需要有一个构造方法,用于存储和传递测试数据。 由@Parameters注解的静态方法,是一个Collection或者Iterator,生成并返回测试数据。

   构造方法需要用对应的参数列表接收数据。 这样,数据将被传递到@Test注解的测试方法,逐条进行测试,直到集合中不再有元素为止。

 

3、代码展示

a、被测试类代码

 1 package com.zhang.java;
 2 
 3 public class Plus {
 4     
 5     public int Sum(int x, int y) {
 6         int result=x+y;
 7         return result;
 8     }
 9     
10 }

b、单元测试用例代码

 1 package com.zhang.java;
 2 
 3 import static org.junit.Assert.*;
 4 import org.junit.Before;
 5 import org.junit.Test;
 6 import org.junit.runner.RunWith;
 7 import org.junit.runners.Parameterized;
 8 import org.junit.runners.Parameterized.Parameters;
 9 
10 //写在测试类前,表示该测试类用参数化形式运行。
11 @RunWith(Parameterized.class)
12 public class PlusTest {
13     
14   //用成员变量接收来自parameter方法生成的数据
15     //测试名
16     public String caseName;
17     //测试预期结果
18     public String exResult;
19     //测试用到的数据
20     public int firstNum;
21     public int secondNum;
22     private Plus p;
23     
24     //测试前的准备,初始化被测试类。
25     @Before
26     public void setUp() throws Exception {
27         p=new Plus();
28     }
29     
30     //构造函数用于接收数据parameter的数据,并给成员变量赋值。
31     public PlusTest(String input1,String input2,int input3 ,int input4) {
32         caseName=input1;
33         exResult=input2;
34         firstNum=input3;
35         secondNum=input4;
36     }
37     
38     @Parameters(name="{0},res:{1},operater:sum({2}+{3})")
39     public static Object[][] setData(){
40         return new Object[][] {
41             {"左边界-1","-2147483649",-2147483648,-1},          //Object[0][]
42             {"左边界+0","-2147483648",-2147483648,0},           //Object[1][]
43             {"左边界+1","-2147483647",-2147483648,1}            //Object[2][]
44         };
45     }
46     
47     //每一条数据都会用于执行一次@Test测试方法   
48     @Test
49     public void testSumIntInt() {
50         System.out.println(caseName);
51         //用到的方法:
52         //void org.junit.Assert.assertEquals(String message, Object expected, Object actual)
53         assertEquals(caseName,exResult, Integer.toString(p.Sum(firstNum, secondNum)));
54     }
55 
56 }

运行后的结果

左边界-1
左边界+0
左边界+1

 

五、TestSuite测试套件

创建方法:

  在包含JUnit4 case的包中右键->new->other->JUnit->Junit Test Suite>Next ->New JUnit4 Suite->Name->选择你需要执行的Case->Finish。

添加case:

  在@SuiteClasses注解中指定要执行的case,以classname.class的形式添加,如下:

  @SuiteClasses({ JUnit4.class })

 

以上是关于Junit4单元测试的主要内容,如果未能解决你的问题,请参考以下文章

利用JUnit4进行单元测试

利用JUnit4进行单元测试

Java高级技术 单元测试(JUnit4)

Spring+JUnit4单元测试入门

Java单元测试工具:JUnit4

如何解决JUnit4单元测试报错 :method initializationerror not found