9.1 JUnit初探

  JUnit是一个Java语言的单元测试框架,现已成为xUnit家族中最为成功的一个。JUnit 是Java语言事实上的标准测试库,多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

  在JUnit4推出前,由于三年未做更新,地位受到了其他Java单元测试工具的挑战。相对JUnit3而言,JUnit4是一个全新的Java单元测试框架,最大的特点是利用JDK1.5的注解特性简化测试用例的编写(所以要使用JUnit4,要求JDK必须是JDK1.5或以上版本)。

9.1.1 “加”类JUnit3测试

  首先从最简单的一个案例开始,学习如何使用JUnit3和JUnit4进行单元测试。被测对象“加”类的代码如下:

  1. public class AddOperation{
  2. public int add(int x,int y){
  3. return x + y;
  4. }
  5. }

  接下来使用JUnit3对“加”类进行单元测试,测试前需要导入JUnit3软件包。具体代码如下(其中对部分代码进行了注释,方便大家阅读):

  1. import junit.framework.*;
  2. public class TestAddOperation extends TestCase{
  3. public void setUp() throws Exception{}
  4. public void tearDown() throws Exception{}
  5. //测试AddOperation类的add()方法
  6. public void testAdd(){
  7. //输入值
  8. int x = 3;
  9. int y = 5;
  10. AddOperation instance = new AddOperation();
  11. int expResult = 8; //预期结果
  12. int result = instance.add(x, y); //获取实际结果
  13. //通过断言判断实际结果和预期结果的差异,前者为预期,后者为实际
  14. assertEquals(expResult,result);
  15. }
  16. }

  从上面的代码可以看出,使用JUnit3进行单元测试,单元测试类TestAddOperation必须继承自 TestCase,执行测试的方法必须以test开头,并且使用各种类型的断言判断实际结果和预期结果的差异。

  该单元测试类测试了被测类AddOperation中的add()方法。编译、运行程序(运行程序的命令为java -ea junit.textui.TestRunner TestAddOperation,含义为用JUnit3文本运行机的方式执行单元测试类TestAddOperation。),因为通过断言判断的add()方法的实际运行结果3+5=8和预期结果8一致,所以单元测试运行结果如图9. 1所示。

9.1 JUnit初探 - 图1


图9.1 JUnit3测试“加”类显示结果一


  假设针对该“加”类有这样的测试用例,输入数据仍然为3和5,预期结果为15,再次编译、运行程序,单元测试运行结果如图9.2所示。

9.1 JUnit初探 - 图2


图9.2 JUnit3测试“加”类显示结果二

  从运行结果可以看出,JUnit3单元测试框架发现,针对AddOperation类的add()方法进行单元测试,实际运行结果3+5=8和预期结果15不一致,所以提示出现了一个失败,并且明确指出了失败的原因。

9.1.2 “加”类JUnit4测试

  同样对“加”类进行单元测试,不过这次是使用 JUnit4 进行单元测试,测试前需要先导入JUnit4软件包,具体代码如下:

  1. import org.junit.*;
  2. import static org.junit.Assert.*;
  3. public class TestAddOperation{
  4. @Before
  5. public void setUp() throws Exception{}
  6. @After
  7. public void tearDown() throws Exception{}
  8. @Test//测试AddOperation类的add()方法
  9. public void add(){
  10. int x = 3;
  11. int y = 5;
  12. AddOperation instance = new AddOperation();
  13. int expResult = 8;
  14. int result = instance.add(x, y);
  15. assertEquals(expResult,result);
  16. }
  17. }

  注意,使用JUnit4对AddOperation类中的add()方法进行单元测试,导入的是org.junit包里的内容,已经不再是junit.framework包,并且单元测试类TestAddOperation不需要再继承自TestCase类。

  使用了静态导入import static org.junit.Assert.*;,把org.junit.Assert包里的静态变量和方法导入到这个类中,调用Assert包里的assertEquals(expResult, result)方法和调用自己的方法没有区别。

  测试方法也不必以test开头了,只要以@Test注解来描述即可。案例中还使用了一些其他的注解,如@Before、@After,JUnit4支持多种注解来简化测试类的编写,例如使用了@Before注解的方法在每个测试方法执行之前都要执行一次,使用了@After注解的方法在每个测试方法执行之后都要执行一次。并且@Before和@After标注的方法只能各有一个,这相当于取代了JUnit以前版本中的setUp()和tearDown()方法。当然在JUnit4中,还可以给被注解的方法继续起JUnit以前版本规定的名字,不过这对程序员来说只是个人喜好而已。

  编译、运行程序(运行程序的命令为java -ea org.junit.runner.JUnitCore TestAddOperation,含义为用JUnit4运行机执行单元测试类TestAddOperation,这个JUnit4运行机可以运行JUnit3的单元测试类,但JUnit3的文本运行机不可以执行JUnit4的单元测试类),运行结果如图9.3所示。

9.1 JUnit初探 - 图3


图9.3 JUnit4测试“加”类显示结果一

  同样的,把预期结果从8改成15,再次编译、运行,其运行结果如图9.4所示。从运行结果来看,和JUnit3相比,还是有一些不同的。

9.1 JUnit初探 - 图4


图9.4 JUnit4测试“加”类显示结果二