Rails本体の、testを実行する(5) 番外編

http://d.hatena.ne.jp/kouji0625/20130615/p1 の続きで「Travis CIを設定してみましょう!」と行きたかったのです、まったく設定できませんでした。他人のプロジェクトをTravis CIで設定するのはムズいね。いつかはできるけど、いまではありません(キリッ
ということで、少し変化球として、Railsのパッケージングをしてみます。それでは、今日もはりきっていってみよ〜♪

パッケージング

といっても、rake packageを実行するだけですwww
しばらくすると、以下のgemファイルが生成されます。

内容の確認

せっかくですので、これらが RubyGems.org で配布されている公式のパッケージと変わりがないことを確認してみましょう。
事前に以下のコマンドでオリジナルの gem を取得しておきます。

$ gem install -r rails -v 3.0.3
(以下、想定する実行結果)
Successfully installed activesupport-3.0.3
Successfully installed activemodel-3.0.3
Successfully installed actionpack-3.0.3
Successfully installed activerecord-3.0.3
Successfully installed activeresource-3.0.3
Successfully installed actionmailer-3.0.3
Successfully installed railties-3.0.3
Successfully installed rails-3.0.3
8 gems installed

少し長いけど、確認は以下のコマンドで行った。

$ for f in `find . -name \*.gem`; do echo $f; mkdir -p tmp/orig tmp/mine; (tar xf $f -C tmp/mine 2> /dev/null; cd tmp/mine; tar xzf data.tar.gz 2> /dev/null; rm data.tar.gz; gzip -d metadata.gz; sed -i -e 's/date:.*$/date: 2010-11-16 00:00:00 -06:00/' metadata); (cd tmp/orig; tar xf `rvm gemdir`/cache/`basename $f` 2> /dev/null; tar xzf data.tar.gz 2> /dev/null; rm data.tar.gz; gzip -d metadata.gz) && (cd tmp; diff -rNu orig mine); rm -rf tmp; done
(以下、想定する実行結果)
./actionmailer/pkg/actionmailer-3.0.3.gem
./actionpack/pkg/actionpack-3.0.3.gem
diff -rNu orig/lib/action_view/testing/resolvers.rb mine/lib/action_view/testing/resolvers.rb
--- orig/lib/action_view/testing/resolvers.rb	1970-01-01 09:00:00.000000000 +0900
+++ mine/lib/action_view/testing/resolvers.rb	1970-01-01 09:00:00.000000000 +0900
@@ -22,10 +22,11 @@
       end
 
       templates = []
