答案:
JUnitPerf
摘要
JUnitPerf是一个来度量代码的性能和执行效率的一个性能测试工具,通过编写用于JUnitPerf的单元测试代码可以使这一过程自动化。从另外一个角度来说它是JUnit的一个扩展插件。
假如你对这种类型的自动化测试感兴趣的话可以参考我写的书《Pragmatic Project Automation》
您也可以花两天时间光顾一下站点《Test-Driven Development with JUnit Workshop》,这里提供了一些很好的JUnit的学习途径并且还有Mike Clark的一些讲义和实践指导手册帮助你更深入地了解测试驱动开发。
目录
· 简介
· 使用目的
· JUnitPerf下载
· JUnitPerf安装
· JUnitPerf构建与测试
· 如何使用JUnitPerf
· 编写有效的JUnitPerf测试
· 局限性
· 技术支持
· 捐助
· 培训与指导
· 许可信息
· 感谢
· 相关资源
简介
JUnitPerf是基于JUnit的一个度量性能和执行效率的一个自动化测试框架(工具)。
JUnitPerf包含以下两个主要的类(扩展了JUnit):
· TimedTest
TimedTest用来执行测试,返回执行该测试所使用的时间。
TimedTest构造方法中需要指定一个最大可接受的执行时间。默认情况下,执行该方法时会等待被执行的测试执行完毕,如果实际所用的时间超过了指定的最大时间则标识测试失败。另外你也可以通过在构造方法指定当实际执行时间超过最大可接受时间时不继续执行该测试,并标识测试未通过。
· LoadTest
LoadTest用来模仿多个并发用户多次迭代执行测试。
使用目的
很明显,JUnitPerf是对JUnit测试框架的一个扩展。这种方式的扩展允许动态地增加JUnit测试用例来进行性能测试,不会影响到先前的测试。这样您就可以快速简易地构造出性能测试套件。
性能测试套件可以自动地,独立于其它的JUnit测试用例执行。实际使用中,一般要尽量避免把JUnit测试用例和JUnitPerf测试用例组织在一起,这样才能更加独立地执行测试套件,并且也可按不同的顺序执行。持续时间较长的性能测试可能会延长测试的时间,从而导致你不愿意去执行所有的单元测试。因此,这需要你有计划地不时地去执行该测试,而不必影响到其他工作。
JUnitPerf倾向于针对已经有明确的性能要求或者执行效率要求,并且要保证代码重构后依然保持这样的目标的测试。例如,您可以使用JUnitPerf测试来确保在同样的条件下不会由于改变算法而导致性能降低。您也可以使用它来确保重构一个资源池后不会导致在负载情况下的执行效率降低(这种保证是通过比较条件改变前后的执行时间和效率,只提供一个度量的依据)。
从投入产出的角度来看维护一个注重实效的测试是相当重要的。传统的性能度量工具和技术首先会去找出性能问题的潜在出处,而JUnitPerf则用来不断地自动测试并且检查需求和实际的结果。
以下是一个实际使用场景的例子:
你有一个功能良好的程序,并且通过了必要的JUnit测试套件的测试验证功能通过。从这个角度来说你已经达到了设计所想象的目标。
然后使用一个性能度量工具来分析程序的哪部分执行时间最长。基于设计知识,您已经具有很好的工具对程序做实际的评估。并且重构后的代码清晰简洁,接下来的工作就是调整一小部分代码。
接下来就可以写JUnitPerf测试用例了,为这部分代码指定可接受的性能和效率参数。如果不对代码做任何改动的情况下直接进行测试将不会通过,证明测试用例是正确的。接着对代码做一些小的调整。
每次调整后都重新编译和运行JUnitPerf测试。如果实际的性能到达了预期的指标,测试就算是通过了。如果实际的性能达不到预期的指标,就需要继续调整过程直到测试通过。如果将来代码再次重构了你也可以重新运行测试。如果测试未通过,而同时之前的性能标准也提高了,这时就需要回溯到原来并且继续重构直到测试通过。
JUnitPerf下载
JUnitPerf 1.9是当前最新的版本。包含以前所有版本的功能。
本版需要Java 2和JUnit 3.5或以上版本。
发行包包含一个JAR文件,源代码,示例代码,API文档和本文档。
JUnitPerf 安装
Windows
在Windows上按以下步骤安装:
1. 解压junitperf-<version>.zip文件到一个目录中,在系统环境变量中增加%JUNITPERF_HOME%,值为文件解压后的目录。
2. 把JUnitPerf加到CLASSPATH路径中:
set CLASSPATH=%CLASSPATH%;%JUNITPERF_HOME%\lib\junitperf-<version>.jar
Unix (bash)
在UNIX上按以下步骤安装:
1. 解压缩junitperf-<version>.zip到相应的目录下。例如:$JUNITPERF_HOME。
2. 修改文件的权限:
chmod -R a+x $JUNITPERF_HOME
3. 把JUnitPerf加到CLASSPATH路径中:
export CLASSPATH=$CLASSPATH:$JUNITPERF_HOME/lib/junitperf-<version>.jar
构建与测试
在$JUNITPERF_HOME/lib/junitperf-<version>.jar文件中已经包含有编译好的类文件。
构建
$JUNITPERF_HOME/build.xml文件是Ant构建文件。
可以使用以下命令构建JUnitPerf:
cd $JUNITPERF_HOME
ant jar
测试
JUnitPerf安装包中包含了用于跟JUnitPerf结合使用的JUnit测试用例的实例。
可以输入以下命令验证JUnitPerf安装是否正常:
cd $JUNITPERF_HOME
ant test
如何使用JUnitPerf
最好的方式是使用JUnitPerf中附带的示例,这里包含了各种类型的测试。
$JUNITPERF_HOME/samples目录包含了本文中所讲的所有示例代码.
TimedTest
TimedTest构造方法有两个参数,一个是已存在的JUnit测试用例,另一个是预期的最大的执行时间。
例如要针对ExampleTestCase.testOneSecondResponse()方法创建一个执行时间的测试并且等待该方法执行完毕,如果时间超过1秒则视为未通过。
long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime);
同样地,如果想要在执行过程如果超出预期时间立即结束本次测试可以在TimedTest构造函数中增加第三个参数,举例如下:
long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime, false);
以下代码创建了一个执行时间的测试,用来测试被定义在单元测试ExampleTestCase.testOneSecondResponse()方法所代表的功能执行的时间。
执行效率测试举例
import com.clarkware.junitperf.*;
import junit.framework.Test;
public class ExampleTimedTest {
public static Test suite() {
long maxElapsedTime = 1000;
Test testCase = new ExampleTestCase("testOneSecondResponse");
Test timedTest = new TimedTest(testCase, maxElapsedTime);
&
上一个:软件路上,Sun面临四重危机
下一个:读jBpm Responsibilities