Michael Feathers在Artima自己的Blog中 2005-9-9 发表了一篇A Set of Unit Testing Rules的文章,提出了如下的代码不是单元测试:
1. 访问数据库It talks to the database
2. 访问网络It communicates across the network
3. 访问文件系统It touches the file system
4. 不能和其他的单元测试代码同时运行It can't run at the same time as any of your other unit tests
5. 做特殊的事情运行测试的代码You have to do special things to your environment (such as editing config files) to run it.
使用一句话概括就是:把你的单元测试代码的逻辑和耗时的、与测试逻辑无关的代码分开;单元测试应该是纯粹的单元测试。
单元测试要严格遵守这些原则有时候很困难,需要变通的办法,我的想法是:
1. 测试逻辑概念函数和需要交涉的功能函数分开。如果一个测试逻辑概念函数,需要和文件、网络、数据库打交道,那么尽量的分开它们;
2. 把文件需要的内容以二进制的形式插入到代码中。这虽然很笨拙,但是消除了对文件的依赖。
3. 建立配置文件。有时候不得已还需要建立配置文件。
4. 使用错误的消息输出。一旦配置文件没有设定好,通过输出消息报告给用户。