Java从零开始学四十六(Junit)
一、软件测试
软件开发:
项目调研--需求分析--软件设计--程序编码--软件测试--运行维护
软件测试:利用测试工具按照测试方案和流程对产品进行功能和性能测试,使用人工或者自动手段来运行或测试某个系统的过程。目的在于检验是否满足规定的需求,确认预期结果与实际结果之间的差别。
墨盒测试-白盒测试-回归测试-单元测试
二、JUnit-单元测试工具
三、测试Junit测试类
创建被测试类
package com.pb.junit; /** *1.创建被测试类 *2.Junit 3.0或者4.0 这里有3.0 *3.创建测试类 *简单实现加,减,乖,除的计算器 */ public class Calculator { //运算结果 private static int result; //加法 public void add(int n){ result+=n; } //减法 public void minus(int n){ result-=n; } //乖法 public void mult(int n){ //result*=n; } //除法 public void div(int n){ if(n==0){ System.out.println("除数不能为0!"); }else{ result/=n; } } //开方 :死循环 public void sqr(){ for(;;){ } } //平方 public void square(int n){ result=n*n; } //清零运算结果 public void clear(){ result=0; } public int getResult() { return result; } public void setResult(int result) { Calculator.result = result; } }
使用JUnit3测试
package com.pb.junit; import junit.framework.Assert; import junit.framework.TestCase; public class CalculatorTest extends TestCase { //创建测试类对象 Calculator calculator=new Calculator(); //测试启动前运行的方法 protected void setUp() throws Exception { super.setUp(); calculator.clear(); System.out.println("测试前"); } //测试结束后运行的方法 protected void tearDown() throws Exception { super.tearDown(); System.out.println("测试后"); } //JUnit3中测试方法必须以test开头 public void testAdd() { calculator.add(2); calculator.add(3); //2+3结果为5 int result=calculator.getResult(); Assert.assertEquals(5, result); } public void testMinus() { calculator.minus(1); calculator.minus(5);//期望结果为-6 int result=calculator.getResult(); Assert.assertEquals(-6, result); } public void testMult() { calculator.mult(3); calculator.mult(4); int result=calculator.getResult(); Assert.assertEquals(12, result); } public void testDiv() { calculator.div(8); calculator.div(0); int result=calculator.getResult(); Assert.assertEquals(4 ,result); } }
使用JUnit4
package com.pb.junit; import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class CalculatorTest { Calculator calculator=new Calculator(); @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("============所有测试之前执行一次"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("所有测试之后执行一次=========="); } @Before public void setUp() throws Exception { System.out.println("==========每个测试之前执行一次"); calculator.clear(); } @After public void tearDown() throws Exception { System.out.println("每个测试之后执行一次============="); } //@Test 是必须的,测试方法可以不用以test开头,必须为public ,没有返回必须为void @Test public void testAdd() { calculator.add(3); calculator.add(2); int result = calculator.getResult(); assertEquals(5, result); } //忽略这个测试方法 @Ignore @Test public void testMinus() { fail("Not yet implemented"); } @Test public void testMult() { fail("Not yet implemented"); } //抛出预定义的异常 @Test(expected=ArithmeticException.class) public void testDiv() throws ArithmeticException { calculator.add(8); calculator.div(0); int result=calculator.getResult(); assertEquals(0, result); } @Test(timeout=5000) //超过5秒,算测试失败 public void testSqr() { calculator.sqr(); fail("Not yet implemented"); } @Test public void testSquare() { fail("Not yet implemented"); } }
测试套件
package com.pb.junit; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ //测试用例类的名称 Calculator1Test.class, Calculator2Test.class, CalculatorTest.class }) public class TotalTest { }