我们的单元测试这样算完成了吗?不,上面的测试只能算是一次验证而已。我们给的数据中,大值9是数组的后一个元素,如果9是第一个元素它还正确吗?如果数据是负数呢?等等。我们的求大值函数有着很多的边界情况需要单元测试来验证。

  因此,我们在写单元测试之前,一定要对测试做一个周全的计划,预先设置好要测试的内容,可能发生错误的边界条件。

  下面是对Largest做的测试计划:

  1、数组元素的位置是否对大值产生影响?

  [7,8,9] ? 9
  [7,9,8] ? 9
  [9,8,7] ? 9

  2、如果有两个相等的大值,会出现什么情况呢?

  [7,9,8,9] ? 9

  3、如果数组中只有一个元素,结果会怎么样?

  [1] - 1

  4、如果元素都是负数呢?

  [-7,-8,-9] - -7

  完整的测试代码应该如下:

public class LargestTest extends TestCase {
 
 public void testSimple(){
  assertEquals(9,Largest.largest(new int[]{7,8,9}));
 }
 public void testOrder(){
  assertEquals(9,Largest.largest(new int[]{7,9,8}));
  assertEquals(9,Largest.largest(new int[]{9,8,7}));
 }
 public void testDups(){
  assertEquals(9,Largest.largest(new int[]{7,9,8,9}));
 }
 public void testOne(){
  assertEquals(1,Largest.largest(new int[]{1}));
 }
 public void testNegative(){
   assertEquals(-7,Largest.largest(new int[]{-7,-8,-9}));
 }
}


  当然,你可以写完一个测试方法立即来运行它。这次并没有那么幸运了,在运行后一个测试方法testNegative()时出现了错误:

  junit.framework.AssertionFailedError: expected:<-7> but was:<0>

  at test.junit.LargestTest.testNegative(LargestTest.java:24)

  细心的你,也许在一开始发现了Largest的这个Bug。原来我们的字段max初始化为0是不对的,应该改为Integer.MIN_VALUE。

  由此我们可以想到,使用单元测试确实可以尽早的发现隐藏的BUG,上一篇我们也说过,越早发现BUG能节省更多的时间,降低更多的风险。

  这是,我们的单元测试已经完美结束了吗?呵呵,也许你会想到,如果在largest()方法中传入数组为空,又会怎么样呢?这个问题留给我们的读者思考吧。

  写到这里,算是入门结束了吧!关于JUnit的详细介绍,网上有非常多的文章,去google你可以找到一大堆。