最近使用Junit对某个java应用的api进行测试,有一点点小心得,特地跑上来写写
明确测试目的
使用Junit测试应用程序接口,是仅仅为了测试接口的正确性么?
之前我也是一直这样认为的,现在发现这样不够深入,至少作为一个有经验的测试人员而言绝对是不允许的。接口的正确性,按接口文档描述走一遍就可以了,检查接口功能是不是都实现了,是不是与文档说明一致,很简单的。但是,一般来说接口测试的要求是通过应用的接口检查应用的实现情况,这个可能就需要对测试程序框架、测试数据、测试过程进行详细的设计。
框架:
一个类对应一个TestCase;
一个功能中的多个类组成一个TestSuite;
所有测试程序组合成一个最外面的TestSuite;
示例:
一个包含有两个测试用例TestOne和TestTwo的suite:
import junit.framework.Test;
import junit.framework.TestSuite;
public Class oneTestSuite{
public static Test suite(){
TestSuite suite=new TestSuite("name the suite");
suite.addTestSuite(TestOne.class);
suite.addTestSuite(TestTwo.class);
//如果需要显示这个test suite里的测试用例数,可以用suite.countTestCase()来获得,如下面所示,在测试suite名称后面显示测试用例格式:
suite.setName("TestABS 共"+suite.countTestCases()+"个用例");
}
}
测试用例TestOne:
import junit.framework.TestCase;
public Class TestOne extends TestCase{
public void test***(){ //以test开头junit才能识别为用例,另外测试函数需设置为public
do some test...
}
}
一般来说应该是这样设计的,但不排除其他情况,比如,某些情况下能不能按功能划分测试suite呢?(先保留意见,实践实践再说吧)。
测试数据设计:
如果想要很好的测试一个功能,需要全面、丰富的数据,尽可能的准备各种不同的数据,验证该功能对这些数据处理的正确性、准确性是一方面,还需要考虑容错性,所以,数据一定要全。
另外说下数据的存放位置:
1.不能使用d:\data类似的绝对位置,一个是测试用例换到其他机器上执行时需要手动将测试数据拷贝到这个位置,另外一个,如果在linux上运行也会不识别windows文件系统的路径表示方式。
2.可以使用相对路径data\\data.txt,但需要将\\使用file.separator代替:
String dir="data"+file.separator+"data.txt";
3.还有介绍另外一种方法,这里还没验证过,先不写。
应用程序的异常捕获
测试代码中不需要手工捕获异常,捕获异常的这些工作已经全部由Junit代劳了,已经验证过确实如此,而且改过之后的代码明显清晰多了。
public void exampletest () {
try {
// do some test
} catch (someapplicationexception e) {
fail ("caught someapplicationexception exception");
}
}
所以上面的代码很冗余,完全可以写成下面等效却简洁得多的代码:
public void exampletest () throws someapplicationexception {
// do some test
}
执行时如果发生异常,junit会提示异常出现的位置,很容易发现是哪段代码的异常。
使用eclipse自带junit自动生成suite:
File->New->Other->JUnit->JUnit Test Suite->选择需要包含的Class,finish。