注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

测试框架ContiPerf  

2013-05-10 19:16:49|  分类: 测试 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      junit4之后,有个好玩的测试框架ContiPerf。在junit3时候的junitperf已经好久没更新了,找不到支持junit4写法的例子。ContiPerf要求Java5和Junit4.7以上,在maven中添加依赖
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope> test</scope>
        </dependency>
        <dependency>
            <groupId>org.databene</groupId>
            <artifactId>contiperf</artifactId>
            <version>2.1.0</version>
            <scope>test</scope>
        </dependency>
就可以进行测试了。

这里有个例子讲得很详细:http://testing.etao.com/node/626
可以里面代码都是用的图片,太猥琐了,将重要文字抄录如下,已备查看:
    首先,我们从上面的例子可以看到要使用ContiPerf必须现在@Rule的注释下生成一个ContiPerfRule的对象。ContiPerfRule的构造函数有三个,分别为:
public ContiPerfRule()、public ContiPerfRule(ExecutionLogger executionLogger)和public ContiPerfRule(ReportModule... modules)。
 
@PerfTest
用户可以在这个注释中添加性能测试的执行要求。
Invocations:方法的执行次数,例:@PerfTest(invocations = 300)重复执行300次;
Threads:同时执行的线程数,例:@PerfTest(invocations = 30, threads = 2)两个线程并发执行,每个线程执行15次,总共执行30次;
Duration:在指定时间范围内一直执行测试,例:@PerfTest(duration = 300)在300毫秒内反复执行。
三个属性可以组合使用,其中Threads必须和其他两个属性组合才能生效。当Invocations和Duration都有指定时,以执行次数多的为准。
例,@PerfTest(invocations = 300, threads = 2, duration = 100),如果执行方法300次的时候执行时间还没到100ms,则继续执行到满足执行时间等于100ms,如果执行到50次的时候已经100ms了,则会继续执行之100次。
如果你不想让测试连续不间断的跑完,可以通过注释设置等待时间,例,@PerfTest(invocations = 1000, threads = 10, timer = RandomTimer.class, timerParams = { 30, 80 }) ,每执行完一次会等待30~80ms然后才会执行下一次调用。
在开多线程进行并发压测的时候,如果一下子达到最大进程数有些系统可能会受不了,ContiPerf还提供了“预热”功能,例,@PerfTest(threads = 10, duration = 60000, rampUp = 1000) ,启动时会先起一个线程,然后每个1000ms起一线程,到9000ms时10个线程同时执行,那么这个测试实际执行了69s,如果只想衡量全力压测的结果,那么可以在注释中加入warmUp,即@PerfTest(threads = 10, duration = 60000, rampUp = 1000, warmUp = 9000) ,那么统计结果的时候会去掉预热的9s。
 
当执行的测试类中包括了多个测试方法的时候则执行是顺序的,先执行test1,再执行test2。
如果想让一个测试类中的方法也是并发执行,那么只要在类的前面加一个注释@RunWith(ParallelRunner.class)。
 
@Required
通过这个注释可以添加一些对性能期望,如果达到期望值则测试通过,如果没有达到期望值则执行失败。
@Required(throughput = 20) :每秒钟至少执行20次
@Required(average = 50):测试全部完成平均执行时间为20ms
@Required(median = 45):至少50%次执行的时间在45ms内
@Required(max = 2000) :所有执行的执行时间没有超过2s
@Required(totalTime = 5000) :测试完成执行时间少于5s
@Required(percentile90 = 3000) :所有执行中90%的执行时间少于3s
@Required(percentile95 = 5000):所有执行中95%的执行时间少于5s
@Required(percentile99 = 10000):所有执行中99%的执行时间少于10s
@Required(percentiles = "66:200,96:500"):所有执行中66%的执行时间少于200ms,96%的执行时间少于500ms
 
@PerfTest和@Required不仅可以指定某一个方法,也可以至于类的前面指定某一个类的执行参数。
同时ContiPerf还支持推Test Suites的性能测试,只需在类的最前面加注释@RunWith和@SuiteClasses ,例如:
在每次执行完测试的时候,ContiPerf会自动生成测试报告,报告放在target/contiperf-report/index.html下。

如果在对类指定了执行的参数,对类中的方法也执行了执行参数,那么实际执行的结果是什么?方法上的参数设置会覆盖类上的参数设置。

为什么要新建ContiPerfRule这个对象?

生成ContiPerfRule的对象的主要作用有:
1、 激活ContiPerf,使config为contiperf.active;
2、 在测试开始的时候创建一个新的测试报告,测试完成时把测试结果写入测试报告中;(createDefaultRule等方法)
3、 获取注释中的属性;(configurePerfTest方法)
4、 生成测试用例的Statement。(apply方法)
 
ContiPerfRule这个类实现了Junit中的MethodRule接口,并实现了类中的apply()方法。apply方法生成了测试执行的Statement。JUnit中Runner的运行过程就是Statement链的运行过程,Statement是对一个单元运行的封装,每个Statement都只是执行它本身所表达的逻辑,而将其他逻辑交给下一个Statement处理,而且基本上的Statement都存在对下一个节点的引用,从而由此构成一条Statement的链。
  评论这张
 
阅读(862)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017