一:junit 3.8使用原则
测试类必须要继承与TestCase父类;
测试方式需要满足如下原则:
1)public的
2)void的
3)无方法参数
4)方法名称必须以test开头
Test Case之间一定要保持完全的独立性,不允许出现任何的依赖关系。
使用Assert中的各类assert方法,在测试代码不会执行的地方插入Assert.fail()方法
我们不能依赖于测试方法的执行顺序。
测试之前是什么状态,测试执行完毕后就应该是什么状态,而不应该由于测试执行的原因导致状态发生了变化。
二:使用Junit的最佳实践:
1) 新建一个名为test的source folder,用于存放测试类源代码
2) 目标类与测试类应该位于同一个包下面,这样测试类中就不必导入源代码所在的包,因为他们位于同一个包下面
3) 测试类的命名规则:假如目标类是Calculator,那么测试类应该命名为TestCalculator或者是CalculatorTest
三:关于setUp与tearDown方法的执行顺序:框架会先执行setUp,然后执行测试的方法(比如TestCase中的testAdd()),然后再执行tearDown方法。
四、执行方式:
1)使用ide比如eclipse自带的gui运行框架,右键执行。
2)使用脚本调用:
junit.textui.TestRunner.run(CalculatorTest.class);//使用控制台执行
junit.awtui.TestRunner.run(CalculatorTest.class);//调用junit自身的gui界面执行
五、实现案例:
待测试类Calculator:
package test;
//实现整数的加、减、乘、除
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) throws Exception {
if(0 == b)
throw new Exception("除数不能为0");
return a / b;
}
}
待测试类DeleteAll:
package test;
import java.io.File;
//实现删除某一个文件或者某一个目录下的所有文件
public class DeleteAll
{
public static void deleteAll(File file)
{
if(file.isFile() || file.list().length == 0)
{
file.delete();
}
else
{
File[] files = file.listFiles();
for(File f : files)
{
deleteAll(f);
f.delete();
}
}
}
}
测试类:CalculatorTest
package test;
import junit.framework.Assert;
import junit.framework.TestCase;
public class CalculatorTest extends TestCase {
private Calculator cl;
public CalculatorTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
System.out.println("set up");
cl = new Calculator();
}
@Override
protected void tearDown() throws Exception {
System.out.println("tear down");
}
public void testAdd() {
int result = cl.add(1, 2);
Assert.assertEquals(3, result);
}
public void testSubtract() {
int result = cl.subtract(1, 2);
Assert.assertEquals(-1, result);
}
public void testMultiply() {
int result = cl.multiply(3, 2);
Assert.assertEquals(6, result);
}
public void testDivide() {
int result = 0;
try {
result = cl.divide(6, 2);
} catch (Exception e) {
e.printStackTrace();
Assert.fail();
}
Assert.assertEquals(3, result);
}
public void testDivideDivideByZero() {
Throwable tx = null;
try {
cl.divide(6, 0);
Assert.fail("测试失败");
} catch (Exception e) {
tx = e;
}
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("除数不能为0", tx.getMessage());
}
}
package test;
import junit.extensions.RepeatedTest;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
批量执行测试案例,使用测试套件TestSuite
package test;
import junit.extensions.RepeatedTest;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class TestAll extends TestCase{
public static Test suite() {
//新建一个测试套件
TestSuite suite = new TestSuite();
//装载CalculatorTest类,将执行CalculatorTest类中的所有测试案例
suite.addTestSuite(CalculatorTest.class);
suite.addTestSuite(LargestTest.class);
suite.addTestSuite(DeleteAllTest.class);
//表示将CaculatorTest类中的testSubtract执行20次
suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"), 20));
return suite;
}
}