经验四、在子类中调用父类的setUp() 和tearDown()
让我们看一看下面的代码
public class SomeTestCase extends AnotherTestCase {
// A connection to a database
private Database theDatabase;
public SomeTestCase (String testName) {
super (testName);
}
public void testFeatureX () {
...
}
public void setUp () {
// Clear out the database
theDatabase.clear ();
}
}
你发现其中的错误了吗?setUp()应该调用super.setUp() 以确保AnotherTestCase 中定义的环境被初始化了。当然这也有例外,是基类可以处理任意的测试数据。
经验五、不要硬性规定数据文件的路径
我们经常需要从文件系统中读取测试数据,看下面的代码:
public void setUp () {
FileInputStream inp ("C:\TestData\dataSet1.dat");
...
}
这段代码需要把测试数据文件dataSet1.dat 放在C:TestData,这是有问题的。
第一,C 盘可能没有磁盘空间了测试人员不得不把数据文件放到其他路径;
第二,可能需要在其他操作系统比如Linux 上执行这一测试。
所以,一个较好的替代方案是
public void setUp () {
FileInputStream inp ("dataSet1.dat");
...
}
但事实上这样仍不是很好,因为这要求数据文件的路径和测试执行的路径必须是同一个,如果几个不同的测试都这样的话,那要把这些测试集合起来执行有些困难,我们不得不频繁的改变当前路径。为了解决这个问题,我们可以使用Class.getResource()或者Class.getResourceAsStream(),这样我们可以把数据文件放在这个Class 的某个相对路径上。数据文件应该尽可能和源代码一起都放在配置管理系统上,但这样一来如果我们采用上面的Resource 机制,我们需要做一件工作,是把数据文件从原来的位置-是源代码的某个相对路径,拷贝到编译后的位置,也是class 文件的相应的相对路径。这其实并不复杂,因为从class 的package 可以映射到java文件的所在路径对于Linux或者Windows我们所要做的是把package中的. 用File.separatorChar 替代。
经验六、把测试的代码和被测的代码放在同样的目录下
当我们把测试代码和被测的代码放在同一目录下时,我们可以在编译被测代码的同时编译测试代码,从而确保两者是同步更新的。事实上当前的普遍做法,是把单元测试视为Build 的一个环节。
经验七、正确命名测试
把测试用例命名为TestClassUnderTest,比如如果被测的Class 是MessageLog,那么测试用例叫TestMessageLog,这样做使得测试用例和被测的Class一一对应,而在测试用例中每个测试的method 可以命名为
testLoggingEmptyMessage()
testLoggingNullMessage()
testLoggingWarningMessage()
testLoggingErrorMessage()
同样是为了说清楚测试的是什么。正确的命名可以帮助测试代码的阅读者了解每个测试的目的。