什么是单元测试

  如果你对单元测试已经有概念了,请跳过本章。

  简单地说,单元测试是用代码测试代码。不同的语言有不同的库,提供了多种测试工具。PHP有PHPUnit、SimpleTest;Java有JUnit;.NET框架则有NUnit等等。

  使用这些工具编写测试代码后,你可以非常方便地进行自动、重复的单元测试。通过编写单元测试代码,你可以保证所写的代码能够得到预期的运行结果。即使日后代码要做修改,只要重新运行单元测试并获得通过,则能说明新的代码是正确的。

  Wikipedia上的一篇文章对单元测试作了非常好的定义,如果想深入了解的话可以去阅读。

  何时使用单元测试

  简单的回答是:永远。

  稍长一点的回答是:这取决于项目的复杂度和生命周期。

  如果是一个非常小型的项目,那花在编写单元测试上的时间更应该用在写项目上。因为如果项目比较简单,可以在编写代码的时候进行手工测试,这应该是比较容易的。

  如果项目的生命周期较短,你肯定也不愿花大把时间用来写单元测试。因为生命周期较短的项目不会进行较大的改动,也不需要进行较多维护。这样一来,单元测试的价值体现不了了。

  即便如此,如果你确实有时间和精力去为小型项目写单元测试的话,也可能是个不错的主意。这主要看实际情况如何,但是我上面提出的两种情况还是有代表性的。

  写好单元测试

  单元测试的目的是测试一段代码的运行结果是否正确。这段代码通常是某个类的某个方法。

  通常来说应该给每个行为编写一个测试:给出正确的参数时的运行结果、非法参数的运行结果,对这两点的测试是一定要写的。根据实际情况,也许需要编写更多的测试。


  代码覆盖率是用来衡量单元测试好坏的常用指标。也是说,有多少代码是被测试到的,各个分支结构和代码块是否都被运行过,各个函数是否都被调用过等等。


  但是,代码覆盖率这个指标有时也会产生误导,因为即使全部的代码都被测试到了,也未必说明这些代码所得到的运行结果是正确的。

  下周我会给你一些例子来说明这个问题。

  小结

  单元测试可以很好地提高代码质量,包括正确性以及模块化程度。因为,它会促使你写出可重用的、灵活的代码,否则将很难进行测试。

  下周我会举具体的例子来说明如何进行代码测试,敬请期待。