java单元测试框架设计与使用_第1页
java单元测试框架设计与使用_第2页
java单元测试框架设计与使用_第3页
java单元测试框架设计与使用_第4页
java单元测试框架设计与使用_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录目录 1一、 环境准备 21.1 TestNG+cobertura在Eclipse中的集成 21.2TestNG+cobertura在Eclipse+maven中的集成 2二、 开发工具环境集成 22.1Eclipse开发环境 22.2Eclipse开发环境+maven项目管理 3三、 项目结构搭建与测试代码编写 43.1建立项目目录与文件结构 43.2 测试代码编写 43.3引用测试断言 53.4 常见测试功能说明 5四、 测试执行与输出 74.1在Eclipse中开发项目 74.2使用maven在Eclipse中构建项目 9五、 测试实例演示 105.1基于Eclipse的测试实例演示 105.2基于Eclipse+maven的测试实例演示 14六、 单元测试问题与解决 186.1项目测试管理 186.2测试代码编写 20环境准备针对我公司各事业部JAVA开发环境与项目管理工具使用的情况,采用以下两种方式进行单元测试开发:TestNG+cobertura在Eclipse中的集成在压缩包中提供开发所需开发包:压缩包的readExcel.jar实现从excel中读取简单类型测试用例的功能。Eclipse单独开发:工具在”java单元测试工具包--EcLipse单独开发”文件夹下,包括:lib.rar与cobertura.rar。进行测试时需将这两个文件解压到项目目录下的testsrc目录下。其中,lib.rar为jar包文件夹,包括与result_eclipse.jar。1、为TestNG断言定制包,在的断言类中加入map、collection数据类型的断言,并改进了原有对数组断言的缺陷。2、result_eclipse.jar为Eclipse单独开发项目情况下的报告集成工具.cobertura.rar为覆盖度统计工具包。将TestNG-6.8.1jar测试开发包加载Eclipse环境中,并下载TestNG的Eclipse插件。解压.rar到项目的根目录下,下载cobertura在Eclipse中的插件eCobertura.将result_eclipse.jar放入项目的lib文件夹中,若项目中无lib文件夹,需创建lib文件夹。1.2TestNG+cobertura在Eclipse+maven中的集成在maven中集成了TestNG与cobertura的插件,仅需在pom.xml文件对实现对TestNG与cobertura进行依赖,maven会在编译过程中自行下载,pom.xml的具体见第五部分Eclipse+Maven的实例演示。将”java单元测试工具包--EcLipse+maven开发”文件夹下的lib.rar与bat文件复制到项目目录下的src/test目录下,并将lib.rar解压到当前目录下,lib.rar为jar包文件夹,包括与result_maven.jar。1、为TestNG断言定制包,在的断言类中加入map、collection数据类型的断言,并改进了原有对数组断言的缺陷。2、result_eclipse.jar为Eclipse单独开发项目情况下的报告集成工具.开发工具环境集成2.1Eclipse开发环境加载TestNG框架包文件在对原有的开发包进行改进后定制了。将改jar包加载到开发环境中,具体步骤:在对应的项目点击右键,选择属性,弹出属性设置对话框:TestNG与cobertura的Eclipse插件下载安装在help->Eclipsemaketplace中进行插件在线下载安装,分别搜索TestNG与cobertura,进行下载2.2Eclipse开发环境+maven项目管理Maven集成TestNG与cobertura工具使用maven对开发项目进行构建,在pom.xml文件中加入对testNG与cobertura<dependency>对Testng的依赖 <groupId>org.testng</对Testng的依赖 <artifactId>testng</artifactId> <version></version> <scope>test</scope> </dependency><plugin><groupId></groupId><artifactId>cobertura-maven-plugin</artifactId></plugin>//cobertura依赖项目结构搭建与测试代码编写基于以上环境的集成与配置,已经可以进行对待测代码进行测试构建与代码编写。3.1建立项目目录与文件结构为了实现测试代码与被测代码相隔离,为测试代码单独建立文件夹(用maven构建自动创建测试文件夹),在scr/test/java进行测试代码编写,若没有用maven构建项目,需在项目中创建src与testsrc目录分别存放待测程序与测试程序。在项目根目录的testsrc(Eclipse单独开发)或src/test(Eclipse+maven构建)目录下创建Testng.xml文件在testng.xml文件对可以对测试属性进行配置,可以选择需要测试包、类、方法等,也可进行参数化测试。<?xmlversion="1.0"encoding="UTF-8"?><suitename="Suite1"verbose="1"> <testname="Regression1"> <packages>//加入需要执行的测试包 <packagename="hyhTest"/> <packagename="otherTest"/> </packages> </test></suite>测试代码编写Eclipse+maven构建:在src/test/java目录下建立测试类包,注意用maven构建项目时,测试包名需要是*Test形式。Eclipse开发:在testsrc目录下建立测试类包,为了对测试管理方便,测试包名需要是*Test形式。用@Test标注测试方法,可以根据需要加入相应的测试属性。如下@Test(groups={"param"},……,……)publicvoidtestCalculateAppriasal(){}还有以下几种标注形式:@DataProvider、@Parameters参数化测试@ExpectedExceptions进行异常检测@Factory

