読者です 読者をやめる 読者になる 読者になる

Rails2.3アプリをRails3.2にアップグレードする、その2

Ruby

今回は、RSpec と 性能測定結果です。その1はこちら


RSpec

今回のプロジェクトでは、 全model、全lib (少しですが)、view のごく一部にたいしての RSpecが書かれています。
Rspecのバージョンは 1.3.2 から 2.8.0 へのアップグレードでした。

lib
  • RSpec自身たいの問題はありませんでしたが、to_s(:db)がUTCを戻す問題から少し変更しました
model
  • バリデーションのテストで、その入力フィールドでエラーが出ているのかを
c.errors.on(:name).should_not be_nil

↓ のように変更

c.should have(1).errors_on(:name)
  • libと同じく UTC の問題、日時をチェックしてる部分は多数あるので変更量は多かったですが、エディターがやってくれました。
view

view/controller周りは RSpec 2.0 で仕様変更があり、RSpecコードの変更が必要です。

  • テスト対処のviewが partialの場合は
describe "_order_list.html.erb" do
   ...
  render "order/_order_list"

↓ のように変更

describe "order/_order_list.html.erb" do
   ...
  render
  • assigns がなくなった?
   assigns[:order] = orders(:or01)

↓ のように変更

   assign(:order, orders(:or01))
  • response.should have_tag が動かなくなった
    response.should have_tag('#unit_price2', /¥30,000/)

↓ のように変更

    rendered.should have_tag('#unit_price2', /¥30,000/)
helper

このプロジェクトでは helper のRSpecは書いていませんが、教育中に発見しました。ヘルパーメソッドの呼び出しは helper オブジェクトから行います。

    it "改行を<br/>タグに置き換える" do
      new_line("abc\nxyz\n123").should == "abc<br>xyz<br>123"
    end

↓ のように変更

    it "改行を<br/>タグに置き換える" do
      helper.new_line("abc\nxyz\n123").should == "abc<br>xyz<br>123"
    end

性能測定

だいたい動くようになったので、開発サーバーにデプロイし 2.3版と 3.2.2版の性能を測ってみました。環境をそろえるために、両方とも Passenger 3.0.11 で動かしました。

サーバーは さくら VPS 512 でメモリーは512Mbyte です。

メモリー使用量

ab コマンドでページをアクセスし、top でrubyプロセスを測定しました。

環境 VIRT
Ruby1.8.7 + Rails2.3.10 140m
Ruby1.9.3 + Rails3.2.2 185m
速度

Passengerの最大プロセス数(PassengerMaxPoolSize)は2なので、並行アクセス数は 1, 2 で測定してみました。

環境 Concurrency * Requests per second Time per request
Ruby1.8.7 + Rails2.3.10 1 2.35 425.2
Ruby1.9.3 + Rails3.2.2 1 2.46 405.9
Ruby1.8.7 + Rails2.3.10 2 5.56 359.5
Ruby1.9.3 + Rails3.2.2 2 4.96 403.2
今回の結論

Ruby1.8.7 + Rails2.3.10 から Ruby1.9.3 + Rails3.2.2 にアップグレードすると、メモリーの使用量は45Mbyte、32%も増加していますが、速度は +/-10%程度なので、ほぼ同じと考えられます。