
软件测试技术-5-4 单元测试-性能分析.ppt
39页软件测试- 单元模块性能分析,主要内容,TPTP简介 TPTP 的组成 TPTP的安装 TPTP Junit测试工具 HTTP应用程序性能测试工具 性能分析工具,TPTP是Eclipse基金会的一个顶级项目,提供了一套功能全面的开源测试和性能工具,覆盖了整个测试和性能生命周期,从早期的测试到生产应用程序的监视,包括测试编写和执行、监视、跟踪和分析以及日志分析特性,TPTP简介,Test and Performance Tools Platform,TPTP 包含一个核心平台和三种基于核心的工具 TPTP Platform TPTP Platform为UI开发、数据收集、基于规则的数据查询和应用程序的控制提供基本功能 例如:为其它工具提供可重用和可扩展的向导,提供编程接口,提供后台程序从本地或远程程序收集数据 TPTP Testing Tools 面向应用程序生命周期的测试阶段,主要功能包括测试的编辑、测试的部署和执行、测试结果的分析和报表测试工具包括:基于Junit的测试工具、Web应用性能测试工具和手工测试工具 TPTP Tracing and Profiling Tools 面向应用程序生命周期的跟踪和分析测试阶段,可以收集和分析应用程序的性能数据。
TPTP Monitoring Tools 面向应用程序生命周期的监控和日志分析阶段,可以监控应用服务器和系统的性能,例如CPU和内存的使用情况,TPTP 的组成,TPTP性能分析主要原理,一个ProfileAgent伴随JVM一起启动 对于每台物理服务器,会有一个AgentControler,AgentController负责与ProfileAgent进行通信,下载地址 http:/www.eclipse.org/tptp/ 安装TPTP runtime 将tptp.runtime-TPTP-4.7.2.zip解压缩到一个目录,TPTP的安装,将以上两个目录复制到eclipse的目录中,TPTP Junit测试示例,创建应用程序 导入 Junit4Example,public class Calculator private static int result; public void add(int n) Calculator.result = Calculator.result + n; public void substract(int n) /* 错误:应该是result = result - n */ Calculator.result = Calculator.result - 1; public void divide(int n) Calculator.result = Calculator.result / n;,public void square(int n) Calculator.result = n * n; public void clear() Calculator.result = 0; public int getResult() return Calculator.result;,具体参见Calculator .java,TPTP Junit测试示例,创建TPTP test suite 右键点击项目,选择 New - Test - TPTP JUnit test 在”Name”中输入”TptpTest” ,点击“finish,TPTP Junit测试示例,JUnit Test Suite 编辑器,创建TPTP test suite,TPTP Junit测试示例,创建TPTP 测试方法 点击标签”test methods”添加测试方法 testAdd 和 testSub,测试方法,创建TPTP 测试方法 点击标签“behavior“,配置测试方法的执行次数和顺序 添加一个Loop:Add Loop 添加两个invocation: testAdd和testSub 保存 test suite,TPTP自动生成测试代码存根,TPTP Junit测试示例,Number of Iteration:调用的次数,编辑Junit test methods 切换到Java Perspective ,打开TptpTest.java 编辑test methods,public void testAdd() throws Exception Calculator calculator = new Calculator(); calculator.add(1); calculator.add(1); org.junit.Assert.assertEquals(2,calculator.getResult();,public void testSub() throws Exception Calculator calculator = new Calculator(); calculator.clear(); calculator.add(10); calculator.substract(2); org.junit.Assert.assertEquals(8,calculator.getResult();,testAdd(,testSub (,TPTP Junit测试示例,TPTP Junit测试示例,运行TPTP Junit测试 右键点击TptpTest.testsuite,选择Run As Test 点击Test运行测试,基于数据池的测试,目标 适用于使用相同的测试方法,只是数据不同的测试 Datapool的结构 变量 一个命名的数据列 记录 一行数据 等价类 一组记录,产生相同的pass/fail 测试结果,基于数据池的测试,1.创建数据池 存放测试数据的文件,可以从CVS中导入 1.在包名上右击-new-Test Element-DataPool 2.输入数据池名称-finished 3.录入测试数据,2.添加datapool API需要的类库 在项目名上右击-properties- Java Build Path。
选择”Libraries”,单击”Add Variable”-Extend 选择 ECLIPSE_HOME 变量,选择一下jar包,基于数据池的测试,基于数据池的测试,2.添加datapool API需要的类库 ECLIPSE_HOME/plugins/org.eclipse.tptp.platform.models_Version.jar ECLIPSE_HOME/plugins/org.eclipse.tptp.platform.models.hierarchy_Version.jar ECLIPSE_HOME/plugins/mon_Version.jar ECLIPSE_HOME/plugins/org.eclipse.emf.ecore_Version.jar ECLIPSE_HOME/plugins/org.eclipse.core.runtime_Version.jar,注意: version是指目录对应的版本号,3.在测试代码中使用 datapool API 创建一个TPTP Test Case-”DataPoolTest”,参见TPTP 测试示例,基于数据池的测试,3.在测试代码中使用 datapool API 定义类的成员变量:IDatapoolIterator dpIterator; 在Junit setUp()中初始化dpIterator 在test methods中使用dpIterator,import mon.datapool.impl.*; import org.eclipse.hyades.execution.runtime.datapool.*; IDatapoolIterator dpIterator,基于数据池的测试,3.在测试代码中使用 datapool API 定义类的成员变量:IDatapoolIterator dpIterator; 在Junit setUp()中初始化dpIterator 在test methods中使用dpIterator,protected void setUp() throws Exception / 初始化datapool factory IDatapoolFactory dpFactory = new Common_DatapoolFactoryImpl(); / 加载数据池 datapool IDatapool datapool = dpFactory.load(new java.io.File(C:JavacodeJunit4Examplebindatapoolda.datapool),false); / 创建一个数据池迭代器 dpIterator = dpFactory.open(datapool,org.eclipse.hyades.datapool.iterator.DatapoolIteratorSequentialPrivate); / 初始化迭代器,指向第一个等价类 equivalence class. dpIterator.dpInitialize(datapool,0);,基于数据池的测试,3.在测试代码中使用 datapool API 定义类的成员变量:IDatapoolIterator dpIterator; 在Junit setUp()中初始化dpIterator 在test methods中使用dpIterator,用迭代器进行迭代 while(!dpIterator.dpDone() calculator.clear(); int a = Integer.parseInt(dpIterator.dpCurrent().getCell(a).getStringValue(); int b = Integer.parseInt(dpIterator.dpCurrent().getCell(b).getStringValue(); int c = Integer.parseInt(dpIterator.dpCurrent().getCell(c).getStringValue(); calculator.add(a); calculator.add(b); /assertTrue(calculator.getResult() = c); org.junit.Assert.assertEquals(c,calculator.getResult(); dpIterator.dpNext();,基于数据池的测试,基于数据池的测试,4.运行测试 在DataPoolTest.testsuite上点击Test; 双击DataPoolTest_XXXX.execution,查看运行结果,执行时间分析,WEB项目:WebExample 针对CaculatorTest.java,进行执行时间分析 点击右键”profile as ”-”profile configurations”,点击”profile”运行,点击Edit Options按钮,执行时间分析,执行时间分析拥有三个选项: Execution Flow 提供了更大量的剖析数据视图,但是增加了剖析的工作负担,剖析数据的量以及工作台的内存使用情况。
对于拥有大量剖析数据集合的程序来说,它也许有点不太适用 Execution Statistics 有一个较大幅度降低的工作负荷以及工作台内存使用情况,但是付出的代价却是一些剖析功能的丧失只有 Execution Statistics 与 Method Invocation Details 功能才能够使用 Collect method CPU time information 在上述的任意一种模式之中,剖析器都可以收集 CPU 花在执行剖析方法的时间这不同于上述的任何一种方法,因为 I/O 与等待时间并没有包含在 CPU 时间之中,执。
