はじめに 2015年6月12日にRSpec 3.3がリリースされました。 APIが大きく変更されたり、派手な新機能が追加されたりはしていませんが、うまく活用するとテストを効率よく書いていけそうな実践的な新機能がたくさん導入されています。 この記事ではそんなRSpec 3.3の新機能を紹介していきます。 新機能一覧 RSpec 3.3で追加された主な新機能は以下の11個です。 これから各新機能の内容を紹介していきます。 特定のエクスペクテーション群をまとめて検証できる(aggregate_failures メソッド) グループやexampleをID指定して実行できる 失敗したテストだけを再実行できる(--only-failures オプション) 失敗したテストを1件ずつ修正できる(--next-failure オプション) テストが増減しても seed を指定したランダム実行が同じ順序で実行
1) UsersController GET #show when an user is logged in, returns https status 200. Failure/Error: @user = FactoryGirl.create(:user) ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Name has already been taken # ./spec/controllers/users_controller_spec.rb:9:in `block (4 levels) in <top (required)>' のようにModelのValidationでエラーが発生し、テストに失敗する。 (上記のエラーは、テストデータの投入時にModelのUniquene
Ruby + RSpecでのTDD(BDD)において、shared_examplesやshared_examples_forは最高の武器ですね。 ご存知のようにtest-unitではRubyの言語仕様を駆使してテストコードの共有資産(assert_XXXXなど)を用意することになりますが、RSpecではshared_examplesやshared_examples_forといった語彙が用意されており、それらを使ってテストコードの共有資産を用意することができます。例えば、以下のような感じね。 shared_examples_for "SomeClass#finalize" do describe "#finalize" do it "メモリを開放する" do ... end it "objectプロパティがnilになる" do ... end end end describe "Class1
方法 expect()文の後ろをカンマで区切る。そして出力したいメッセージを、続けてダブルクオートの中に書く。 例 コード: describe Array do context "when created with new" do it "is empty" do array = Array.new array << 1 # エラーメッセージを表示するために、わざと代入してみる。 expect(array).to be_empty, "配列は空であるべきですが、 #{array.inspect}が含まれています。" end end end エラーメッセージ: "配列は空であるべきですが、[1]が含まれています。" procでもok expect(array).to be_empty, lambda { "expected empty array, got #{array.inspect}"
概要 なかなか使い分けする基準が理解できなかったけど、 こういうことかという考えが出てきたのでメモ。 使い分け方 テストの流れを端的に言うと、 機能、クラス、メソッドなどのテストの対象に対して、 特定の条件で実行してみて、 期待するアウトプットが返ってくるかを調べる、 ということになる。 ここで出てきたテストの対象と特定の条件とアウトプットに注目して、 (describe/context/example/it)の使い分けを行う。 describeには、テストの対象が何かを記述する。 contextには、特定の条件が何かを記述する。 exampleとitには、アウトプットが何かを記述する。日本語で記述するときはexampleを使う。it "is 〜やit { should be 〜 }のような形で書きたい場合はitを使う。 describe 'テストの対象' do context '特定の条
RSpecの出力をカスタマイズする方法。 例えばテスト中に計測した統計情報とか、そういうものを出力内容に含めたい時に便利。 結論から言うと、自分でFormatterやPrinterを作って、RSpecにこれを使え、って指定すれば良い。 # コマンド例 rspec -r my_html_formatter.rb -r my_html_printer.rb --format MyHtmlFormatter myapp_spec.rb 「-r」は外部のソースファイルを読み込ませるオプション。 そのファイルに書かれてるクラスや関数などが、specファイルの中で使用可能になる。 「--format」はFormatterの指定 (クラス名を書く、ファイル名じゃないよ!)。 Formatterは当然別ファイルに書かなきゃいけないので、別途「-r」で読み込んでおく。 Printerは実際に出力するHtml
アジャイル開発に取り組むチーム向けのコーチングや、技術顧問、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください(初回相談無料) みなさんこんにちは。@ryuzeeです。 僕がやっている案件(PHP)はもともとテストコードのないレガシーなプロジェクトで、それを改善するためにずっと動作を確認するための結合レベルの自動テストを増やしてきました。 そんな中で、僕のところではどうやってテスト用のfixtureを管理しているか事例として紹介したいと思います。 最初にコアとなるfixtureを用意するみんながたくさんテストを作る前にコアとなるテスト用のfixtureは用意しておきます。 さもないと、みんなが好き勝手にfixtureを作ってしまい、あっという間に混乱に陥ります。 プログラム本体と同様に、DRYの原則で、同じようなテストデータを繰り返し作ってしまうよう
はじめに 仕事で Rails を使わないピュアな Ruby のプロジェクトで開発をすることになり、RSpec のテストがパスするまでに少々はまったので、恥を忍んでまとめておきます。 RSpec を動かすまでの手順については、こちらのサイトの手順を参考にさせて頂きました。 qiita.com 環境 rbenv 1.0.0 ruby 2.3.0 事前準備 rbenv で ruby をインストールしておいて下さい。 ディレクトリ構成 今回作成するプロジェクトのディレクトリ構成です。 ソースコードは src 以下に、テストコードは sprc 以下に作成します。 rspec_sample ├── Gemfile ├── Gemfile.lock ├── src └── spec 初期設定 プロジェクトのディレクトリを作成し移動します。 ついでに、ソースを作成する src フォルダも作成しておきます。
require 'rspec_helper' #railsなら必要 # describe テスト対象のクラス describe TestTargetClass do # ネストができる describe TestTargetSubClass do # itなどで共通化したい処理があったらメソッドを定義できる def shared_method puts 'shared' end # このdescribeが実行される時に行われる処理 before :all do @test = TestTargetClass.new end # 各it毎に行われる事前処理 before :each do @test.set_value('test') end # このdescribeが全て実行した後に行われる処理 after :all do @test = nil end # 各itが終了する毎に実行される
過去に 書籍「実践SeleniumWebDriver」のPageObjectパターンをRSpecでテストコードにしてみた。 で「写経」はしてみたのですが、いよいよ実戦で使う時が来たのでこれを思い出す意味で書いていこうと思います。(前任者が残してくれたコード、資料があったのでここまでできるようになりました) 前提 SeleniumWebDriverとRubyとRSpecはそこそこわかる PageObjectデザインパターンもそこそこわかる これについては前任者が書いてくれた「Selenium2でつくるテストケースの構成について」 がものすごくわかりやすいです。 環境は諸事情によりWindows8.1 (多分Linuxでも同じことができるハズ)ブラウザが立ち上がるのでGUIがあったほうがいいです。 headlessでもできるみたいです 「Seleniumをブラウザなしで起動するための方法を調べ
RSpec3.0.0になってrspecコマンドの-lオプションがなくなりました。 vim-quickrunとvimprocでrspecコマンドを実行しているのですが、オプションがなくなったためRSpecファイルを編集中にカーソルがある行を指定して実行するときにエラーが出るようになりました。 今までの設定は以下のようにしていました。(quickrunの設定部分を抜粋) "=========================================== " quickrun settings "=========================================== let g:quickrun_config = {} let g:quickrun_config._ = {'runner' : 'vimproc', "runner/vimproc/updatetime" :
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く