1、白盒测试内容CodeCover熟悉CodeCover的Standalone工作模式掌握使用Ant工具辅助测试的方法学习使用Eclipse插件进行测试JunitJunit简介版本3和版本4的比较类WordDealUtil的测试CodeCoverCodeCover简介CodeCover是一个免费的白盒测试工具,主要测试代码、分支、循环、MC/DC覆盖支持为每个测试用例生成独立的报表支持的语言有 Java和 COBOL工作原理通过在源代码中插入检测指令,实现对源代码的重新编排在运行编排之后的代码,实现对代码运行时的覆盖测试目标系统SimpleJavaApp“SimpleJavaApp”是一个小的sw
2、ing应用,可以显示和编辑一个图书列表,将其保存为XML文件,并可以从XML文件中加载保存的列表。打开Eclipse,导入“SimpleJavaApp”工程到工作空间。在Eclipse的“File”菜单,选择“Import”选项在“General”分类中选择“ExistingProjectsintoWorkspace”,浏览SimpleJavaApp源文件所在路径导入到工作空间。SimpleJavaApp运行截图覆盖测试安装配置CodeCover前提:JRE或JDK1.5或更高版本设置环境变量变量名:CODECOVER_HOME值:指向CodeCover的安装路径将CODECOVER_HOME
3、加入到Path变量中STANDALONE模式模式了解CodeCover的基本使用方式检查环境变量运行命令codecover-help,确保已经正确设置了CodeCover相关环境变量。编排编排是指在源程序中插入额外的代码,以获得程序在执行时行为的信息。首先,通过执行如下命令对SimpleJavaApp源代码进行编排。codecoverinstrument-root-directorySimpleJavaApp/src-destinationSimpleJavaApp/instrumentedSrc-containerSimpleJavaApp/test-session-container.xm
4、l-languagejava-charsetUTF-8命令执行结束后,新的、经过编排的源代码将出现在指定的位置:SimpleJavaApp/instrumentedSrc此外,还将生成一个包含有源代码静态信息的容器文件:SimpleJavaApp/test-session-container.xml选项说明选项root-directory指向将要被编排的源代码的顶级包路径。选项destination指向编排后生成的源代码的路径。选项container指向测试会话容器文件,该文件中包含编排代码的静态信息,即收集的覆盖数据。选项language用来表明被编排源代码所使用的开发语言。选项charse
5、t用来表明源代码的字符集。从命令行运行CodeCover对比编排前后的目录结构编排前编排后编译与执行编排后,需要对经过编排的源代码进行编译。在instrumentedSrc目录下执行如下命令:javac-encodingUTF-8-Xlint:uncheckedorgcodecoversimplejavaappSimpleJavaApp.java执行编译的编排程序javaorg.codecover.simplejavaapp.SimpleJavaApp执行结束后,将在当前目录自动生成一个覆盖日志文件。该文件中记录了程序运行过程中的覆盖测试数据。分析覆盖测试结果运行如下命令,将从覆盖日志文件中提
6、取信息填充到测试会话容器文件中。codecoveranalyze-containerSimpleJavaApp/test-session-container.xml-coverage-logSimpleJavaApp/instrumentedSrc/coverage-log-2015-10-10-09-50-33-313.clf-nameTestSession1-commentThefirsttestsession成功执行了上述命令后,将不再需要覆盖日志文件。选项说明选项container指向在编排过程中创建的测试会话容器文件,覆盖日志文件中提取的覆盖数据将插入到该文件中。选项coverage
7、-log指向执行编排程序时生成的覆盖日志文件。选项name定义测试会话的名字。选项comment是一个可选项,为本次测试会话提供一个说明。生成报告运行如下命令,CodeCover可以为测试会话文件中包含的测试会话生成一个报告。codecoverreport-containerSimpleJavaApp/test-session-container.xml-destinationSimpleJavaApp/SimpleJavaAppReport.html-sessionTestSession1-template%CODECOVER_HOME%/report-templates/HTML_Repo
8、rt_hierarchic.xml选项说明选项container指向一个用来生成测试分析报告的测试会话容器文件。选项destination指向将要生成的测试报告的初始HTML页面文件。选项session指向测试会话容器文件中一个测试会话的名字。选项template指向用来生成报告所用的XML模板文件。使用使用ANT模式运行模式运行使用Ant工具提高检测编译执行的效率修改xml文件安装部署Ant根据实际情况修改ant-build-codecover2.xml文件头部变量声明信息将该文件放在SimpleJavaApp目录下运行如下命令进行测试ant-fant-build-codecover2.xm
9、l选项说明codecoverDir:指向CodeCover的安装目录F:/Testing/WhiteBox/codecover-batch-1.0sourceDir:被测目标程序的源文件目录srcinstrumentedSourceDir:生成编排源代码的路径instrumentedmainClassName:运行程序包含main方法的主类org.codecover.simplejavaapp.SimpleJavaApp运行测试CodeCover会自动执行主程序第一次测试程序在执行插插入数据功入数据功能模块能模块时的代码覆盖CodeCover会自动执行主程序第二次测试程序在执行打打开文件功开文
10、件功能模块能模块时的代码覆盖测试脚本执行结束查看测试报告ECLIPSE插件模式插件模式导入目标应用选中“SimpleJavaApp”目录并导入给源程序加入CodeCover特性打开“SimpleJavaApp”项目属性对话框,并选择CodeCover分类。给源程序加入CodeCover特性选中CodeCover特性前面的复选框。使用CodeCover测试打开包浏览视图,定位到“SimpleJavaApp”工程的源文件目录。右键单击,在弹出菜单中选择“UseForCoverageMeasurement”项。使用CodeCover运行打开“Run”菜单选择“RunConfigurations”项,
11、打开“RunConfigurations”对话框使用CodeCover运行单击左上角“Newlaunchconfiguration”按钮使用CodeCover运行在弹出对话框中,配置项名字填写“SimpleJavaApp”,单击“Search”按钮,定位工程的主类。使用CodeCover运行选择含有main方法的主类,单击OK按钮使用CodeCover运行打开Arguments选项卡,在VMarguments输入框中填写如下内容:-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=1234-Dcom.sun.man
12、agement.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false运行程序在CodeCover选项卡中,检查“RunwithCodeCover”复选框已经被选中,单击“Run”按钮。运行程序使用CodeCover透视图在Window菜单中选择OpenPerspective下的Other项使用CodeCover透视图选择CodeCover透视图单击OK按钮。在线通知执行在LiveNotification在线通知视图中,键入“localhost”作为主机名,“1234”作为端口。单击“Connect”按钮,激活在
13、线通知功能。启动OpenFile测试用例在测试用例名称中键入“OpenFile”单击“StartTestCase”按钮开始一个测试用例。在在线通知视图下发出现“Startedtestcase.”字样。运行OpenFile测试用例启动DeleteBook测试用例1.结束OpenFile测试用例。2.启动一个新的“DeleteBook”测试用例。运行DeleteBook测试用例结束测试会话1.结束DleteBook测试用例2.结束测试会话在Eclipse中查看测试数据结束应用程序,测试数据自动记录到本次测试会话中。单击“Savetheactivetestsessioncontainer”按钮保存本
14、次测试数据。在Eclipse中查看测试数据覆盖率视图布尔分析视图在Eclipse中查看测试数据测试用例关联性视图在Eclipse中查看测试数据代码高亮导出测试报告右键单击“test-session-container.xml”在弹出菜单中选择“Export”导出测试报告。导出测试报告选择“CoverageResultExport”,单击“Next”按钮继续。导出测试报告选择类型“Report”确保目标文件是“html”类型,而不是“xml”类型。单击“Next”按钮继续。导出测试报告选择“xml”类型的模板文件,单击“Finish”按钮弹出对话框中单击“OK”按钮完成导出。分析测试报告JUni
15、t引言JUnit是 Java社区中知名度最高的单元测试工具。它诞生于 1997年,由 ErichGamma和 KentBeck共同开发完成。JUnit大大简化了开发人员执行单元测试的难度,特别是 JUnit4使用 Java5中的注解(annotation)使测试变得更加简单。如何使用JUnit4进行单元测试JUnit4不同于JUnit3的模型,JUnit3强制继承TestCase类,以函数命名规则来判断是否是测试;而JUnit4则使用元数据。如果你使用JDK1.4,请用JUnit3;否则建议使用JUnit4,Annotation的方式更灵活Junit3和Junit4的一些区别以前所有版本的 J
16、Unit都使用命名约定和反射来定位测试。例如,下面的代码测试 1+1等于 2:importjunit.framework.TestCase;publicclassAdditionTestextends TestCase privateintx=1;privateinty=1;publicvoidtestAddition()intz=x+y;assertEquals(2,z);Junit3和Junit4的一些区别而在 JUnit4中,测试是由Test注释来识别的,如下所示:importorg.junit.Test;importjunit.framework.TestCase;publicclas
17、sAdditionTestextendsTestCaseprivateintx=1;privateinty=1;TestpublicvoidtestAddition()-Additiontest,Addition都是可以的intz=x+y;assertEquals(2,z);Junit3和Junit4的一些区别SetUp和 TearDownUnit3测试运行程序(testrunner)会在运行每个测试之前自动调用setUp()方法。该方法一般会初始化字段,打开日志记录,重置环境变量,等等。在JUnit4中,您仍然可以在每个测试方法运行之前初始化字段和配置环境。然而,完成这些操作的方法不再需要叫
18、做setUp(),只要用Before注释来指示即可甚至可以用Before来注释多个方法,这些方法都在每个测试之前运行。清除方法与此类似,可以给它取一个更自然的名称,并用After其他比如类范围的setUp()和tearDown()方法。任何用BeforeClass注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用AfterClass注释的方法都将在该类中的所有测试都运行之后刚好运行一次。Junit4的Fixture在执行一个或者多个测试方法时需要的一系列公共资源或者数据,例如测试环境,测试数据等等。在编写单元测试的过程中,您会发现在大部分的测试方法在进行真正的测试之前都需要做大量的
19、铺垫为设计准备 Fixture而忙碌。JUnit专门提供了设置公共 Fixture的方法,只需要:使用注解 org.junit.Before修饰用于初始化 Fixture的方法。使用注解 org.junit.After修饰用于注销 Fixture的方法。保证这两种方法都使用 publicvoid修饰,而且不能带有任何参数。Junit4的Fixture/初始化 Fixture方法Beforepublicvoidinit()/注销 Fixture方法Afterpublicvoiddestroy()Junit4的FixtureJUnit4中引入了类级别的 Fixture设置方法,编写规范如下:使用注
20、解 org,junit.BeforeClass修饰用于初始化 Fixture的方法。使用注解 org.junit.AfterClass修饰用于注销 Fixture的方法。保证这两种方法都使用 publicstaticvoid修饰,而且不能带有任何参数。Junit4的Fixture/类级别 Fixture初始化方法 BeforeClasspublicstaticvoiddbInit()/类级别 Fixture注销方法 AfterClasspublicstaticvoiddbClose()如何使用JUnit4进行单元测试Before:setUpAfter:tearDownBeforeClassAf
21、terClassTest:test*异常以及时间测试注解 org.junit.Test中有两个非常有用的参数:expected和 timeout。参数 expected代表测试方法期望抛出指定的异常,如果运行测试并没有抛出这个异常,则 JUnit会认为这个测试没有通过。Test(expected=UnsupportedDBVersionException.class)publicvoidunsupportedDBCheck()异常以及时间测试参数 timeout指定被测试方法被允许运行的最长时间应该是多少,如果测试方法运行时间超过了指定的毫秒数,则 JUnit认为测试失败。Test(timeo
22、ut=1000)publicvoidselfXMLReader()测试运行器测试运行器,JUnit中所有的测试方法都是由它负责执行的。JUnit为单元测试提供了默认的测试运行器。可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),还可以为每一个测试类指定使用某个具体的运行器。RunWith(CustomTestRunner.class)publicclassTestWordDealUtilJUnit4 与与 JUnit 5 常用注解对比常用注解对比JUnit4新建一个 Java工程 coolJUnit新建一个 Java工程 coolJUnit新建一个
23、Java工程 coolJUnit新建一个 Java工程 coolJUnit新建一个类WordDealUtil新建一个类WordDealUtil扩展JUnit支持打开项目 coolJUnit的属性页-选择“JavaBuildPath”子选项-点选“AddLibrary”按钮-在弹出的“AddLibrary”对话框中选择 JUnit,并在下一页中选择版本 4后点击“Finish”按钮。扩展JUnit支持扩展JUnit支持扩展JUnit支持扩展JUnit支持创建单元测试目录通常不会将单元测试代码和被测试代码混在一起,这显然会照成混乱因为单元测试代码是不会出现在最终产品中建议分别为单元测试代码与被测试
24、代码创建单独的目录,并保证测试代码和被测试代码使用相同的包名创建单元测试目录创建测试类创建测试类测试方法需遵守的书写规范1.测试方法必须使用注解 org.junit.Test修饰。2.测试方法必须使用 publicvoid修饰,而且不能带有任何参数。测试方法中要处理的字符串为“employeeInfo”,按照设计目的,处理后的结果应该为“employee_info”。assertEquals是由 JUnit提供的一系列判断测试结果是否正确的静态断言方法(位于类org.junit.Assert中)之一,我们使用它将执行结果 result和预期值“employee_info”进行比较,来判断测试是
25、否成功。运行测试用例查看测试结果绿色的进度条提示我们测试运行通过了。现在就宣布代码通过了单元测试还为时过早。记住:您的单元测试代码不是用来证明您是对的,而是为了证明您没有错因此单元测试的范围要全面,比如对边界值、正常值、错误值得测试;对代码可能出现的问题要全面预测,而这也正是需求分析、详细设计环节中要考虑的。增加新的测试内容再次运行测试选择再次运行测试用例查看新的测试用例是否可以通过测试运行后结果JUnit运行界面提示我们有两个测试情况未通过测试当首字母大写时得到的处理结果与预期的有偏差,造成测试失败(failure);当测试对 null的处理结果时,则直接抛出了异常测试错误(error)。显
26、然,被测试代码中并没有对首字母大写和 null这两种特殊情况进行处理修改源代码JUnit将测试失败的情况分为两种:failure和 error。Failure一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题;error则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误,也可能是被测试代码中的一个隐藏的bug。再次测试参数化测试参数化测试的编写需考虑如下因素:1.为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。2.为测试类声明几个变量,分别用于存放期望值和测试所用数据。3.为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters修饰的,返回值为 java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。4.为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。5.编写测试方法,使用定义的变量作为参数进行测试。测试类源代码测试类源代码再次运行测试用例检查测试结果谢谢!