Junit单元测试与Eclemma的使用之覆盖率分析

一.实习题目

实验三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报告如图所示:

合并测试

合并多次测试覆盖率



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值