|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,
JUnitPerf
择要
JUnitPerf是一个来器度代码的功能和实行效力的一本性能测试工具,经由过程编写用于JUnitPerf的单位测试代码可使这一历程主动化。从别的一个角度来讲它是JUnit的一个扩大插件。
假设你对这类范例的主动化测试感乐趣的话能够参考我写的书《PragmaticProjectAutomation》
您也能够花两地利间光临一下站点《Test-DrivenDevelopmentwithJUnitWorkshop》,这里供应了一些很好的JUnit的进修路子而且另有MikeClark的一些课本和理论引导手册匡助你更深切地懂得测试驱动开辟。
目次
·简介
·利用目标
·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下载
JUnitPerf1.9是以后最新的版本。包括之前一切版本的功效。
本版必要Java2和JUnit3.5或以上版本。
刊行包包括一个JAR文件,源代码,示例代码,API文档和本文档。
JUnitPerf安装
Windows
在Windows上按以下步骤安装:
1.解压junitperf-<version>.zip文件到一个目次中,在体系情况变量中增添%JUNITPERF_HOME%,值为文件解压后的目次。
2.把JUnitPerf加到CLASSPATH路径中:
setCLASSPATH=%CLASSPATH%;%JUNITPERF_HOME%libjunitperf-<version>.jar
Unix(bash)
在UNIX上按以下步骤安装:
1.解紧缩junitperf-<version>.zip到响应的目次下。比方:$JUNITPERF_HOME。
2.修正文件的权限:
chmod-Ra+x$JUNITPERF_HOME
3.把JUnitPerf加到CLASSPATH路径中:
exportCLASSPATH=$CLASSPATH:$JUNITPERF_HOME/lib/junitperf-<version>.jar
构建与测试
在$JUNITPERF_HOME/lib/junitperf-<version>.jar文件中已包括有编译好的类文件。
构建
$JUNITPERF_HOME/build.xml文件是Ant构建文件。
可使用以下命令构建JUnitPerf:
cd$JUNITPERF_HOME
antjar
测试
JUnitPerf安装包中包括了用于跟JUnitPerf分离利用的JUnit测试用例的实例。
能够输出以下命令考证JUnitPerf安装是不是一般:
cd$JUNITPERF_HOME
anttest
怎样利用JUnitPerf
最好的体例是利用JUnitPerf中附带的示例,这里包括了各类范例的测试。
$JUNITPERF_HOME/samples目次包括了本文中所讲的一切示例代码.
TimedTest
TimedTest机关办法有两个参数,一个是已存在的JUnit测试用例,另外一个是预期的最年夜的实行工夫。
比方要针对ExampleTestCase.testOneSecondResponse()办法创立一个实行工夫的测试而且守候该办法实行终了,假如工夫凌驾1秒则视为未经由过程。
longmaxElapsedTime=1000;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TesttimedTest=newTimedTest(testCase,maxElapsedTime);
一样地,假如想要在实行历程假如超越预期工夫当即停止本次测试能够在TimedTest机关函数中增添第三个参数,举比方下:
longmaxElapsedTime=1000;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TesttimedTest=newTimedTest(testCase,maxElapsedTime,false);
以下代码创立了一个实行工夫的测试,用来测试被界说在单位测试ExampleTestCase.testOneSecondResponse()办法所代表的功效实行的工夫。
实行效力测试举例
importcom.clarkware.junitperf.*;
importjunit.framework.Test;
publicclassExampleTimedTest{
publicstaticTestsuite(){
longmaxElapsedTime=1000;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TesttimedTest=newTimedTest(testCase,maxElapsedTime);
returntimedTest;
}
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(suite());
}
}
测试的粒度决意于JUnit的测试用例,并被JUnitPerf所利用,因而有必定的范围性。终极取得的实行工夫为测试用例中testXXX()办法的实行工夫,包含setUp(),testXXX(),和tearDown()办法的实行工夫。实行测试套件的工夫包括测试套件中一切测试示例的setUp(),testXXX(),和tearDown()办法的实行工夫。以是,预期的工夫还应当按照set-up和tear-down的实行工夫来制订(把这部分工夫也思索出来)。
LoadTest
LoadTest用来仿效多个用户并发实行屡次来举行测试。
LoadTest最复杂的机关函数只要两个参数,测试用例和用户数,默许情形下该测试只迭代一次。
比方,创立一个10用户并发实行一次ExampleTestCase.testOneSecondResponse()办法:
intusers=10;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TestloadTest=newLoadTest(testCase,users);
负载测试历程也能够指定一个分外的计数器实例用来指定用户并发实行之间的提早工夫。ConstantTimer类机关函数包括一个常量参数,用来指定提早工夫,假如指定为0则暗示一切的用户同时入手下手。RandomTimer类能够机关出随机的提早工夫。
比方:创立一个负载测试,10个并发用户各实行一次ExampleTestCase.testOneSecondResponse()办法,各个用户之间提早1秒钟实行。
intusers=10;
Timertimer=newConstantTimer(1000);
TesttestCase=newExampleTestCase("testOneSecondResponse");
TestloadTest=newLoadTest(testCase,users,timer);
为了仿效并发用户以指定迭代次数实行测试,LoadTest类机关函数包括了RepeatedTest参数。如许就能够为每一个测试用例指定迭代次数了。
比方:创立一个负载测试,10个并发用户,每一个用户迭代实行ExampleTestCase.testOneSecondResponse()办法20次,每一个并发用户之间提早1秒。
intusers=10;
intiterations=20;
Timertimer=newConstantTimer(1000);
TesttestCase=newExampleTestCase("testOneSecondResponse");
TestrepeatedTest=newRepeatedTest(testCase,iterations);
TestloadTest=newLoadTest(repeatedTest,users,timer);
大概如许来写:
intusers=10;
intiterations=20;
Timertimer=newConstantTimer(1000);
TesttestCase=newExampleTestCase("testOneSecondResponse");
TestloadTest=newLoadTest(testCase,users,iterations,timer);
假如负载测试请求测试在setUp()办法中包括特别的测试形态,那末就应当利用TestFactory类来确保每一个并发用户线程利用一个当地线程测试实例。比方创立一个10用户并发的测试,每一个用户运转ExampleStatefulTest类的一个当地线程,可如许来写:
intusers=10;
Testfactory=newTestFactory(ExampleStatefulTest.class);
TestloadTest=newLoadTest(factory,users);
假如测试个中的某一个办法,能够如许:
intusers=10;
Testfactory=newTestMethodFactory(ExampleStatefulTest.class,"testSomething");
TestloadTest=newLoadTest(factory,users);
以下的例子是测试单位测试ExampleTestCase.testOneSecondResponse()办法对应的功效的一个负载测试,用来测试该功效的实行效力。个中有10个并发用户,无提早,每一个用户只运转一次。LoadTest自己利用了TimedTest来失掉在负载情形下ExampleTestCase.testOneSecondResponse()办法的实践运转才能。假如全体的实行工夫凌驾了1.5秒则视为欠亨过。10个并发处置在1.5秒经由过程才算经由过程。
负载下接受才能测试举例
importcom.clarkware.junitperf.*;
importjunit.framework.Test;
publicclassExampleThroughputUnderLoadTest{
publicstaticTestsuite(){
intmaxUsers=10;
longmaxElapsedTime=1500;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TestloadTest=newLoadTest(testCase,maxUsers);
TesttimedTest=newTimedTest(loadTest,maxElapsedTime);
returntimedTest;
}
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(suite());
}
}
鄙人面的例子中,测试被倒置过去了,TimedTest器度ExampleTestCase.testOneSecondResponse()办法的实行工夫。然后LoadTest中嵌套了TimedTest来仿效10个并发用户实行ExampleTestCase.testOneSecondResponse()办法。假如某个用户的实行工夫凌驾了1秒则视为欠亨过。
负载下呼应工夫测试举例
importcom.clarkware.junitperf.*;
importjunit.framework.Test;
publicclassExampleResponseTimeUnderLoadTest{
publicstaticTestsuite(){
intmaxUsers=10;
longmaxElapsedTime=1000;
TesttestCase=newExampleTestCase("testOneSecondResponse");
TesttimedTest=newTimedTest(testCase,maxElapsedTime);
TestloadTest=newLoadTest(timedTest,maxUsers);
returnloadTest;
}
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(suite());
}
}
功能测试套件
上面的测试用例例子中把ExampleTimedTest和ExampleLoadTest分离在一个测试套件中,如许就能够主动地实行一切相干的功能测试了:
ExamplePerformanceTestSuite
importjunit.framework.Test;
importjunit.framework.TestSuite;
publicclassExamplePerfTestSuite{
publicstaticTestsuite(){
TestSuitesuite=newTestSuite();
suite.addTest(ExampleTimedTest.suite());
suite.addTest(ExampleLoadTest.suite());
returnsuite;
}
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(suite());
}
}
编写无效的JUnitPerf测试
TimedTests
WaitingTimedTests
默许情形下TimedTest测试中假如实践测试工夫凌驾了预期工夫则持续实行JUnit的测试。这类waitingtimedtest老是同意JUnit测试积累一切的测试了局,直到测试完成而且反省完一切的测试了局。
假如测试实行中守候测试终了的用例间接或直接地派生多个线程,那末此次测试只要比及一切的线程实行终了才会前往到timedtest中。别的一方面该测试将无穷期地守候。一样平常来讲,单位测试应当守候一切派生的线程实行终了,比方利用Thread.join()办法,以便正确地判别了局。
Non-WaitingTimedTests
别的,TimedTest还供应了一个机关办法,当实践工夫凌驾预期工夫时当即暗示未经由过程。这类范例的测试假如实行工夫凌驾了预期的最年夜工夫则不守候测试持续实行终了。这类范例的测试比上一种体例加倍无效,依据必要这类测试可勤俭工夫,将不再守候程序实行而且当即标识测试未经由过程。但是,跟下面一品种型分歧的是,这类范例的测试假如两头有测试欠亨过的话就不持续实行前面的测试了。
LoadTests
Non-AtomicLoadTests
默许情形下,假如LoadTest扩大出来的测试间接或直接地派生线程,它不会强迫这类线程并发实行(正如在事件中界说的一样)。这类范例的测试假定它扩大的测试在当前往把持时交互地完成。比方假如扩大测试的派生线程和把持前往没有守候派生历程实行终了,那末扩大测试就假定为一次性地完成了。
而一样平常来说,单位测试中为了正确地判别了局,应当守候派生的线程也实行终了,比方利用Thread.join()办法但是在某些情形下并非必定要如许的。比方,关于EJB散布式的查询了局,使用服务器大概派生一个新的线程去向理这个哀求。假如新的线程在统一个线程组中运转decorated测试(默许情形),那末一个非原子的压力测试仅仅守候压力测试间接派生的线程实行终了而重生成的线程则会被疏忽失落。
总之,非原子压力测试仅仅守候压力测试中间接派生的线程实行终了来仿照多个并发用户。
AtomicLoadTests
假如多个线程划定一个decorated测试乐成地实行,这就意味着只要一切decorated测试中的线程实行终了这个decorated测试才被以为是完成了。可使用setEnforceTestAtomicity(true)来强制实行这类测试()。这将无效地促使这类测试守候属于decorated测试的线程组的一切线程实行终了。原子性压力测试也会把任何过迟到出的线程当做是失利。假如一个线程俄然溃散,那末属于统一线程组的其他线程就会当即中断实行。
假如decorated测试派生的线程属于统一个线程组,默许情形下线程实行decorated测试,如许原子压力测试将无穷期地守候派生的线程实行终了。
总之,原子压力测试将守候一切属于统一线程组的线程实行终了,压力测试间接派生的线程,来仿照多个用户并发。
范围性
JUnitPerf已知有以下缺点:
·TimedTest前往的工夫是测试用例的testXXX()办法的工夫,包含setUp(),testXXX()和tearDown()三个办法的总工夫,这是任何测试实例中所能供应的最小的测试粒度。因而希冀的工夫也应当思索set-up和tear-down的运转工夫。(译者注:大概能够本人在JUnit测试用例利用System.currentTimeMillis()办法来盘算某个步骤的实行工夫)
·JUnitPerf并非一个完全的压力和功能测试工具,而且它也不会用来代替别的相似的工具。它仅仅用来编写当地的单位功能测试来匡助开辟职员做好重构。
·Theperformanceofyourtestscandegradesignificantlyiftoomanyconcurrentusersarecooperatinginaloadtest.TheactualthresholdnumberisJVMspecific.
·在压力测试中假如有太多的用户并发运转则测试情形会愈来愈糟。应当参照JVM的标准来指定用户数。
手艺撑持
假如您有任何干于JUnitPerf的疑问,必要改善的请求,乐成的履历大概bug,大概当有新的版本公布时失掉关照请发email给mike@clarkware.com。您的团体信息不会被公然。
您也能够经由过程邮件列表(http://groups.yahoo.com/group/junitperf/)的体例来会商有关JUnitPerf而且在有新的版本公布时收到关照。
捐助
您能够经由过程购置《PragmaticProjectAutomation》(http://www.pragmaticprogrammer.com/sk/auto/)一书的体例撑持JUnitPerf的持续开辟。
培训与引导
能够经由过程会见站点http://clarkware.com/courses/TDDWithJUnit.html懂得有关疾速地创立测试代码的办法。
这里也供应有关JUnit的引导(http://clarkware.com/mentoring.html)来匡助你改善测试。
假如想取得更多的信息请与我接洽(mailto:mike@clarkware.com)。
允许信息
JUnitPerfislicensedundertheBSDLicense.
感激
十分感激ErvinVarga在线程强健性和原子性测试方面赐与的匡助。他在这些方面提出利用线程组来捕捉和处置线程的非常,别的在TimeTest和TestFactory中提出了假如实行工夫超时则当即标识为失利的完成体例。十分感谢他对JUnitPerf的亲睐和倡议。
翻译
MSN:wyingquanathotmaildotcom完成工夫:2005-4-19
相干资本及参考文档
·JUnitPrimerMikeClark,ClarkwareConsulting,Inc.
本文复杂论述了怎样利用JUnit测试框架来编写和运转复杂的测试用例及套件。
·ContinuousPerformanceTestingWithJUnitPerfMikeClark(JavaProNews,2003)
本文解说了怎样编写JUnitPerf测试来不时地反省功能和可测性等情形。
·Test-DrivenDevelopment:APracticalGuideDavidAstels(PrenticeHall,2003)
包含一章由本文作者编写的怎样利用JUnitPerf来延续举行功能测试。
·JavaExtremeProgrammingCookbookEricBurke,BrianCoyner(OReilly&Associates,2003)
个中有一张专门报告了JUnitPerf的用法。
·JavaToolsforExtremeProgramming:MasteringOpenSourceToolsIncludingAnt,JUnit,andCactusRichardHightower,NicholasLesiecki(JohnWiley&Sons,2001)
包括一章形貌了怎样与HttpUnit一同利用JUnitPerf。
不得不提一下的是:.net是看到java红,而开发出来的工具。 |
|