全方位解读Ruby on Rails性能测试技巧
创始人
2024-06-16 06:21:17
0

Ruby on Rails是一个非常实用WEB开发框架。不过它的性能到底如何呢?这需要我们进行详细的测试。那么如何进行Ruby on Rails性能测试呢?#t#

Ruby on Rails性能测试1.  要进行Ruby on Rails性能测试,我们首先要模仿大量的数据,我们现在知道,在test/fixtures/目录下的yml文件里添加我们的测试数据,在运行测试时,这些数据会被加载到数据库。但是一条两条数据还可以,数据多的情况下,一条一条在yml文件里写可不行,所以,我们先看看怎样在yml文件里造大量的数据。在fixtrue目录下创建一个子目录performance,在里面新建order.yml文件,把内容改成下面的样子:

 

  1. # Read about fixtures at 
    http://ar.rubyonrails.org/
    classes/Fixtures.html  
  2. <% for i in 1..100 %> 
  3. order_<%= i %>:  
  4. id: <%= i %> 
  5. name: Fred  
  6. email: fred@flintstones.com  
  7. address: 123 Rockpile Circle  
  8. pay_type: check  
  9. <% end %> 

 

然后再运行我们一个空测试,order_test.rb

depot>ruby test/unit/order_test.rb

到数据库里查看下表order,里面已经初始化了100条记录了。我们之所以要新建一个performance目录,是因为我们不想运行每个测试都要初始化100条记录,我们之前在测试model和controller的时候用的那个order.yml文件中的记录就够了。

Ruby on Rails性能测试2.  在test目录下也创建一个performance目录,然后创建一个order_test.rb文件,内容如下:

 

  1. require File.dirname(__FILE__)
     + '/../test_helper'  
  2. require 'store_controller'  
  3. class OrderTest < Test::Unit::TestCase 
  4. fixtures :products  
  5. HOW_MANY = 100 
  6. def setup  
  7. @controller = StoreController.new  
  8. @request = ActionController:
    :TestRequest.new  
  9. @response = ActionController
    ::TestResponse.new  
  10. get :add_to_cart, :id => 1  
  11. end  
  12. def teardown  
  13. Order.delete_all  
  14. end  
  15. def test_save_bulk_orders  
  16. elapsedSeconds = Benchmark::realtime do  
  17. Fixtures.create_fixtures
    (File.dirname(__FILE__) +  
  18. "/../fixtures/performance", "orders")  
  19. assert_equal(HOW_MANY, Order.find_all.size)  
  20. 1.upto(HOW_MANY) do |id|  
  21. order = Order.find(id)  
  22. get :save_order, :order => order.attributes  
  23. assert_redirected_to :action => 'index'  
  24. assert_equal("Thank you for your
     order.", flash[:notice])  
  25. end  
  26. end  
  27. assert elapsedSeconds < 3.0, 
    "Actually took #{elapsedSeconds} seconds"  
  28. end  
  29. end 

在这里,我们没有直接加载100个order,而是在test_save_bulk_orders方法中,先使用elapsedSeconds = Benchmark::realtime来计算测试花费的时间,再通过调用create_fixtures方法指定我们要加载order的yml文件,然后对每条加载的order,进行保存,在通过断言判断是否调用了index的Action,和Flash中的内容。***再判断elapsedSeconds是否小于3秒。

还有一点要注意,这里实际上对每个order进行了两次Save操作,一次是在加载yml文件的时候,一次是我们调用save_order的时候。

Ruby on Rails性能测试3.  如果我们不想在每个测试运行的时候都从yml文件里加载数据,那么我们可以通过self.use_transactional_fixtures来控制。例如:

 

  1. class OrderTest 

    < Test::Unit::TestCase 
  2.  fixtures :products  
  3.  self.use_transactional
    _fixtures = true  
  4.  HOW_MANY = 100 
  5.  ……  
  6. end  

 

Ruby on Rails性能测试4.  如果我们想知道某个方法或某句代码所花费的时间,可以通过rails的脚本script/profiler and script/benchmarker来查看,例如,我们注意到Product这个Model的search方法比较慢,为了避免盲目地进行优化,我们使用Profiler来告诉我们每句代码使用了多少时间,例如:

depot>ruby script/performance/profiler "Product.salable_items"

注意这里的script的路径,我在instantrails里的和书上的不一致,如果提示脚本找不到,那就在自己的本地目录找找看profiler文件放在什么地方。

Ruby on Rails性能测试5.  我们还可以使用benchmarker来比较两个方法所消耗的时间,例如:

ruby script/performance/benchmarker 10 "Product.salable_items" "Order.count_pending"

输出结果是:

user system totalreal
#1 0.078000  0.000000  0.078000 ( 0.078000)
#2 0.000000  0.000000  0.000000 ( 0.016000)

在这里,书上写的是两个方法之间用“”来分割,在我的机器上是使用一个空格来分割。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...