单元测试(junit testing),是指对软件中的最小可测试单元进行检查和验证。Java里单元指一个类。
JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元测试库,是非常重要第三方 Java 库,由 Kent Beck 和 Erich Gamma 开发。
Junit作为一个软件测试的工具,JUnit可以不破坏java原代码,使用方便,添加快捷,代码量少,可视化的测试。
JUnit单元测试步骤:
1.导入包junit测试包:JUnit测试版本,3.81版,4.0版,导入对应的jar包;
2.写一个类扩展(继承)TestCase;
3.在需要测试的方法名前加test生成新的测试方法;
4.运行测试,用断言(assert***)的方法测试成功(显示绿色)或失败(显示红色),或者自己判断结果正确与否。
Unit3.81与JUnit4.0区别:
1.在 JUnit 4 中,测试是由 @Test 注释来识别的;
2.Unit 3.81 测试运行程序时会在运行每个测试之前自动调用 setUp() 方法,在JUnit4.0中,要用 @Before 注释;
3.在 JUnit 3.81 中,测试运行程序时会在运行每个测试之前自动使用 tearDown() 方法清除消耗的资源,在JUnit4.0中,用 @After 注释。
注意:如果需测试的方法没有返回值,只能测试其过程。
JUnit4新特性:
1.属于类范围的 setUp()方法 和 tearDown() 方法,任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前运行一次,而任何用 @AfterClass 注释的方法都将在该类中的所有测试都运行之后运行一次;
2.异常测试:编写抛出异常的代码,并使用注释来声明该异常是预期的;
3.在需要高效率的测试中,有些代码测试你认为可以跳过,这类测试可以被注释为 @Ignore
4.时间测试可以用超时参数来注释,如果测试的运行时间超过指定的毫秒数,测试失败。
5.增加两个新的断言方法:
(1)public static void assertEquals(Object[] expected, Object[] actual)
(2)public static void assertEquals(String message, Object[] expected, Object[] actual) 这两个方法用来比较数组:如果数组长度相等且对应的元素相同,则这两个数组相等,否则不等,也考虑了数组为空的情况。
首先创建一个Java工程,在工程中创建一个被单元测试的Student数据类
1 package com.phicomme.hu; 2 3 public class Student 4 { 5 6 private String name; 7 private String sex; 8 private int high; 9 private int age; 10 private String school; 11 12 public Student(String name, String sex ,int high, int age, String school) 13 { 14 this.name = name; 15 this.sex = sex; 16 this.high = high; 17 this.age = age; 18 this.school = school; 19 } 20 public String getName() 21 { 22 return name; 23 } 24 public void setName(String name) 25 { 26 this.name = name; 27 } 28 public String getSex() 29 { 30 return sex; 31 } 32 public void setSex(String sex) 33 { 34 this.sex = sex; 35 } 36 public int getHigh() 37 { 38 return high; 39 } 40 public void setHigh(int high) 41 { 42 this.high = high; 43 } 44 public int getAge() 45 { 46 return age; 47 } 48 public boolean setAge(int age) 49 { 50 if (age >25) 51 { 52 return false; 53 } 54 else 55 { 56 this.age = age; 57 return true; 58 } 59 } 60 61 62 public String getSchool() 63 { 64 return school; 65 } 66 public void setSchool(String school) 67 { 68 this.school = school; 69 } 70 71 }
在eclipse下单元测试这个类:
首先导入Junit包:选中java工程,点击鼠标右键--->选择properties---->在窗口中选Java Build Path---->在右侧点击Add Library---->在弹出的窗口列表中选中Junit---->下一步----->Junit 4(我用的是Junit 4)---->finish
这样Junit 4包就导完了,接下来就是创建测试类:
将测试类和被测试类放在不同的包中(也可以放在同一个包中,此处只是为了区别),代码如下:
测试类1:
1 package com.phicomme.test; 2 3 import com.phicomme.hu.Student; 4 5 import junit.framework.TestCase; 6 7 public class StudentTest01 extends TestCase 8 { 9 10 Student testStudent; 11 //此方法在执行每一个测试方法之前(测试用例)之前调用 12 @Override 13 protected void setUp() throws Exception 14 { 15 // TODO Auto-generated method stub 16 super.setUp(); 17 testStudent = new Student("djm", "boy", 178, 24, "华东政法"); 18 System.out.println("setUp()"); 19 } 20 21 //此方法在执行每一个测试方法之后调用 22 @Override 23 protected void tearDown() throws Exception 24 { 25 // TODO Auto-generated method stub 26 super.tearDown(); 27 System.out.println("tearDown()"); 28 } 29 30 //测试用例,测试Person对象的getSex()方法 31 public void testGetSex() 32 { 33 assertEquals("boy", testStudent.getSex()); 34 System.out.println("testGetSex()"); 35 } 36 37 //测试Person对象的getAge()方法 38 public void testGetAge() 39 { 40 assertEquals(24, testStudent.getAge()); 41 System.out.println("testGetAge()"); 42 } 43 }
测试类2:
1 package com.phicomme.test; 2 3 import junit.framework.TestCase; 4 5 import com.phicomme.hu.Student; 6 7 public class StudentTest extends TestCase 8 { 9 10 private Student testStudent; 11 12 @Override 13 protected void setUp() throws Exception 14 { 15 // TODO Auto-generated method stub 16 super.setUp(); 17 testStudent = new Student("steven_hu", "boy", 170 , 23, "上海理工"); 18 } 19 20 @Override 21 protected void tearDown() throws Exception 22 { 23 // TODO Auto-generated method stub 24 super.tearDown(); 25 } 26 27 public void testSetage() 28 { 29 assertTrue(testStudent.setAge(21)); 30 } 31 32 public void testGetSchool() 33 { 34 //预期值和实际值不一样,测试时出现失败(Failure) 35 assertEquals("南昌大学", testStudent.getSchool()); 36 } 37 38 public void testGetName() 39 { 40 assertEquals("hdy", testStudent.getName()); 41 } 42 }
当然,如果同时需要一起测试以上这两个测试类,可以通过TestSuite类实现,它相当于是一个套件,可以把所有测试类添进来一起运行测试。
1 package com.phicomme.test; 2 3 import com.phicomme.hu.StudentTest02; 4 5 import junit.framework.Test; 6 import junit.framework.TestSuite; 7 8 public class AllTest 9 { 10 11 //static PersonTest p = new PersonTest(); 12 //static PersonTest p1 = new PersonTest(); 13 public static Test suite() 14 { 15 TestSuite suite = new TestSuite("Test for com.phicomme.test"); 16 //suite.addTest(p); 17 //suite.addTest(p1); 18 suite.addTestSuite(StudentTest.class); 19 suite.addTestSuite(StudentTest01.class); 20 return suite; 21 22 } 23 }
最后,分别测试以上三个类(选中需要测试的类---->鼠标右键---->Run As---->Junit Test):
StudentTest类的测试结果图:
StudentTest01类的测试结果图:
AllTest类的测试结果图: