
1.1. 应该以实际产品的使用方式进行测试
1.2. 所有的基准测试通常都包括一个预热期,在这期间,JVM可以将代码编译到最佳状态
1.3. 微基准测试(microbenchmark)
1.3.1. 通过测量一小部分代码的性能来确定多种实现中哪个最好
1.3.2. 必须读取测试的结果
1.3.2.1. 从局部变量改为实例变量(用volatile关键字进行声明)即可测量这个方法的性能
1.3.2.2. 即使微基准测试是单线程的,也需要使用volatile变量
1.3.3. 必须测试一系列的输入值
1.3.4. 必须测量正确的输入值
1.3.5. 代码在生产环境中可能有不同表现
1.3.5.1. 对于不那么频繁的操作,修复微基准测试发现的纳秒级别的回归问题就会浪费时间,将这些时间用于优化其他操作必然更有益
1.3.5.2. 若一个集合被访问上百万次,那么每次访问节省的几纳秒就很重要
1.3.6. 必须包含一个预热期,让编译器有机会生成最佳代码
1.3.6.1. 必须有预热期,否则它测量的就是编译性能,而不是代码性能
1.3.6.2. Java的一个性能特点是,代码执行得越多,性能就越好
1.4. 宏基准测试(macrobenchmark)
1.4.1. 要测量一个应用程序的性能,最好的测量对象就是应用程序本身,外加它使用的任何外部资源
1.4.2. 资源分配
1.4.3. 在没测试整个应用程序的时候,不可能知道优化哪部分的性能会有效果
1.5. 介基准测试(mesobenchmark)
1.5.1. 介于微基准测试和宏基准测试之间
1.5.2. 比微基准测试的缺陷更少,也比宏基准测试更容易操作
1.5.3. 更容易使用多线程
1.5.4. 比完整的应用程序更有可能遇到同步瓶颈
1.5.5. 介基准测试的性能特点比微基准测试的更接近实际应用程序
1.5.6. 用介基准测试进行自动化测试也是很好的方法,特别是在模块级别的测试中
2.1. 测量批处理时间
2.2. 测量吞吐量
2.2.1. 基于一定时间内可以完成的工作量
2.2.2. 每秒事务数(TPS)
2.2.3. 每秒请求数(RPS)
2.2.4. 每秒操作数(OPS)
2.2.5. 吞吐量测试几乎都是在适当的预热期之后进行的
2.3. 响应时间
2.3.1. 从客户端发送请求到收到响应之间的时间
2.3.2. 在响应时间测试中,客户端线程会在操作之间有一段休眠时间,这被称为思考时间
2.3.3. 周期时间(并不是思考时间)
2.3.4. 平均响应时间
2.3.5. 百分位响应时间
2.3.6. 平均响应时间和百分位响应时间的区别
2.3.6.1. 异常值会影响平均值计算。
2.3.6.2. 因为在计算平均值时会用到异常值,异常值越大,它对平均响应时间的影响就越大
2.3.7. 优化重点应该是降低异常值的影响(从而缩短平均响应时间)
2.3.7.1. GC引入的暂停时间会让Java程序更容易出现异常值
2.3.7.2. 通常关注第90百分位响应时间(或者第95百分位响应时间和第99百分位响应时间
2.3.7.3. 如果你只能测量一个数字,那么最好选择基于百分位响应时间的测试,因为减小这个数字将惠及大多数用户
2.3.7.4. 最好同时测量平均响应时间和至少一个百分位响应时间,这样你就不会错过异常值过大的情况了
2.3.8. 负载生成器
2.3.8.1. Faban就是基于Java的开源负载生成器
2.3.8.2. Apache JMeter
2.3.8.3. Gatling
2.3.8.4. Micro Focus LoadRunner
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您