一.实习题目
实验三Junit单元测试
二.实习过程
实习题1
下面是使用位组来跟踪一年中的那些天是节假日的程序。
首先,假期相应代码如下:
importjava.util.*;
publicclassHolidaySked{
BitSetsked;
publicstaticvoidmain(String[]arguments){
HolidaySkedcal=newHolidaySked();
if(arguments.length>0){
try{
intwhichDay=Integer.parseInt(arguments[0]);
if(cal.isHoliday(whichDay)){
System.out.println(whichDay+"isaholiday.");}
else
{System.out.println(whichDay+"isnotaholiday.");}
}catch(NumberFormatExceptionnfe){
System.out.println("Error:"+nfe.getMessage());}
}
}
publicvoidaddHoliday(intdaytoAdd){
sked.set(daytoAdd);
}
publicbooleanisHoliday(intdayToCheck){
booleanresult=sked.get(dayToCheck);
returnresult;
}
publicHolidaySked(){
sked=newBitSet(365);
int[]holiday={1,20,43,48,53,115,131,146,165,166,185,244,286,315,327,359};
for(inti=0;i<holiday.length;i++){
addHoliday(holiday[i]);
}
}
(1)请用TestCase方法对程序中的isHoliday()方法进行Junit测试;
相应的代码HolidaySkedTest.java为:
packageone;
importstaticorg.junit.Assert.*;
importorg.junit.Test;
publicclassHolidaySkedTest{
@Test
publicvoidtestisHoliday(){
HolidaySkedholiday=newHolidaySked();
assertTrue(holiday.isHoliday(100));
}
}
(2)用参数化的方法重新设计测试用例。
相应的代码HolidaySkedTestParameter.java为:
packageone;
importstaticorg.junit.Assert.*;
importjava.util.Arrays;
importjava.util.Collection;
importorg.junit.runner.*;
importorg.junit.Test;
importorg.junit.runners.Parameterized;
importorg.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
publicclassHolidaySkedTestParameter{
privateintD;
privatebooleanresult;
@Parameters
publicstaticCollectiondata(){
Object[][]object={{1,true},{20,true},{43,false},{100,true}};
returnArrays.asList(object);
}
publicHolidaySkedTestParameter(intD,booleanresult){
this.D=D;
this.result=result;
}
@Test
publicvoidtestholiday(){
HolidaySkedholiday=newHolidaySked();
assertEquals(result,holiday.isHoliday(D));
}
}
(3)再用Suite方法对上述两种测试用例进行套件测试。
相应的代码为:
packageone;
importorg.junit.runner.RunWith;
importorg.junit.runner.*;
importorg.junit.runners.Suite;
importorg.junit.runners.Suite.SuiteClasses;
@RunWith(value=org.junit.runners.Suite.class)
@SuiteClasses(value={HolidaySkedTestParameter.class,HolidaySkedTest.class})
publicclassHolidaySkedTestsuite{
}
实习题2
对变量J的计算进行自动化测试。测试用例的设计要分别满足语句覆盖、判定-条件覆盖、条件组合、路径覆盖及基本路径测试等不同的测试标准,并利用Eclemma对其进行覆盖率分析
程序代码
packagetwo;
publicclassDowork{
/**
*@paramargs
*/
publicintWork(intx,inty,intz)
{
intk=0,j=0;
if((x>3)&&(z<10))
{
k=x*y-1;//语句块1
j=(int)Math.sqrt(k);
}
if((x==4)||(y>5))
{
j=x*y+10;//语句块2
}
j=j%3;
returnj;//语句块3
}
}
语句覆盖
测试代码
DoworkTest1.java
packagetwo;
importstaticorg.junit.Assert.*;
importorg.junit.Test;
publicclassDoworkTest1{
@Test
publicvoidtestWork(){
Doworkwork=newDowork();
assertEquals(0,work.Work(5,10,9));
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
判定-条件覆盖
测试代码:
DoworkTest2.java
packagetwo;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclassDoworkTest2{
privateDoworkwork1;
privateDoworkwork2;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
work1=newDowork();
work2=newDowork();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestWork(){
assertEquals(work1.Work(4,6,5),1);
assertEquals(work2.Work(2,5,11),0);
}
}
源程序覆盖情况如图所示:
}
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
条件组合
测试代码:
DoworkTest3.java
packagetwo;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclassDoworkTest3{
privateDoworkwork1;
privateDoworkwork2;
privateDoworkwork3;
privateDoworkwork4;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
work1=newDowork();
work2=newDowork();
work3=newDowork();
work4=newDowork();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestWork(){
assertEquals(work1.Work(4,6,5),1);
assertEquals(work2.Work(4,5,15),0);
assertEquals(work3.Work(2,6,5),1);
assertEquals(work4.Work(2,5,15),0);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
路径覆盖
测试代码:
DoworkTest4.java
packagetwo;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclassDoworkTest4{
privateDoworkwork1;
privateDoworkwork2;
privateDoworkwork3;
privateDoworkwork4;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
work1=newDowork();
work2=newDowork();
work3=newDowork();
work4=newDowork();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestWork(){
assertEquals(work1.Work(4,6,5),1);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
基本路径测试
首先是先分析程序流图,然后分析程序圈复杂度,从而确定出独立路径的条数应该为5,并写出相应的测试用例;
测试代码:
DoworkTest5.java
packagetwo;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclassDoworkTest5{
privateDoworkwork1;
privateDoworkwork2;
privateDoworkwork3;
privateDoworkwork4;
privateDoworkwork5;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
work1=newDowork();
work2=newDowork();
work3=newDowork();
work4=newDowork();
work5=newDowork();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestWork(){
assertEquals(work1.Work(4,6,5),1);
assertEquals(work2.Work(5,6,5),1);
assertEquals(work3.Work(5,5,5),1);
assertEquals(work4.Work(4,5,15),0);
assertEquals(work5.Work(2,6,15),1);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
实习题3
综合练习:结合自己的Java编程经历,选择一个你自己曾经做过的java程序,尽可能多的运用所学过的Junit单元测试和Eclemma覆盖率测试方法帮助你进行代码的测试,并形成详细的报告。
示例代码
Sum.java
packagethree;
publicclasssum{
privateintsum;
publicsum(){
this.sum=0;
}
publicintadd(inta,intb){
if(a>0||b<0){
sum+=a;
}
if(a<20&&b>5){
sum-=b;
}
if(sum>0&∑<10)
returnsum;
else
return0;
}
}
语句覆盖
packagethree;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importtwo.Dowork;
publicclasssumTest1{
privatesumsum1;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
sum1=newsum();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestadd(){
assertEquals(sum1.add(17,6),0);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
分支覆盖
packagethree;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
publicclasssumTest2{
privatesumsum1;
privatesumsum2;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
sum1=newsum();
sum2=newsum();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestadd(){
assertEquals(sum1.add(-1,0),0);
assertEquals(sum1.add(9,6),3);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
Coverage视图如图所示:
HTML报告如图所示:
判定条件—覆盖
packagethree;
importstaticorg.junit.Assert.*;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importtwo.Dowork;
publicclasssumTest3{
privatesumsum1;
privatesumsum2;
@Before
publicvoidsetUp()throwsException{//初始化公用对象
sum1=newsum();
sum2=newsum();
}
@After
publicvoidtearDown()throwsException{
}
@Test
publicvoidtestadd(){
assertEquals(sum1.add(6,-1),6);
assertEquals(sum2.add(5,6),0);
}
}
源程序覆盖情况如图所示:
测试程序覆盖情况如图所示:
HTML报告如图所示:
合并测试
合并多次测试覆盖率