-      @hash.select { |k,v| k =~ /^#{query}$/ }.each do |path, source|
-        handler, format = extract_handler_and_format(path, formats)
-        templates << Template.new(source, path, handler,
-          :virtual_path => path, :format => format)
+      @hash.each do |_path, source|
+        next unless _path =~ /^#{query}$/
+        handler, format = extract_handler_and_format(_path, formats)
+        templates << Template.new(source, _path, handler,
+          :virtual_path => _path, :format => format)
       end
 
       templates.sort_by {|t| -t.identifier.match(/^#{query}$/).captures.reject(&:blank?).size }
./activemodel/pkg/activemodel-3.0.3.gem
./activerecord/pkg/activerecord-3.0.3.gem
diff -rNu orig/lib/active_record/relation/calculations.rb mine/lib/active_record/relation/calculations.rb
--- orig/lib/active_record/relation/calculations.rb	1970-01-01 09:00:00.000000000 +0900
+++ mine/lib/active_record/relation/calculations.rb	1970-01-01 09:00:00.000000000 +0900
@@ -166,7 +166,7 @@
       if operation == "count"
         column_name ||= (select_for_count || :all)
 
-        if arel.joins(arel) =~ /LEFT OUTER/i
+        if arel.join_sql =~ /LEFT OUTER/i
           distinct = true
           column_name = @klass.primary_key if column_name == :all
         end
diff -rNu orig/lib/active_record/relation/finder_methods.rb mine/lib/active_record/relation/finder_methods.rb
--- orig/lib/active_record/relation/finder_methods.rb	1970-01-01 09:00:00.000000000 +0900
+++ mine/lib/active_record/relation/finder_methods.rb	1970-01-01 09:00:00.000000000 +0900
@@ -194,7 +194,7 @@
 
     def construct_relation_for_association_calculations
       including = (@eager_load_values + @includes_values).uniq
-      join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, including, arel.joins(arel))
+      join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, including, arel.join_sql)
       relation = except(:includes, :eager_load, :preload)
       apply_join_dependency(relation, join_dependency)
     end
diff -rNu orig/lib/active_record/relation/query_methods.rb mine/lib/active_record/relation/query_methods.rb
--- orig/lib/active_record/relation/query_methods.rb	1970-01-01 09:00:00.000000000 +0900
+++ mine/lib/active_record/relation/query_methods.rb	1970-01-01 09:00:00.000000000 +0900
@@ -168,7 +168,7 @@
         arel.join(join)
       end
 
-      arel.joins(arel)
+      arel.join_sql
     end
 
     def build_arel
diff -rNu orig/lib/active_record/relation.rb mine/lib/active_record/relation.rb
--- orig/lib/active_record/relation.rb	1970-01-01 09:00:00.000000000 +0900
+++ mine/lib/active_record/relation.rb	1970-01-01 09:00:00.000000000 +0900
@@ -376,7 +376,7 @@
 
     def references_eager_loaded_tables?
       # always convert table names to downcase as in Oracle quoted table names are in uppercase
-      joined_tables = (tables_in_string(arel.joins(arel)) + [table.name, table.table_alias]).compact.map{ |t| t.downcase }.uniq
+      joined_tables = (tables_in_string(arel.join_sql) + [table.name, table.table_alias]).compact.map{ |t| t.downcase }.uniq
       (tables_in_string(to_sql) - joined_tables).any?
     end
 
./activeresource/pkg/activeresource-3.0.3.gem
./activesupport/pkg/activesupport-3.0.3.gem
./pkg/rails-3.0.3.gem
./railties/pkg/railties-3.0.3.gem

想定通りの結果になった。これでオレオレRailsができました。
あとは Travis CI の設定ができればいいんだけど...しばらくかかりそうですorz

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

Rails本体の、testを実行する(4)

一昨日 (http://d.hatena.ne.jp/kouji0625/20130613/p1) の続きです。
一昨日の時点で、あとは activerecord の失敗するテストをどうにかすればOKという状態でした。さぁ、今日もはりきっていってみよ〜♪

activerecord

テストに失敗する

activerecord のテストは同じ内容のテストを MySQL, MySQL2, SQLite, PostgreSQL に対して行うため、エラーの数は多いですが、修正箇所は(エラーの数よりも)少ないです。
まずは「Using native MySQL」において、失敗するテストをなんとかします。

  1) Failure:
test_reordered_scope_overrides_default_scope_order(DefaultScopingTest)
    [./test/cases/relation_scoping_test.rb:421:in `test_reordered_scope_overrides_default_scope_order'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<false> is not true.

これは「scope :reordered_by_name, reorder('name')」を「scope :reordered_by_name, except(:order).order(:name)」に変えたことが原因だと分かりました。
reorderは3.0.7からdeprecatedではなくなっているので、reorderに戻すことにした。(reverted 6f3a4c6b5e38acec11887b1adbc6e0bbf75dce1b)

  2) Failure:
test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing(TestNestedAttributesOnAHasAndBelongsToManyAssociation)
    [./test/cases/nested_attributes_test.rb:608:in `test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"Grace OMalley"> expected but was
<"Privateers Greed">.

  3) Failure:
test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing(TestNestedAttributesOnAHasManyAssociation)
    [./test/cases/nested_attributes_test.rb:608:in `test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"Grace OMalley"> expected but was
<"Privateers Greed">.

この2つはv3.0.20の修正を手作業で取り込むことで対応。(commit: cf2769c3284d04180646dc296e5823d8f53263ea)

修正した結果、「Using native MySQL2」「Using native SQLite3」でも全てのテストが成功するようになりました。(やったね!!)

最後は「Using native PostgreSQL」。これは強敵です。

  1) Failure:
test_should_be_able_to_encode_relation(DatabaseConnectedJsonEncodingTest)
    [./test/cases/json_serialization_test.rb:216:in `test_should_be_able_to_encode_relation'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"[{\"author\":{\"name\":\"David\"}},{\"author\":{\"name\":\"Mary\"}}]"> expected but was
<"[{\"author\":{\"name\":\"Mary\"}},{\"author\":{\"name\":\"David\"}}]">.

v3.0.20をバックポートして対応。

$ git diff v3.0.3..v3.0.20 test/cases/json_serialization_test.rb | patch -p2
  2) Failure:
test_delete_all_association_with_primary_key_deletes_correct_records(HasManyAssociationsTest)
    [./test/cases/associations/has_many_associations_test.rb:739:in `test_delete_all_association_with_primary_key_deletes_correct_records'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<1> expected but was
<2>.

  3) Failure:
test_depends_and_nullify(HasManyAssociationsTest)
    [./test/cases/associations/has_many_associations_test.rb:903:in `test_depends_and_nullify'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<#<Account id: 3, firm_id: 6, firm_name: nil, credit_limit: 50>> expected but was
<#<Account id: 5, firm_id: 6, firm_name: nil, credit_limit: 55>>.

v3.0.20との差分を見ながら手作業で修正。(commit: 90f234e)

その後

全て対応できたと思ったら、失敗するテストがでてきた。
ちょっと雑になってしまうけど(笑)、以下のコミットで修正。

  • 9ecad8ac3ade2c41fdd5115fdc4990ab5104697e
  • 479b5017f76bb8ddbe23d6e243c6ad14d6321666
  • debb4fc034f5414587d094eb9af615b07bee338c
  • ff25db0c87aaa4fbe6ef609cf7e2e70b71ce779c
  • 83ea5959bad138564c7fe0a45ee89805f8861ee2
  • 810dd5788f0ef9be84f24d43452c5832e05393f0
  • 28c1f6731369180c73bf2ca837b1c21efae78047

これでテストが通るクリーンな Rails 3.0.3 が用意出来ました。
興味がある方は takaokouji/railsGitHub: https://github.com/takaokouji/rails/tree/takaokouji/v3.0.3 からどうぞ。

残りの作業は TravisCI を設定して、コミットのたびに test を実行できるようにすることです。

(つづく...)

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

Rails本体の、testを実行する(3)

昨日 (http://d.hatena.ne.jp/kouji0625/20130612/p1) の続きです。
昨日の時点で、あとは activerecord のみという状態でした。さぁ、今日もはりきっていってみよ〜♪

activerecord

MySQL のセットアップ

事前に MySQL そのものは公式サイト (http://dev.mysql.com/downloads/mysql/) からダウンロードして、インストールしていました。しかしながら、設定で自動起動を OFF にしていたみたいなので、環境設定.app を操作して MySQL サーバを起動しました。
あと、以下のように MySQL の権限の設定が必要みたいです。 activerecord/test/connections/native_mysql/connection.rb に権限を設定するためのコマンドが書いてありました。なお、このファイルを修正して既存のアカウント情報を設定するという方法でもいいようです。

GRANT ALL PRIVILEGES ON activerecord_unittest.* to 'rails'@'localhost';
GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';
PostgreSQL のセットアップ

事前に PostgreSQL そのものは MacPorts でインストールしていました。

$ sudo port install postgresql92-server
$ sudo mkdir -p /opt/local/var/db/postgresql92/defaultdb
$ sudo chown postgres:postgres /opt/local/var/db/postgresql92/defaultdb
$ sudo su postgres -c '/opt/local/lib/postgresql92/bin/initdb -D /opt/local/var/db/postgresql92/defaultdb'
$ sudo -u postgres /opt/local/lib/postgresql92/bin/pg_ctl -D /opt/local/var/db/postgresql92/defaultdb start

しかしエラーが発生。ログインユーザと同じ名前のPostgreSQLのユーザを作成しておく必要があるみたい。

$ sudo -u postgres createuser kouji
Shall the new role be a superuser? (y/n) y
linecache の警告の抑制

Gemfile に以下を追加した。

gem "linecache", "0.43"

追加後は linecache のアップデート。

$ bundle update linecache
「joins is deprecated」の警告の抑制

該当するのは3箇所。Railsソースコードを修正する。
パッチは以下のコマンド + 目視で取得した。

$ git diff v3.0.3..v3.0.20 -- path/to/target_file.rb

please remove your call to joins from /Users/kouji/work/rails/rails/activerecord/lib/active_record/relation/calculations.rb:169:in `perform_calculation'

diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/activ
e_record/relation/calculations.rb
index 6bf698f..848b7d3 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -166,7 +166,7 @@ module ActiveRecord
       if operation == "count"
         column_name ||= (select_for_count || :all)
 
-        if arel.joins(arel) =~ /LEFT OUTER/i
+        if arel.join_sql =~ /LEFT OUTER/i
           distinct = true
           column_name = @klass.primary_key if column_name == :all
         end

please remove your call to joins from /Users/kouji/work/rails/rails/activerecord/lib/active_record/relation/query_methods.rb:171:in `custom_join_sql'

diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb
index 926f471..eb62750 100644
--- a/activerecord/lib/active_record/relation/query_methods.rb
+++ b/activerecord/lib/active_record/relation/query_methods.rb
@@ -168,7 +167,7 @@ module ActiveRecord
         arel.join(join)
       end
 
-      arel.joins(arel)
+      arel.join_sql
     end
 
     def build_arel

please remove your call to joins from /Users/kouji/work/rails/rails/activerecord/lib/active_record/relation.rb:379:in `references_eager_loaded_tables?'

diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index 49cdde5..07eb572 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -376,7 +376,7 @@ module ActiveRecord
 
     def references_eager_loaded_tables?
       # always convert table names to downcase as in Oracle quoted table names are in uppercase
-      joined_tables = (tables_in_string(arel.joins(arel)) + [table.name, table.table_alias]).compact.map{ |t| t.downcase }.uniq
+      joined_tables = (tables_in_string(arel.join_sql) + [table.name, table.table_alias]).compact.map{ |t| t.downcase }.uniq
       (tables_in_string(to_sql) - joined_tables).any?
     end
 

please remove your call to joins from /Users/kouji/work/rails/rails/activerecord/lib/active_record/relation/finder_methods.rb:197:in `construct_relation_for_association_calculations'

diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb
index e950dce..fadb6c5 100644
--- a/activerecord/lib/active_record/relation/finder_methods.rb
+++ b/activerecord/lib/active_record/relation/finder_methods.rb
@@ -194,7 +194,7 @@ module ActiveRecord
 
     def construct_relation_for_association_calculations
       including = (@eager_load_values + @includes_values).uniq
-      join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, including, arel.joins(arel))
+      join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, including, arel.join_sql)
       relation = except(:includes, :eager_load, :preload)
       apply_join_dependency(relation, join_dependency)
     end
「reorder」の警告

警告の内容に従って修正した。

diff --git a/activerecord/test/models/developer.rb b/activerecord/test/models/developer.rb
index 947583a..3083de7 100644
--- a/activerecord/test/models/developer.rb
+++ b/activerecord/test/models/developer.rb
@@ -88,7 +88,7 @@ class DeveloperOrderedBySalary < ActiveRecord::Base
   self.table_name = 'developers'
   default_scope :order => 'salary DESC'
   scope :by_name, order('name DESC')
-  scope :reordered_by_name, reorder('name')
+  scope :reordered_by_name, except(:order).order('name')
 
   def self.all_ordered_by_name
     with_scope(:find => { :order => 'name DESC' }) do
「to_a is deprecated...」の警告

この対応は無理っぽい。あきらめる。

「test_except_and_order_overrides_default_scope_order」の警告

修正漏れっぽい。

diff --git a/activerecord/test/cases/relation_scoping_test.rb b/activerecord/test/cases/relation_scoping_test.rb
index e2abe3b..1575cc5 100644
--- a/activerecord/test/cases/relation_scoping_test.rb
+++ b/activerecord/test/cases/relation_scoping_test.rb
@@ -415,12 +415,6 @@ class DefaultScopingTest < ActiveRecord::TestCase
     assert_equal expected, received
   end
 
-  def test_except_and_order_overrides_default_scope_order
-    expected = Developer.order('name DESC').collect { |dev| dev.name }
-    received = DeveloperOrderedBySalary.except(:order).order('name DESC').collect { |dev| dev.name }
-    assert_equal expected, received
-  end
-
   def test_reordered_scope_overrides_default_scope_order
     not_expected = DeveloperOrderedBySalary.first # Jamis -> name DESC
     received = DeveloperOrderedBySalary.reordered_by_name.first # David -> name
rack のバージョンダウン (「discarding old bytesize」の警告の抑制)

rack のバージョンを 1.2.1 に固定する。

$ vi Gemfile
(以下のように修正する)
gem "rack", "1.2.1"
$ bundle update rack

と、今日はここまで...

(つづく...)

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

Rails本体の、testを実行する(2)

昨日 (http://d.hatena.ne.jp/kouji0625/20130611/p1) の続きです。

全体のテストを実行する

ここで全体のテストを実行してみて、現状の問題を確認します。

$ mkdir -p ../rails-test-logs/v3.0.3/
$ bundle exec rake test 2>&1 | tee ../rails-test-logs/v3.0.3/`date +%Y%m%dT%H%M%S`.log
(以下、実行結果)
(in /Users/kouji/work/rails/rails)
(省略)
rake aborted!
Errors in activesupport, actionpack, activerecord
/Users/kouji/work/rails/rails/Rakefile:45
(See full trace by running task with --trace)

実行結果から分かった問題を以下に挙げます。(作業を進めるとまだまだ増えるかもね。)

  • 全体
  • activesupport
    • 2つテストに失敗する(のちに5つに増えたorz)
  • actionpack
    • 3つテストに失敗する
  • activerecord
    • MySQLのセットアップが必要
    • PostgreSQLのセットアップが必要
    • 失敗するテストの修正。なお、そもそも DBMS が未設定なのでテスト自体ができておらず、この時点では失敗するテストの数は不明。
    • 「DEPRECATION WARNING: reorder is deprecated. Please use except(:order).order(...) instead. (called from ./test/models/developer.rb:91)」の警告
    • 大量の「joins is deprecated and will be removed in 2.2」の警告
    • linecacheの「warning: method redefined; discarding old clear_file_format_cache」の警告
    • 「to_a is deprecated. Please remove it from ./test/cases/relations_test.rb:31:in `test_apply_relation_as_where_id'」の警告
    • 「./test/cases/relation_scoping_test.rb:418: warning: method redefined; discarding old test_except_and_order_overrides_default_scope_order」の警告
    • 「/Users/kouji/.rvm/gems/ruby-1.8.7-p358@rails-3.0.3/gems/rack-1.2.8/lib/rack/utils.rb:304: warning: method redefined; discarding old bytesize」の警告

上記を地道に問題を解決していく。

全体

memcachedのインストール
$ sudo port install memcached
$ memcached -d

この状態で rake test を実行すれば「Skipping memcached backed store tests. Start memcached and try again.」は表示されなくなる。
なお、 memcached を停止するときは「killall memcached」を実行すればよい。(もっとよい停止方法があるかも...)

activesupport

テストに失敗する
  1) Failure:
test_deprecate_class_method(DeprecationTest)
    [/Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/deprecation.rb:11:in `assert_deprecated'
     /Users/kouji/work/rails/rails/activesupport/test/deprecation_test.rb:65:in `test_deprecate_class_method'

v3.0.20からバックポートして対応。

$ git diff v3.0.3..v3.0.20 -- test/deprecation_test.rb | patch -p2          
  2) Failure:
test_escaping_to_xml(HashToXmlTest)
    [/Users/kouji/work/rails/rails/activesupport/test/core_ext/hash_ext_test.rb:919:in `test_escaping_to_xml'

v3.0.20から手作業でバックポートして対応。commit id: f0001afd26b17a7af71be96efb2fd0c5f6ec2716

  3) Failure:
test_uniq_load_paths(LoadPathsTest)
    [/Users/kouji/work/rails/rails/activesupport/test/load_paths_test.rb:13:in `test_uniq_load_paths'

rakeのバージョンが新しいことが原因だった。bundle exec rake testで回避。

  4) Failure:
test_formatted_offset_positive(TimeZoneTest)
    [/Users/kouji/work/rails/rails/activesupport/test/time_zone_test.rb:228:in `test_formatted_offset_positive'
  5) Failure:
test_to_s(TimeZoneTest)
    [/Users/kouji/work/rails/rails/activesupport/test/time_zone_test.rb:260:in `test_to_s'

v3.0.20からバックポートして対応。

$ git diff v3.0.3..v3.0.20 test/time_zone_test.rb | patch -p2

actionpack

テストに失敗する
  1) Failure:
test_response_cookies_are_added_to_the_cookie_jar_for_the_next_request(IntegrationProcessTest)
    [./test/controller/integration_test.rb:299:in `test_response_cookies_are_added_to_the_cookie_jar_for_the_next_request'

v3.0.20からバックポートして対応。

$ git diff v3.0.3..v3.0.20 test/controller/integration_test.rb | patch -p2
  2) Failure:
test_rendering_a_partial_in_an_RJS_template_should_pick_the_JS_template_over_the_HTML_one(RenderRjs::TestBasic)
    [./test/abstract_unit.rb:268:in `assert_body'
     ./test/abstract_unit.rb:276:in `assert_response'
     ./test/controller/new_base/render_rjs_test.rb:48:in `test_rendering_a_partial_in_an_RJS_template_should_pick_the_JS_template_over_the_HTML_one'

v3.0.20からバックポート。lib/action_view/testing/resolvers.rb も修正しないといけなかった。resolvers.rb のほうは、順番通りにファイルを探索する処理が入っている。

$ git diff v3.0.3..v3.0.20 test/controller/new_base/render_rjs_test.rb | patch -p2
$ git diff v3.0.3..v3.0.20 lib/action_view/testing/resolvers.rb | patch -p2
  3) Failure:
test_auto_link_with_block_with_html(TextHelperTest)
    [./test/template/text_helper_test.rb:501:in `test_auto_link_with_block_with_html'

sanitize(html)の処理結果の属性の順番が不定であることが原因のようだ。このため、のsrcとwidthの順番が不定になる。そして、テストに失敗する。不定であることが仕様なので、テストを修正すべきと判断しました。修正結果は以下です。

diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb
index 88ec6fc..493cff2 100644
--- a/actionpack/test/template/text_helper_test.rb
+++ b/actionpack/test/template/text_helper_test.rb
@@ -498,7 +498,7 @@ class TextHelperTest < ActionView::TestCase
     pic = "http://example.com/pic.png"
     url = "http://example.com/album?a&b=c"
 
-    assert_equal %(My pic: <a href="#{pic}"><img src="#{pic}" width="160px"></a> -- full album here #{generate_result(url)}), auto_link("My pic: #{pic} -- full album here #{url}") { |link|
+    assert_match %r(My pic: <a href="#{Regexp.quote(pic)}"><img (src="#{Regexp.quote(pic)}" width="160px"|width="160px" src="#{Regexp.quote(pic)}")></a> -- full album here #{Regexp.quote(generate_result(url))}), auto_link("My pic: #{pic} -- full album here #{url}") { |link|
       if link =~ /\.(jpg|gif|png|bmp|tif)$/i
         raw %(<img src="#{link}" width="160px">)
       else

今日はここまで。

(つづく...)

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

Rails本体の、testを実行する(1)

さて、急な話ですが少し古い Rails の test を実行してみたいと思います。
なんで古い Rails なのかって!?そりゃ、大人の事情ってもんです。
あと、なんで test するのかって!?いや〜、 Rails にセキュリティパッチだけを適用したいことってあるじゃないですか、そのときに test せずに導入ってわけにはいきませんよね。
それでは、いってみよ〜♪

ダウンロード

さて、対象の Rails は 3.0.3 です。GitHub からソースコードをダウンロードして、作業用のブランチを作成します。

$ mkdir -p ~/work/rails
$ cd ~/work/rails
$ git clone git@github.com:rails/rails.git
$ cd rails
$ git co -b takaokouji/v3.0.3 v3.0.3

必要なソフトウェアのインストール

nokogiriの警告がうるさいのでlibxml2とlibxsltをインストールしておく。あと、DB関係はあとでまとめてインストールする予定。

$ sudo port install libxml2 libxslt

Gemfile の修正

さて、ここからが問題です。古い Rails の test は簡単には実行できません。原因の 1 つは、Rails がリリースされたあとで関連する gem のバージョンが上がったためです。まずは、Gemfile を修正して、関連する gem のバージョンをリリース当時のものに固定します。
Rails のリリース当時のバージョンは、 RubyGems.org (http://rubygems.org/) で調べます。
Rails 3.0.3 のリリースは、2010/11/16 です。Rails の Gemfile に記述されている gem のその頃のバージョンの一覧を以下に挙げます。(JRubyOracle関係を除く。また、Gemfileに >= versionといった記述があるものは、その version をそのまま記述。)

  • "rake", "0.8.7"
  • "mocha", "0.9.8"
  • "rdoc", "2.5.10"
  • "horo", "1.0.2"
  • "faker", "0.3.1"
  • "rbench", "0.2.3"
  • "addressable", "2.2.2"
  • "memcache-client", "1.8.5"
  • "text-format", "1.0.0"
  • "system_timer", "1.0"
  • "ruby-debug", "0.10.3"
  • 'ruby-prof', "0.9.2"
  • "ruby-debug19", "0.11.6"
  • 'json', "1.4.6"
  • 'yajl-ruby', "0.7.8"
  • "nokogiri", "1.4.3.1"
  • "sqlite3-ruby", "1.3.1"
  • "pg", "0.9.0"
  • "mysql", "2.8.1"
  • "mysql2", "0.2.6"

上の情報を元に Gemfile を修正したら、bundle の実行...といきたいところですが、ここで要注意。実は、このときの RailsRuby 1.8 系でしか test できません。bundle を実行する前に rvm などをつかって Ruby を 1.8 系に切り替えておきます。

$ rvm use ruby-1.8.7-p358
$ rvm gemset create rails-3.0.3    
$ rvm gemset use rails-3.0.3
$ rvm rvmrc create
$ vi .rvmrc
(以下の箇所を修正)
environment_id="ruby-1.8.7-p358@rails-3.0.3"
$ cd ../
$ cd rails
====================================================================================
= NOTICE                                                                           =
====================================================================================
= RVM has encountered a new or modified .rvmrc file in the current directory       =
= This is a shell script and therefore may contain any shell commands.             =
=                                                                                  =
= Examine the contents of this file carefully to be sure the contents are          =
= safe before trusting it! ( Choose v[iew] below to view the contents )            =
====================================================================================
Do you wish to trust this .rvmrc file? (/Users/kouji/work/rails/rails/.rvmrc)
y[es], n[o], v[iew], c[ancel]> y

RubyGems のバージョンダウン

次は RubyGems のバージョンダウンです。RubyGems は 1.3.7 でないと警告がでまくってうっとうしいです。

$ gem install rubygems-update -v 1.3.7
$ update_rubygems

ここで一旦テスト

まだまだ作業は続きますが、とりあえず test の一部は実行できるようになっているので実行してみます。

$ cd railties
$ rake test
(以下、想定する実行結果)
rake/gempackagetask is deprecated.  Use rubygems/package_task instead
Loaded suite test/application/configuration_test
Started
.......................
Finished in 40.915443 seconds.

23 tests, 28 assertions, 0 failures, 0 errors
(省略)
Loaded suite test/script_rails_loader_test
Started
...
Finished in 0.004202 seconds.

3 tests, 3 assertions, 0 failures, 0 errors

うん、きれいな感じですね。(最初のrake/gempackagetaskの警告が気になるけど、これはしょうがないと思う。)

今日はここまでです。現状を https://github.com/takaokouji/rails/tree/takaokouji/v3.0.3 に push しておきました。気になる方はご覧あれ〜♪

(つづく...)

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

テストコード(spec)の修正なしで、テストをn倍速くする

(まったく試してないけど)QSpecを紹介します。

テストが遅いので parallel_tests で高速化しようとしたが、効率わるすぎて腹がたってきたのでより効率的な Qspec をつくった。

いくつかの rails プロジェクトでベンチマークしたところ、2倍以上の高速化効果が得られた。

parallel_tests (https://github.com/grosser/parallel_tests) は複数のプロセスで分割して RSpec を実行するためのソフトウェア。RSpec の実行速度が 3 倍になったという記事もある: 「Ruby / Rails のテストが約3倍速になって超快適に!!」(http://subtech.g.hatena.ne.jp/secondlife/20100819/1282226971)
Qspec が parallel_tests よりも 2 倍速いってことは、どちらも導入していない時よりも 6 倍になるってこと!?
production への導入を念頭において、ひと通りソースコードを読んでみた。sporkの簡単なラッパーかと思ったけど、そんなことはなかった。しっかりと作りこんであって良さそう。あと、parallel_tests はいろいろ設定が必要そうだったので躊躇したんだけど、こっちの設定は簡単そうだ。もちろん、Redis の知識が必要だろうけど、アプリケーション側への変更が少ないのはうれしい。
もう少しコードを読んでみて安心できたら、productionコードへの導入を検討しよう。

しかし、RSpec遅いね〜。いや、RSpecが遅いというよりは、巨大なspecのほうが問題か...

-- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。

既存のRubyのクラスの、テストコードgeneratorを作成する(2) rspec-kickstarterの紹介

昨日、これからやりたいことを書いたのですが (http://d.hatena.ne.jp/kouji0625/20130605/p1) 、それをある程度実現しているスクリプトがあるとのことなので調べてみました。
A Test Code Generator for RSpec Users: https://speakerdeck.com/seratch/a-test-code-generator-for-rspec-users
既存のクラスから、メソッド定義を抽出して、それを呼び出すspecを自動生成するというものです。
詳しくは上記のスライドか、GitHub から: https://github.com/seratch/rspec-kickstarter
これはすばらしい。特に、Rubyスクリプトの解析をするためにRDocを使っていることがすばらしい。目の付けどころが、シ(ry
rspec-kickstarterを参考にするか、それともrspec-kickstarter自体を修正するか悩ましいところです。
なにわともあれ、参考になるものがあってHappyです!!

(つづく...)

-- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。