技術部アルバイトの鈴木(@draftcode)です。 クックパッドが内部向けに開発・運用を行ってきた、分散テスト実行システムRRRSpecをオープンソースとして公開しました。RRRSpecは時間のかかる自動テストを分散処理することで、全体のテスト時間の短縮を狙うアプリケーションです。現在クックパッドでは17000を超えるテスト項目があり、マシン一台でテストを実行すると完了まで数時間かかります。このテストを60並列程度の分散処理で行うことで、平均8分から9分程度で完了できるようになりました。また、Amazon EC2のスポットインスタンスを利用することにより、大幅なコスト削減も同時に達成しました。 https://github.com/cookpad/rrrspec 分散テスト実行とは アプリケーションが大きくなるにつれて、自動テストの数も大きくなっていきます。クックパッドでは、非常に多くの
rake_shared_context という、rake タスクをテストする際にべんりな shared context を gem にしたものがあります。これをバージョンアップしました。 バージョンアップしたときに RubyGems.org を確認したら、地味に 2000 ダウンロードされていて驚きました>< 変更点 rails に依存しているコードを修正して、padrino など他のフレームワークでも使えるようにした 任意のディレクトリの rake タスクをテスト出来るようにした(これまでは Rails.root/lib/tasks/*.rake 決め打ちだった) 例 下記のようにすると、/path/to/rake ディレクトリ配下の rake タスクをロードします。 RakeSharedContext.rake_dir = '/path/to/rake'
After my lightning talk at Ruby North East, a couple of people asked me how to go about getting set up with an engine with RSpec as the testing framework. We’ve automated this at Sage, but here’s what’s necessary. Generate a new engine plugin new - Tells Rails we’re generating a plugin –mountable - Tells Rails that it’s a mountable engine –dummy-path=spec/dummy - Makes the dummy application genera
Delayed Job とは何か BackgrounDRb 的な何かです。詳しくはググれば、英語のチュートリアル的なものがいろいろ見つけられると思います。 コンストラクタで複雑なことをしているとエラーになる class CrawlJob def initialize @agent = WWW::Mechanize.new end def perform ... end end を lib/crawl_job.rb として保存し、コントローラなどから Delayed::Job.enqueue CrawlJob.new すると、can't dump anonymous class Class (TypeError) というエラーが発生します。 理由は Delayed Job 内部で enqueue されたオブジェクトの YAML 化を行っているのですが、上の例の Mechanize オブジェク
CentOS 6.3 = さくら VPS。 rails の CI 環境はととのっていて、新たに jasmine を導入した状況を想定。 group :test do gem 'jasmine-headless-webkit' end bundle install はできるが、実行しようとすると Qt がなくて実行環境がビルドできない。[https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit[Installing Qt and compiling capybara webkit · thoughtbot/capybara-webkit Wiki]] を参考に Qt を入れる。 rpm -i http://dl.atrpms.net/el6-x86_64/at
3. MockとStubとは Test Doubleという概念の一部。 Double とは、代役のことで、テスト用にオブジェクトを 入れ替えるときに一般的に用いられる言葉。 [1] xUnit Test Patterns by Gerard Meszaros http://xunitpatterns.com/Test%20Double.html 4. Test Doubleの種類 Dummy 受け渡されることはあるが実際に使用されることはない。パラメータリ ストを埋めたいだけといった場合に利用されることが多い。 Fake 実際に動作するように実装されてはいるが、手抜きされており製品版 には向かない。 Stub テスト時の呼び出しに対してあらかじめ決められた値を返すもの。 Spy 呼び出しに基づく情報を記録するスタブ。例えば、何通メールが送ら れたかだけカウントするメールサービスなどが該当す
RailsでActiveRecord(DB)のトランザクション処理をテストする際のメモ。 トランザクション処理 簡単な例として以下のコードを考える。 class User def destroy_with_transaction User.transaction do destroy raise end end end テストコードを書く User#destroy_with_transactionは必ず例外が起こるので、トランザクションの働きで、レコードは削除されないことになる。よって、テストコードは以下のようになる。なお、フィクスチャとしてusers.ymlがあるとする。 class UserTest < Test::Unit::TestCase self.use_transactional_fixtures = false fixtures :users def setup @bob
RubyKaigi 2011の二日目が終わりました。来場者の皆さん、スタッフの皆さん、誠にありがとうございます。 いろいろ忙しかったり、緊張したりもしたけれど、とても楽しい時間を過ごせています。三連休完全外出を許容してくれた妻子にもありがとう。 さて、今日は発表枠をいただいて、RSpecでテストを書きながらRailsアプリを開発する話をしました。 Test Context Arrangement Recipebook View more presentations from Kyosuke MOROHASHI 講演中にも申したとおり、最初のRubyKaigiが行われた2006年(の会議終了ちょっとあと)からいままでの5年間ほぼ毎日、RSpecとRailsを使ってきました。今日はそこで見いだしつつある【独自研究】を話させていただきました。講演終了後から懇親会で声をかけていただいた方々には好評
Railsさんアプリでファイルアップロードのテストの書き方です。 以下のようなアップロードしたファイルを/tmpの下に保存するコントローラーがあるとします。 class TestController < ApplicationController def index end def upload file=params[:file]['csv'] @filename = params[:file]['csv'].original_filename File.open("/tmp/#{@filename}","wb"){ |f| f.write(file.read) } end end このコントローラー用のviewを以下のような感じで用意します。 <% form_tag({:action => 'upload'},{:class=>'form',:multipart=>true}) do
長いな。うまくかみ砕けてない証拠ですね。 GitHub みたいなものを作ってるんだと思ってください: こういうモデルがあるとする。有料課金していないユーザーは非公開レポジトリを1個までしか作れない。 class User < ActiveRecord::Base has_many :repositories def paid? self.payment_flag end end class Repository < ActiveRecord::Base belongs_to :user def before_create unless user.paid? if self.publicity == false && user.repositories.count(:conditions => ['publicity = ?', false]) > 0 return false end en
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く