在我们平常的项目开发中,测试是显得越来越重要了!我们很多的时候,就是测试与开发同步,测试代码和工作代码应同步编译和更新!下面,阿堂就跟朋友们一起来学习吧!
从JUnit4.X开始,JUnit不再要求测试用例继承TestCase基类,不再要求测试方法以test开头。为了让JUnit发现系统的测试用例和测试方法,JUnit提供了Annotation修饰.
@Test:所有希望被运行的测试方法都应该使用该Annotation
@Before:如果希望每次运行测试方法之前先运行指定的回收资源的方法,则该回收资源的方法使用@Before
Annotation修饰.
@After:如果希望每次运行测试方法之后运行指定的回收资源的方法,则该回收资源的方法使用@After
Annotation修饰.
@Ignore:如果希望Junit忽略某个被测试的方法,可以使用@Ignore Annotaion来修饰.
有过JUnit3.x编程经验的测试人员可能知道,测试用例中可以包含setUp(),tearDown()2个方法。@Before类似于JUnit3.x中的setUp()方法,@After修饰的方法类似于tearDown()方法.
JUnit4对于测试用例的要求比JUnit3.x宽松得多,例如,不再要求测试用例必须继承TestCase,不再要求测试方法必须以test开头,等等。但我们最好依然遵守如下规则
(1)测试用例类使用public修饰
(2)测试用例的测试方法使用public修饰
(3)测试用例的测试方法的返回值应该是void
(4)测试用例中测试方法不应该有任何参数
Assert类提供了大量的断言方法,包括基本断言,数字断言,字符断言,布尔断言,对象断言。其中assertEquals(Object
expected,Object actual)内部使用equals()方法,用于判断两个对象的值是否相等.assertSame(Object
expected,Object actual)内部采用"=="判断,用于判断两个对象是否来自于同一个引用。
第一种情况运行单个测试用例
(1)被测试的类
package junittest;
public class MyMath
{
public double oneEquation(double a,double b)
{
//如果a=0,则防范无法求解
if(a==0)
{
System.out.println("参数错误");
throw new ArithmeticException("参数错误");
}
else
{
System.out.println("一元一次方程有解");
return -b/a;
}
}
public double[] twoEquation(double a,double b,double
c)
{
double[] result;
if(a==0)
{
System.out.println("****************************");
throw new ArithmeticException("参数错误");
}
//有理数范围内无根
else if(b*b-4*a*c<0)
{
System.out.println("****************************");
throw new ArithmeticException("方程在理数范围内无解");
}
//方程有唯一的解
else if(b*b-4*a*c==0)
{
System.out.println("****************************");
System.out.println("方程存在唯一的解");
result=new double[1];
result[0]=-b/(2*a);
return result;
}
//方程有两个根
else
{
System.out.println("****************************");
System.out.println("方程存在两个解");
result=new double[2];
//使用数组返回方程的两个根
result[0]=(-b+Math.sqrt(b*b-4*a*c))/2/a;
result[1]=(-b-Math.sqrt(b*b-4*a*c))/2/a;
return result;
}
}
} |
(2)测试
package junittest;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
public class MyMathTest
{
//将需要测试的类,声明成成员变量
MyMath math;
//每次运行测试方法之前都会运行该方法
@Before
public void setUp()
{ math=new MyMath();
}
//每次运行测试用例之后都会运行该方法
@After
public void tearDown()
{ math=null;
}
//测试一元一次方程的求解
//expected=ArithmeticException.class
//相当于断言该测试方法将会抛出ArithmeticException异常
@Test(expected=ArithmeticException.class)
public void testOneEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元一次方程求解");
//断言该方程求解应该为-1.8
assertEquals(math.oneEquation(5,9),-1.8,.00001);
//断言当a==0时的情况
assertEquals(math.oneEquation(0,3),-1);
}
//测试一元二次方程的求解
@Test
public void testTwoEquation()
{
System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元二次方程求解");
double[] tmp=math.twoEquation(1,-3,2);
//断言方程的两个解,一个为2,一个为3
assertEquals("第一个解出错",tmp[0],2,.00001);
assertEquals("第二个解出错",tmp[1],3,.00001);
}
//程序的入口,直接运行该测试用例
public static void main(String[] args)
{
//运行单个的测试用例
JUnitCore.main("junittest.MyMathTest");
}
} |
(3)测试效果图
第二种情况运行多个测试用例
package junittest;
public class MyMath
{
public double oneEquation(double a,double b)
{
//如果a=0,则防范无法求解
if(a==0)
{
System.out.println("参数错误");
throw new ArithmeticException("参数错误");
}
else
{
System.out.println("一元一次方程有解");
return -b/a;
}
}
public double[] twoEquation(double a,double b,double
c)
{
double[] result;
if(a==0)
{
System.out.println("****************************");
throw new ArithmeticException("参数错误");
}
//有理数范围内无根
else if(b*b-4*a*c<0)
{
System.out.println("****************************");
throw new ArithmeticException("方程在理数范围内无解");
}
//方程有唯一的解
else if(b*b-4*a*c==0)
{
System.out.println("****************************");
System.out.println("方程存在唯一的解");
result=new double[1];
result[0]=-b/(2*a);
return result;
}
//方程有两个根
else
{
System.out.println("****************************");
System.out.println("方程存在两个解");
result=new double[2];
//使用数组返回方程的两个根
result[0]=(-b+Math.sqrt(b*b-4*a*c))/2/a;
result[1]=(-b-Math.sqrt(b*b-4*a*c))/2/a;
return result;
}
}
}
package junittest;
public class HelloWorld {
//方法简单的返回字符串
public String sayHello()
{
System.out.println("HelloWorld");
return "Hello world";
}
//计算两个整数的和
public int add(int a,int b)
{
System.out.println("a+b="+(a+b));
return a+b;
}
} |
(2)测试用例类
package junittest;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.JUnitCore;
public class MyMathTest
{
//将需要测试的类,声明成成员变量
MyMath math;
//每次运行测试方法之前都会运行该方法
@Before
public void setUp()
{ math=new MyMath();
}
//每次运行测试用例之后都会运行该方法
@After
public void tearDown()
{ math=null;
}
//测试一元一次方程的求解
//expected=ArithmeticException.class
//相当于断言该测试方法将会抛出ArithmeticException异常
@Test(expected=ArithmeticException.class)
public void testOneEquation()
{ System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元一次方程求解");
//断言该方程求解应该为-1.8 assertEquals(math.oneEquation(5,9),-1.8,.00001);
//断言当a==0时的情况 assertEquals(math.oneEquation(0,3),-1);
}
//测试一元二次方程的求解
@Test
public void testTwoEquation()
{ System.out.println("=================================");
System.out.println("=================================");
System.out.println("测试一元二次方程求解");
double[] tmp=math.twoEquation(1,-3,2);
//断言方程的两个解,一个为2,一个为3 assertEquals("第一个解出错",tmp[0],2,.00001);
assertEquals("第二个解出错",tmp[1],3,.00001);
}
}
package junittest;
import static org.junit.Assert.*;
import org.junit.Test;
public class HelloWorldTest {
@Test
public void testSayHello()
{ System.out.println("");
HelloWorld hello=new HelloWorld();
assertEquals("sayHello方法出错",hello.sayHello(),"Hello
world");
}
@Test
public void testAdd()
{ HelloWorld hello=new HelloWorld();
assertEquals(hello.add(1, 2),3);
}
} |
(3) 测试类
package junittest;
import org.junit.runner.JUnitCore;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
junittest.MyMathTest.class,
junittest.HelloWorldTest.class
})
public class AllTests {
public static void main(String[] args)
{ JUnitCore.main("junittest.AllTests");
}
} |
阿堂特别说明
如下代码
@RunWith(Suite.class)
@Suite.SuiteClasses({
junittest.MyMathTest.class,
junittest.HelloWorldTest.class
}) |
就是我们可以不断添加新的测试用例的地方了。。多个用例之间用,号分隔就可以了
(4) 测试结果效果图
|