之前学习过junit3.8,今天学习一下junit4.x,在Android平台上也有相关的单元测试,可以说junit已经是单元测试的标准,现在将单元测试用在编程中确实没给我提高多大的效率,但是相信当真正熟练应用junit单元测试,并理解Junit里面单元测试的原理和其中的设计模式,必将给今后的编程带来很大的提高。
下面是要进行测试的类:
public class Calculator { public int add(int oper1,int oper2){ return oper1+oper2; } public int substract(int oper1,int oper2){ return oper1-oper2; } public int multiply(int oper1,int oper2){ return oper1*oper2; } public int divide(int oper1,int oper2){ if (0==oper2) { throw new ArithmeticException("除数不能为零"); } return oper1/oper2; } }
当使用junit3.8进行单元测试的测试类:
public class CalculatorTest extends TestCase{ private Calculator calculator; /** * 每次调用测试方法之前进行初始化 */ @Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); calculator=new Calculator(); System.out.println("SetUp"); } /** * 每次调用完测试方法后进行资源的回收 */ @Override protected void tearDown() throws Exception { // TODO Auto-generated method stub super.tearDown(); calculator=null; System.out.println("TearDown"); } public void testAdd(){ int expected=5; int result=calculator.add(2, 3); Assert.assertEquals(expected, result); } public void testDivide(){ int expected=2; int result=calculator.divide(4, 2); Assert.assertEquals(expected, result); } public void testDivide2(){ Throwable tx=null; try { calculator.divide(3, 0); Assert.fail();//程序执行到这行代码的时候一定失败,后面的代码都不会执行 } catch (Exception e) { tx=e; //Assert.fail();//如果程序发生错误,让他立即停止执行 } Assert.assertNotNull(tx); Assert.assertEquals(ArithmeticException.class, tx.getClass()); Assert.assertEquals("除数不能为零", tx.getMessage()); } }
运行结果:
SetUp
TearDown
SetUp
TearDown
SetUp
TearDown
当使用junit4.x进行单元测试的测试类:
public class CalculatorTest{ private Calculator calculator; @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("BeforeClass"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("AfterClass"); } /** * 每次调用测试方法之前进行初始化 */ @Before public void setUp() throws Exception { // TODO Auto-generated method stub calculator=new Calculator(); System.out.println("SetUp"); } /** * 每次调用完测试方法后进行资源的回收 */ @After public void tearDown() throws Exception { // TODO Auto-generated method stub calculator=null; System.out.println("TearDown"); } @Test public void testAdd(){ int expected=5; int result=calculator.add(2, 3); Assert.assertEquals(expected, result); } @Test public void testDivide(){ int expected=2; int result=calculator.divide(4, 2); Assert.assertEquals(expected, result); } @Test public void testDivide2(){ Throwable tx=null; try { calculator.divide(3, 0); Assert.fail();//程序执行到这行代码的时候一定失败,后面的代码都不会执行 } catch (Exception e) { tx=e; //Assert.fail();//如果程序发生错误,让他立即停止执行 } Assert.assertNotNull(tx); Assert.assertEquals(ArithmeticException.class, tx.getClass()); Assert.assertEquals("除数不能为零", tx.getMessage()); Calculator calculator=new Calculator(); } }
运行结果:
BeforeClass
SetUp
TearDown
SetUp
TearDown
SetUp
TearDown
AfterClass
从测试类和运行结果就能大致看出他们的不同:junit3.8的测试类是继承自TestCase,测试方法前都要加test,这是因为junit3.8采用了java里面的反射来找相应的类里的方法,他的setUp()和tearDown()方法每执行一个测试方法就执行一次。而junit4.x没有继承TestCase,而是采用Java5中新加入的静态导入的方式导入的方式import static org.junit.Assert.*;,他的测试方法前面不需要加上test,这是因为junit4采用的是java5里面的注解Annotation即使我们的测试方法写成下面的形式也是可以的:
@Test public void dfdtsdDivide(){ int expected=2; int result=calculator.divide(4, 2); Assert.assertEquals(expected, result); }
还有就是增加了下面的两个方法:
@BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("BeforeClass"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("AfterClass"); }
这个正想他们的名字写的那样只在类开始和结束的时候调用,仔细观察就会发现这是一个静态的方法,也就说明了为什么只被调用一次。