求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
说说JUnit4下的单元测试用例的使用
 

2010-10-19 来源:网络

 

在我们平常的项目开发中,测试是显得越来越重要了!我们很多的时候,就是测试与开发同步,测试代码和工作代码应同步编译和更新!下面,阿堂就跟朋友们一起来学习吧!

从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) 测试结果效果图



LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   


性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术


某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...