Junit3.8
一、在MyEclipse提供了对Junit的支持(无需引用第三方库):
单击项目右键-->properties-->Java Build Path-->Libraries-->Add Library-->Junit-->next-->
选择版本:Junit3/Junit4-->Finish-->OK
二、使用Junit的最佳实践:
1、新建一个名为test的Source Folder,用于存放测试类源代码。
项目右键-->New-->Source Folder-->Folder Name:test-->finish.
在测试目录下创建与源目录下同样的目录。
2.目标类与测试类应该位于同一个包下面,这样测试类中就不必导入源代码所在的包,因为他们位于同一个包下面。
3.测试类的命名规则:假如目标类是Calculator,那么测试类应该命名为CalculatorTest或TestCalculator。
选中需要添加测试的类-->New Java class(图标)-->Junit Test Case-->.....
三、Junit介绍
1.Junit的口号:keep the bar green to keep the code clean.
2.Junit:单元测试不是为了证明你是对的,而是为了证明你没有错误。
3.测试用例(Test Case)是单元测试的一个重要方面。
4.单元测试主要是用来判断程序的执行结果与自己期望的结果是否一至
5.测试类必须继承于TestCase类
6.测试之前是什么状态,测试执行完毕后就应该是什么状态,而不应该由于测试的原因导致状态发生了变化。
7.Test Case之间一定要保持完全的独立性,不允许出现任何依赖关系
8.DRY(Don't Repeat Yourself)
四、在Junit3.8中,测试方法需要满足如下原则
1.public的
2.void的
3.无方法参数
4.方法名称必须以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;
}
// Junit以单独方式运行(实际上是Junit提供的一些启动方式)。
public static void main(String[] args){
// 以命令行的方式运行。
// junit.textui.TestRunner.run(CalculatorTest.class);
// 以图形界面方式运行。
// junit.awtui.TestRunner.run(CalculatorTest.class);
}
}
public class CalculatorTest extends TestCase{
private Calculator cal;
//在每个测试用例执行之前先执行setup()
@Override
public void setUp() throws Exception {
cal=new Calculator();
}
// 在每个测试用例执行之后执行tearDown()
@Override
protected void tearDown() throws Exception {
}
public void testAdd(){
int result=cal.add(1, 2);
Assert.assertEquals(3, result);//第一个参数为你期望的结果,第二个参数为实际参数
}
public void testSubtract(){
int result=cal.subtract(1, 2);
Assert.assertEquals(-1, result);
}
public void testMultiply(){
int result=cal.multiply(3, 2);
Assert.assertEquals(6, result);
}
public void testDivide(){
int result=0;
try {
result = cal.divide(6, 2);
} catch (Exception e) {
e.printStackTrace();
Assert.fail("测试失败");//放在程序原不可能会进入的地方
}
Assert.assertEquals(3, result);
}
public void testDivideDivideByZero(){
Throwable tx=null;//Throwable为Exception的父类
try {
cal.divide(6, 0);
Assert.fail("测试失败");
} catch (Exception e) {
tx=e;
}
// 比较期望抛出异常类型与实际抛出异常类型是否一样
Assert.assertEquals(Exception.class, tx.getClass());
// 比较期望抛出异常信息与实际抛出异常信息是否一样
Assert.assertEquals("除数不能为0", tx.getMessage());
}
}
五、测试类的私有方法时可以采取两种方式:
1.修改方法的访问修饰符,将private修改为default或public(不推荐)。
2.使用反射在测试类中调用目标类的私有方法(推荐)。
public class Calculator2 {
private int add(int a,int b){
return a+b;
}
}
public class Calculator2Test extends TestCase {
public void testAdd(){
try {
Calculator2 cal2=new Calculator2();
Class<Calculator2> clazz=Calculator2.class;
Method method=clazz.getDeclaredMethod("add",
new Class[]{Integer.TYPE,Integer.TYPE});
method.setAccessible(true);
Object result=method.invoke(cal2, new Object[]{2,3});
Assert.assertEquals(5, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、TestSuite(测试套件)
可以将多个测试组合到一起,同时执行多个测试。
创建一个Java类继承TestCase
public class TestAll extends TestCase {
public static Test suite(){
TestSuite suite=new TestSuite();
suite.addTestSuite(CalculatorTest.class);
suite.addTestSuite(LargestTest.class);
suite.addTestSuite(DeleteAllTest.class);
suite.addTestSuite(Calculator2Test.class);
suite.addTestSuite(MyStackTest.class);
return suite;
}
}
七、JUnit中要区分错误(error)与失败(failure)
1)错误指的是代码中抛出了异常等影响代码正常执行的情况,比如抛出了ArrayIndexOutOfBoundsException,这就叫错误,
2)失败指的是我们断言所期待的结果与程序实际执行的结果不一致,或者是直接调用了fail()方法,这叫失败。