要点:
注解 断言 参数化 套件(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 })