什么是单元测试
如果你对单元测试已经有概念了,就请跳过本章。
简单地说,单元测试是用代码测试代码。不同的语言有不同的库,提供了多种测试工具。PHP有PHPUnit、SimpleTest;Java有JUnit;.NET框架则有NUnit等等。
使用这些工具编写测试代码后,你就可以非常方便地进行自动、重复的单元测试。通过编写单元测试代码,你可以保证所写的代码能够得到预期的运行结果。即使日后代码要做修改,只要重新运行单元测试并获得通过,则能说明新的代码是正确的。
Wikipedia上的一篇文章对单元测试作了非常好的定义,如果想深入了解的话可以去阅读。
何时使用单元测试
简单的回答是:永远。
稍长一点的回答是:这取决于项目的复杂度和生命周期。
如果是一个非常小型的项目,那花在编写单元测试上的时间更应该用在写项目上。因为如果项目比较简单,就可以在编写代码的时候进行手工测试,这应该是比较容易的。
如果项目的生命周期较短,你肯定也不愿花大把时间用来写单元测试。因为生命周期较短的项目不会进行较大的改动,也不需要进行较多维护。这样一来,单元测试的价值就体现不了了。
即便如此,如果你确实有时间和精力去为小型项目写单元测试的话,也可能是个不错的主意。这主要看实际情况如何,但是我上面提出的两种情况还是有代表性的。
写好单元测试
单元测试的目的是测试一段代码的运行结果是否正确。这段代码通常是某个类的某个方法。
通常来说应该给每个行为编写一个测试:给出正确的参数时的运行结果、非法参数的运行结果,对这两点的测试是一定要写的。根据实际情况,也许需要编写更多的测试。
代码覆盖率是用来衡量单元测试好坏的常用指标。也就是说,有多少代码是被测试到的,各个分支结构和代码块是否都被运行过,各个函数是否都被调用过等等。
但是,代码覆盖率这个指标有时也会产生误导,因为即使全部的代码都被测试到了,也未必说明这些代码所得到的运行结果是正确的。
下周我会给你一些例子来说明这个问题。
小结
单元测试可以很好地提高代码质量,包括正确性以及模块化程度。因为,它会促使你写出可重用的、灵活的代码,否则将很难进行测试。
下周我会举具体的例子来说明如何进行代码测试,敬请期待。