Ruby on Rails是一个非常实用WEB开发框架。不过它的性能到底如何呢?这需要我们进行详细的测试。那么如何进行Ruby on Rails性能测试呢?
Ruby on Rails性能测试1.要进行Ruby on Rails性能测试,我们首先要模仿大量的数据,我们现在知道,在test/fixtures/目录下的yml文件里添加我们的测试数据,在运行测试时,这些数据会被加载到数据库。但是一条两条数据还可以,数据多的情况下,一条一条在yml文件里写可不行,所以,我们先看看怎样在yml文件里造大量的数据。在fixtrue目录下创建一个子目录performance,在里面新建order.yml文件,把内容改成下面的样子:
以下是引用片段: # Read about fixtures at http://ar.rubyonrails.org/ classes/Fixtures.html <% for i in 1..100 %> order_<%= i %>: id: <%= i %> name: Fred email: fred@flintstones.com address: 123 Rockpile Circle pay_type: check <% 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文件,内容如下:
以下是引用片段: require File.dirname(__FILE__) + ‘/../test_helper’ require ‘store_controller’ class OrderTest < Test::Unit::TestCase fixtures :products HOW_MANY = 100 def setup @controller = StoreController.new @request = ActionController: :TestRequest.new @response = ActionController: :TestResponse.new get :add_to_cart, :id => 1 end def teardown Order.delete_all end def test_save_bulk_orders elapsedSeconds = Benchmark::realtime do Fixtures.create_fixtures( File.dirname(__FILE__) + “/../fixtures/performance”, “orders”) assert_equal(HOW_MANY, Order.find_all.size) 1.upto(HOW_MANY) do |id| order = Order.find(id) get :save_order, :order => order.attributes assert_redirected_to :action => ‘index’ assert_equal(“Thank you for your order.”, flash[:notice]) end end assert elapsedSeconds < 3.0, ” Actually took #{elapsedSeconds} seconds” end 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来控制。例如:
以下是引用片段: class OrderTest < Test::Unit::TestCase fixtures :products self.use_transactional_fixtures = true HOW_MANY = 100 …… 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) |
在这里,书上写的是两个方法之间用“”来分割,在我的机器上是使用一个空格来分割。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
Clouda框架介绍与应用场景
Clouda是一个NodeJS Web开发框架,但是,与流行的Express框架不同,Clouda是一个完整的前后端开发解决方案,等价于目前热议的MEAN架构。
-
2014年为您细数PHP框架排行榜Top 10
PHP框架是非常有用的工具,可以帮助开发者构建干净整洁和结构化的web开发,同时也加快了创建和维护 web 应用的速度。
-
Kraken:改变PayPal开发文化的Node.js框架
Kraken基于Express,Express是目前Node.js上最流行的MVC模式的Web开发框架,通过提供一系列强大特性帮助开发者快速创建各种Web应用。
-
为开发者准备的11个新鲜方便的框架
本文中我收集了11个新鲜而有用框架,兴许将能在你编码的时候帮助到你,并激发你设计和开发跨浏览器动态网站和web应用程序。