标记工厂方法@Test常用属性alwaysRun

标志依赖测试失败后,测试方法是否执行dependsOnGroups

这个方法依赖的组列表dependsOnMethods

这个方法依赖的方法列表enabled

这个类的方法是否激活groups

这个类或方法所属的分组列表3.3引用测试断言AssertEquals(Object,Object,message)/AssertEquals(Object,Object)其中,Object可以为基础数据类型:int,double,char等,也可为vector,list,map,set等复杂数据类型。Message为报告中打印的相关提示信息。AssertEquals(Object[],Object[],message)/AssertEquals(Object,Object)assertFalse(booleancondition,Stringmessage)/assertFalse(booleancondition)判断状态错误AssertNotEquals(Object,Object,message)/AssertEquals(Object,Object)其中,Object可以为基础数据类型:int,double,char等,也可为vector,list,map,set等复杂数据类型。Message为报告中打印的相关提示信息。assertNotNull(Object)判断参数是否为NULLassertNotSame(Object,Object,String)/assertNotSame(Object,Object,String)若两个Object相等,抛出异常。assertSame(Object,Object,String)/assertNotSame(Object,Object,String)若两个Object不相等,抛出异常。assertTrue(Boolean)状态为假时,抛出异常。assertEqualsNoOrder((Object[],Object[])/assertEqualsNoOrder((Object[],Object[],message)若两个数组中有元素不同,抛出异常。不用对应元素进行比较单元测试开发中对Collection、map等数据类型断言进行了扩充与改进。常见测试功能说明参数化测试:@DataProvider与@Parameters@Parameters结合TestNG.xml文件可对带参数的测试方法进行参数化测试,仅对参数为基本数据类型有效(如int,String等),具体编写如下:TestNG.xml文件设置参数:在需使用参数的测试方法前加入如下标注:@Parameters({"data1","data2"})///有多少参数就要加入多少个参数名@DataProvider可进行高级参数化测试,及对复杂数据类型进行测试(如collection、map等类集或自定义类),具体实现举例如下说明:@DataProvider标注的参数提供方法返回的数据可以从Excel表格中读取简单数据类型,这样便于数据的管理。压缩包的readExcel.jar可实现Excel数据的读取(仅为简单的数据类型读取:int、String),具体实现如下从Excel中读取简单数据类型的测试参数 @DataProvider() publicstaticObject[][]employ()throwsIOException { Filefile=newFile("./testsrc/params_excel/11.xlsx"); int[][]arrayStr=ReadExcel.getRunDataInt(file); returnReadEToObject(arrayStr); }}异常检测两种编写形式均可:方式一:@Test(expectedExceptions=)///完成异常处理测试方式二:@ExpectedExceptions(NumberFormatException.class)//在进行异常测试方法前加入此标注@Test工厂测试:@Factory动态创建测试案例。被@Factory标注的方法返回测试用例数组(Object[]),举例如下public

class

WebTestFactory

{

@Factory//标注方法为工厂测试

public

Object[]

createInstances()

{

Object[]

result

=

new

Object[10];

for

(int

i

=

0;

i

<

10;

i++)

{

result[i]

=

new

WebTest(i

*

10);

return

result;

}

}测试类如下public

class

WebTest

{

private

int

m_numberOfTimes;

public

WebTest(int

numberOfTimes)

{

m_numberOfTimes

=

numberOfTimes;

}注意:测试类不需要@Test标注。测试执行与输出4.1在Eclipse中开发项目有两种方式执行测试程序:利用TestNG与cobertura的Eclipse中的插件进行测试选择待测试的项目,点击红框中按钮生成测试报告与覆盖度报告,可在Eclipse中方便查阅:测试报告覆盖度报告在待测代码中以不同颜色区分覆盖到的行利用命令行执行测试将提供压缩包中”java单元测试工具包--EcLipse单独开发”文件夹下cobertura.rar与lib.rar解压到testsrc目录下中,并编写执行命令run.bat:cd..mduninstrumented进入项目根目录,创建临时文件夹mdinstrumentedjavac-cptestsrc\lib\testng-6.8.1.jar-duninstrumentedsrc\aaa\*.javajavac-cptestsrc;-duninstrumentedtestsrc\aaaTest\*.java编译被测代码与测试代码,放于uninstrumented文件夹中calltestsrc\cobertura\cobertura-instrument.bat--destinationinstrumenteduninstrumented\aaa\*.class在被测代码中加入字节码,便于覆盖度统计java-cptestsrc\lib\testng-6.8.1.jar;testsrc\cobertura\cobertura.jar;instrumented;uninstrumented;-=cobertura.sertestsrc/testng.xml根据testng.xml文件执行测试程序,生成测试结果calltestsrc\cobertura\cobertura-report--formathtml--datafilecobertura.ser--destinationreportssrc生成覆盖度统计报告delcobertura.serjava-jartestsrc\lib\result_eclipse.jarrd/s/quninstrumentedrd/s/qinstrumentedrd/s/qreportsrd/s/qtest-output.\testsrc\Result_Report\Test_Result.html报告集成,删除临时文件夹及文件其中result_maven.jar为编写的测试报告与覆盖度报告集成工具。集成测试报告输出形式4.2使用maven在Eclipse中构建项目有两种方式执行测试程序:利用maven的Eclipse中的插件进行测试在项目目录下,选择runas->mavenbuild,弹出如下对话框,输入cobertura:cobertura运行后在相应的文件夹中生成测试报告\target\site\cobertura包括覆盖度分析报告target\surefire-reports测试代码报告利用maven的命令行执行测试注意:第一次执行测试时,需将工具包“java单元测试工具包--EcLipse+maven开发”文件夹下的”加载断言库—执行一次即可.bat”复制到项目目录下的scr/test目录下,并执行一次,完成自定制库在maven中的安装。进行项目根目录,删除原有的测试结果在项目文件夹下的src\test文件夹下解压与result_maven.jar)压缩文件,执行以下的run.bat文件:进行项目根目录,删除原有的测试结果cd..cd..Maven编译、执行、生成报告命令,无需更改rd/s/q.\srcMaven编译、执行、生成报告命令,无需更改callmvncobertura:cleancallmvncobertura:cobertura执行报告集成程序,将result.jar开发包放入lib文件夹下,无需更改java-jar.\src执行报告集成程序,将result.jar开发包放入lib文件夹下,无需更改.\src\test\Result_Report\Test_Result.html运行后在src\test\Result_Report文件夹下生产最终集成的测试报告Test_Result.html如下:测试实例演示通过两个简单实例简单说明基于TestNG的java单元测试流程5.1基于Eclipse的测试实例演示在项目中创建于src并列的测试文件夹testsrc,然后根据需要创建测试包,根据被测代码创建测试类项目的基本目录如下:在项目中加入编写测试代码packageaaaTest;importaaa.Aaa;//被测类的声明importstaticorg.testng.Assert.assertEquals;Testing包方法的声明importTesting包方法的声明import;import;import;import;publicclassAaaTest//测试类{ privatestaticAaacalculator1=newAaa();@Test//测试标注,可带属性 publicvoidtestAdd()//测试方法{ calculator1.add(7);//被测方法调用 calculator1.add(8); assertEquals(14,calculator1.getReuslt());//断言 System.out.println("通过测试");//相关信息打印 }@Test publicvoidtestSub(){ calculator1.substract(9); assertEquals(-9,calculator1.getReuslt()); }@Test(timeOut=2000L)//timeout是Test的属性,完成限时测试 publicvoidtestSquare() { calculator1.square(6); assertEquals(36,calculator1.getReuslt()); } publicvoidPrintResult() { System.out.println("方法Square被忽略,不进行测试"); }@Test(expectedExceptions=java.lang.ArithmeticException.class)///完成异常处理测试 publicvoidtestDivide() { calculator1.divide(0); } @Test(enable=“false”)//////配置Test属性,不进行测试 publicvoidtestmultiply() { calculator1.multiply(4); assertEquals(10,calculator1.getReuslt()); } @BeforeMethod publicvoidsetUp()throwsException { calculator1.clear(); System.out.println("ThisisBefore!!!"); } @AfterMethod publicvoidtearDown()throwsException { System.out.println("ThisisAfter!!!"); } @BeforeClass///完成测试方法前置工作,在测试方法执行前会完成前置工作 publicstaticvoidsetUp1()throwsException { calculator1.clear(); System.out.println("ThisisBeforeClass!!!"); } @AfterClass publicstaticvoidtearDown1()throwsException { System.out.println("ThisisAfterClass!!!"); }}其中被测代码如下:packageaaa;publicclassAaa{ ///////////////成员函数/////////////// /*********************/ /********加法*********/ /*********************/ publicvoidadd(intn){ result+=n; } /*********************/ /********减法*********/ /*********************/ publicvoidsubstract(intn){ result-=n; } /*********************/ /********乘法*********/ /*********************/ publicvoidmultiply(intn){ result*=n; } /*********************/ /********除法******/ /*********************/ publicvoiddivide(intn){ result/=n; } /*********************/ /********平方*********/ /*********************/ publicvoidsquare(intn){ result=n*n; } /*********************/ /********取值*********/ /*********************/ publicintgetReuslt(){ returnresult; } /*********************/ /********清值********/ /*********************/ publicvoidclear(){ result=0; } ////////////成员变量///////// /*********************/ /********结果*********/ /*********************/ privatestaticintresult;}在testsrc目录下创建testing.xml:对测试进行配置<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEsuiteSYSTEM"/testng-1.0.dtd"><suitename="Suite"parallel="none"><testname="Test"><classes>//需要执行的测试类<classname="aaaTest.AaaTest"/></classes></test></suite>两种方式运行:第四部分已经有过介绍,这里就不再累述。命令行生成的报告如下图5.2基于Eclipse+maven的测试实例演示用maven进行构建项目构建在使用Maven进行构建后自动生成测试文件夹与被测程序文件夹,同样的方法创建测试包与测试类在项目的src/test目录下创建testng.xml文件对测试进行配置<?xmlversion="1.0"encoding="UTF-8"?><suitename="Suite1"verbose="1"><testname="Regression1">//测试组<parametername="data1"value="7000"></parameter>///参数化测试<parametername="data2"value="500"></parameter><classes>//选择需要执行的测试类<classname="employTest.TestEmployeeDetails"><methods>//选择需要测试的方法<includename="testCalculateAppriasal"/></methods></class></classes><packages>////这里可以对需要执行的测试包进行选择<packagename="hyhTest"/><packagename="employTest"/><packagename="org.hyh.numberTest"/></packages><classes><classname=""/></classes></test></suite>在pom.xml中加入对TestNG与cobertura的依赖,并配置对testng.xml的操作。<projectxmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd"><modelVersion></modelVersion><groupId>hyh1</groupId><artifactId>hyh1</artifactId><version></version><packaging>jar</packaging><name>hyh1</name><url></url><properties><>UTF-8</></properties><dependencies>在pom.xml中加入对testng的依赖在pom.xml中加入对testng的依赖<groupId>org.testng1</groupId><artifactId>testng1</artifactId><version></version></dependency></dependencies><build>加载cobertura<plugins加载cobertura <plugin> <groupId></groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> <configuration> <useSystemClassLoader>true</useSystemClassLoader> <testFailureIgnore>true</testFailureIgnore>执行TestNG.xml <parallel>false</执行TestNG.xml <forkMode>once</forkMode> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile><!--配置testng.xml文件中的信息-->> </suiteXmlFiles></configuration> </plugin></plugins></build></project>在项目src/test/lib文件夹中加入与result_maven.jar文件特别注意:在用命令行执行测试时,需要先将开发的加载到本地仓库中,并在pom.进行如下配置<dependency><groupId>org.testng1</groupId><artifactId>testng1</artifactId><version></version></dependency>执行如下命令行:(仅需执行一次即可)callmvninstall:install-file-DgroupId=org.testng1-DartifactId=testng1-Dversion=6.8.1-Dpackaging=jar-Dfile执行src/test目录下的run.bat(命令行的编写格式见4.2),生成如下测试报告单元测试问题与解决6.1项目测试管理 为了使项目与测试的条理更加清晰,设计测试管理框图如下: 6.1.1测试目录的管理 为了实现对测试代码与被测代码相隔离,对测试代码与被测代码建立独立目录进行管理。在项目根目录下创建src/test目录,该目录下存放包括:测试源代码、配置文件、需调用的库文件、批处理命令。工程的物理逻辑如下图:Test目录下:6.1.2配置xml文件完成对测试的管理 在测试过程中对tesng.xml文件进行配置即可实现对测试的管理,如制定需执行的测试套件、测试包、测试类、测试方法等,也可实现参数化测试的配置。 具体配置示例见5.2中的介绍。6.1.3测试代码注释编写 在测试代码编写的同时需要对测试功能进行注释,可以使测试代码更加清晰。示例如下:/* *测试类: *测试方法:CalculateYearlySalary();*输入参数:="Rajeev",employee.MonthlySalary=8000,employee.age=25; *期望值:500 */ @Test publicvoidtestCalculateYearlySalary(){ employee.setName("Rajeev"); employee.setAge(25); employee.setMonthlySalary(8000); doublesalary=empBusinessLogic .calculateYearlySalary(employee); Assert.assertEquals(salary,500); }6.2测试代码编写6.2.1Private及protected成员函数测试方法 当java的类有一个方法的访问修饰符为Private或protected时,我们在写测试类时需要将其私有方法抽出,让其可以访问,就可以按要求进行测试了。可以使用Method这个类将我们要测试的方法赋给它,其中它有一个设置,可是方法变成可进入,这样就可达到可测试的目的。示例:packagecalculator;publicclassCalculator{ ///////////////成员函数/////////////// /*********************/ /********加法*********/ /*********************/ privatevoidadd(intn)//私有方法 { +=n; }………………//以下代码省略………………测试代码:packagecalculatorTest;importstaticorg.testng.Assert.assertEquals;import;import;import;import;import;importorg.testng.annotations.ExpectedExceptions;import;importcalculator.Calculator;publicclassCalculatorTest{ privatestaticCalculatorcalculator1=newCalculator();@TestpublicvoidtestAdd(){ ObjectcalculatorObject=null; try {Methodmethod=calculator1.getClass().getDeclaredMethod("add",newClass[]{int.class}); method.setAccessible(true);//设置抽出方法可用calculatorObject=method.invoke(calculator1,newObject[]{3});calculatorObject=method.invoke(calculator1,newObject[]{12});/////模拟方法调用,Object[]{12}为传入参数 } catch(Exceptione) { } assertEquals(15,calculator1.getReuslt());}………………//////以下代码省略注意:导入Method类的时候要为引用类。 6.2.2桩代码编写 由于单元测试是针对代码开发过程中对方法或模块进行测试,但在测试中会遇到被测代码中包含未完成或暂不可实现的函数及代码块。可以使用“桩”代码替代,从而可以针对被测函数的代码逻辑进行提前测试。何时需要编写桩代码从被处理数据来源看,如果某段未完成代码(函数)是从被测程序外部获取数据时,我们可以用桩代码进行代替。从复杂度方面看,如果某段代码(函数)在被测程序层面为顺序执行代码时,我们可以用桩代码进行代替。如果未完成代码传入数据为被测代码中的局部变量或者被测代码中频繁操作的全局变量,并且

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论