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

Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

RSpec

RSpec のテストダブルで呼び出しているクラスメソッドの変更を検出する方法について

RSpec の class_double で呼び出しているクラスやメソッドの変更を検出する方法についてまとめます。

RSpec のテストダブルで呼び出しているクラスやメソッドの変更を検出する方法について

RSpec のテストダブルで呼び出しているクラスやメソッドの変更を検出する方法についてまとめます。

Sandi Metz 氏に学ぶ自動テストの実装分類。どれをテストする?どれをテストしない?どれをモックする?

自動テストを書くとき、 どのコードをテストすべきか? どのコードをテストすべきではないか? どのコードに対するテストをモックすべきか? について迷ったことはありますか? このようなケースに関する判断指針を Sandi Metz 氏 がまとめてくれています。

レガシーコードのリファクタリングの痛みを減らすパラメタライズドテストの活用について

この世界には二種類のソフトウェア開発者しかいない。 テストを書いてからリファクタするソフトウェア開発者と、テストを書かずにリファクタするソフトウェア開発者だ。 さらに、テストを書いてからリファクタするソフトウェア開発者には二種類のソフトウェ…

rubocop-rspecのMessageExpectation CopとGiven/When/Then

rubocop-rspec には MessageExpectation という Cop(Check項目)があります。 これはデフォルトで allow(foo).to receive(:bar) を推奨し expect(foo).to receive(:bar) に対して警告を出します。 この警告がでたときに、「ん?」どういうことなんだろう? と…

RSpecやMochaのテストにタグをつけてテスト対象をフィルタする

t_wadaさんに技術相談をしました という記事で言及されていた テストのタグ付について気になったので、具体的な実装レベルのところについてまとめます。 cureapp-dev.hatenablog.com

Circle CI のテストで RSpec のテストレポートを生成する

Ruby + RSpec のプロジェクトでテスト結果をCircle CIで取り扱いたい場合、 rspec_junit_formatter を使います。 単にこの gem を追加しておけばよしなに出力してくれます。 ※この情報は個人メモ的な内容であり、既出情報です。

RSpec | rspec config | default_path

概要 rspec config | default_path 詳細 RSpecはデフォルトでspec配下のファイルをテスト対象とします。 これを変更する場合はdefault_pathオプションを利用します。・rspecコマンド呼び出し時に指定する ・.rspecファイルに設定するなどの方法があります。 …

RSpec | rspec config | custom settings

概要 rspec config | custom settings 詳細 RSpec.configureのadd_settingメソッドを利用することで 独自パラメータを好きな名前で追加できます。 サンプル仕様 設定にdebugを追加。デフォルトをfalseにします。 実行時にはdebugモードをrandによってランダ…

RSpec | rspec config | alias_example_to

概要 rspec config | alias_example_to 詳細 RSpec.configureのalias_example_toを利用すると it(example, specify)やdescribe(context)にエイリアスを追加できます。利用目的としては・単純に好みの名前を付ける ・特定のオプションと併せて定義できる点を…

RSpec | rspec metadata | user define metadata

概要 rspec metadata | user define metadata 詳細 context, itに任意の内容のキーと値を設定すると example.metadata[:key]で、該当の設定値を取得できます。ネストして定義した場合は、オーバーライドすることになります。 hige_spec.rb require 'spec_hel…

RSpec | rspec metadata | described_class

概要 rspec metadata | described_class 詳細 described_class変数でトップレベルのdescribeにクラスが設定されていた場合、 該当クラスを取得できます。 hige_spec.rb require 'spec_helper' require 'hige' describe Hige do it "hige1" do puts described…

RSpec | rspec helper | define helper method int module

概要 rspec helper | define helper method int module 詳細 Helperをmoduleで作成し、RSpec.configureに設定することで 複数のspec間で流用することができます。 lower.rb module Lower def lower(text) text.downcase end end spec_helper.rb require 'low…

RSpec | rspec hook | before/after

概要 rspec hook | before/after 詳細 rspecのhookについて。 before/afterフックは各exampleの処理前後に処理を追加することができます。 引数に「:each」「:all」のどちらかを指定することで1回だけ実行するか、 各exampleごとに実行するか設定できます。…

RSpec | rspec command | テスト順のランダム化

概要 rspec command | テスト順のランダム化 詳細 rspec command実行時に、spec_helperに config.order = 'random' の設定を行うことで各テストケースをランダムな順序で実行します。 この設定を行った場合、テスト実行終了時に乱数の種(seed)が表示されま…

RSpec | rspec helper | let

概要 rspec helper | let 詳細 letはexample内で変数を利用したい場合に使います。 beforeで@xxxなどで変数を利用する場合との違いは、lazy loadであることです。 subject { インスタンス } 構成 $ tree ┣ lib | ┗ hige.rb ┗ spec ┣ hige_spec.rb ┗ spec_he…

RSpec | rspec | 明示のsubject

概要 rspec | 明示のsubject 詳細 明示的に初期化する場合は下記の構文を利用します。 subject { インスタンス } 構成 $ tree ┣ lib | ┗ hige.rb ┗ spec ┣ hige_spec.rb ┗ spec_helper.rb hige.rb # encoding: utf-8 class Hige attr_accessor :msg def ini…

RSpec | rspec | 暗黙のsubject

概要 rspec | 暗黙のsubject 詳細 rspec実行時にExample内でsubjectを利用できます。 subjectはデフォルトではトップ階層のdescriptionのインスタンスです。 (descriptionがネストしている場合でもトップ階層のインスタンスが設定されます) descriptionに…

RSpec | rspec command | pattern option

概要 rspec command | pattern option 詳細 rspec commandのpattern optionでワイルドカードなどを利用したパターン文字列で テスト対象を抽出して実行できます。 デフォルトは「spec/**/*_spec.rb」になっています。 構成 $ tree ┣ lib | ┣ hage.rb | ┣ h…

RSpec | rspec command | tag option

概要 rspec command | tag option 詳細 rspec commandのtag optionで行数指定で実行します。 サンプルテストコード(hige_spec.rb) # encoding: utf-8 require "spec_helper" require "hige" describe Hige do it "hige1 1", :hige1 => "hige", hige: true do…

RSpec | rspec command | line_number option

概要 rspec command | line_number option 詳細 rspec commandのline_number optionで行数指定で実行します。 サンプルテストコード(hoge_spec.rb) # encoding: utf-8 require "spec_helper" require "hoge" describe Hige do it "hoge1 1" do # some spec e…

RSpec | rspec command | init option

概要 rspec command | init option 詳細 rspec commandのinit optionで 前提 RSpec 2.14.7で動作確認 動作確認 rspec --init か rspec -i コマンドで 「.rspec」「spec」「spec/spec_helper.rb」を生成してくれます。 $rspec -i create spec/spec_helper.rb …

RSpec | rspec command | format option

概要 rspec command | format option 詳細 rspec commandのformat optionで出力フォーマットを制御できます。 サンプルテストコード(hoge_spec.rb) # encoding: utf-8 require "spec_helper" require "hoge" describe Hige do it "hoge1 1" do # some spec e…

RSpec | rspec command | fail fast option

概要 rspec command | fail fast option 詳細 rspec commandのfail fast optionでテスト失敗時に即実行を終了できます。 rspec --fail-fast サンプルコード(hoge.rb) 100メソッド定義 # encoding: utf-8 class Hoge (1..100).each do |i| define_method "hog…

RSpec | rspec command | exit status

概要 rspec command | exit status 詳細 rspec commandによるテスト実行時に 全テストが成功ならexit statusは0 そうでなければexit statusは1 になります。 サンプルコード1(hoge_spec.rb) # encoding: utf-8 require "spec_helper" require "hoge" descr…

RSpec | rspec command | example option とRSpecPiccoloの組み合わせ

概要 example option とRSpecPiccoloの組み合わせ 詳細 example option とRSpecPiccoloの組み合わせについて。 RSpecPiccoloは私が自作したgemで、パラメタライズドテストに利用します。https://rubygems.org/gems/rspec_piccolo https://github.com/tbpgr/r…

RSpec | rspec command | example option

概要 rspec command | example option 詳細 rspec commandのexample optionで ・特定の一つのexampleのみ実行 ・特定の名前に一致するexampleを全て実行 ・example optionを複数回指定して複雑な条件で任意のテストを実行する などのようなことができます。 …

RSpec | rspec-core shared examples

概要 rspec-core shared examples 詳細 shared examplesは複数のexample間で共有するexampleを定義できます。 include_examplesで呼び出します。 alias main alias shared_examples shared_context shared_examples shared_examples_for include_examples in…

RSpec | rspec-core metadata

概要 rspec-core shared metadata 詳細 metadata RSpecのexample.metadataはメタデータをハッシュで保持している。 described_class described_classでdescribeのクラスを取得可能。 shared_examlesなどを作成する際に、 処理対象のクラス名称を問わずに利用…

RSpec | rspec-core describe/context/it/example/specify

概要 rspec-core describe/context/it/example/specify 詳細 describe describeはExampleGroupを生成します。 it describeの内側で、itメソッドを利用してexampleを作成できます。 alias main alias memo describe context トップレベルではdescribeのみ利用…

RSpec | RSpecのテストレポートをtsv形式で出力してみる

概要 RSpecのテストレポートをtsv形式で出力してみる 詳細 RSpecのテストレポートをtsv形式で出力してみる 仕様 メソッド、ケース番号、ケース名、成功・失敗をtsv形式で出力する。 tsvにしたのはExcelにそのままはれるから。 構成 │ .rspec │ Gemfile │ ├─l…

RSpec | matcherの戻り値に応じて後処理を行う

概要 matcherの戻り値に応じて後処理を行う 詳細 matcherの戻り値に応じて後処理を行います。RSpecのmatcherは成功時にtrue、失敗時にnilを返すので それを判断基準に処理を分岐して、Procを実行させてみます。 前提 rspec_piccoloを利用します 構成 $ tree …

Ruby | リスト構造のテストケーステンプレートを作成するRSpecPiccolo gemを公開しました

概要 リスト構造のテストケーステンプレートを作成するRSpecPiccolo gem 内容 リスト構造のテストケーステンプレートを作成するRSpecPiccolo gemを公開しました。・1ファイル=1クラスのテスト ・1contextで1メソッドのテスト ・1context内の複数ケースはリ…

RSpec | カスタムマッチャーを作成する

概要 カスタムマッチャーを作成する 内容 カスタムマッチャーを作成します。 仕様 あるクラスのフィールドに対して、指定したマップ内のキーのフィールドが バリューの値を持っているか全比較し、全て保持していればマッチ成功とする。 主に登録処理、編集処…

Capybara | Rails、RSpec、Capybara, Kickstart, Poltergeist, phantomjsでJavaScriptのテスト環境設定

概要 Rails、RSpec、Capybara, Kickstart, Poltergeist, phantomjsでJavaScriptのテスト環境設定 内容 kickstart設定 kickstart.cssのimportをコメントコメントアウトして無効化。 /*--------------------------------- IMPORTS ---------------------------…

Ruby | DatabaseCleanerでテストデータクリア

概要 DatabaseCleanerでテストデータクリア 内容 DatabaseCleanerでテストデータクリアします。FactoryGirl+Capybara(+ブラウザテスト)などの構成を利用する際に、 FactoryGirlとブラウザ側が別トランザクション管理になるため、 transactionを有効にし…

RSpec | Simple-Covでカバレッジの計測

概要 SimpleCovでカバレッジレポートの出力 内容 SimpleCovでカバレッジレポートの出力します。 導入 Gemfileに以下を追加 gem "simplecov", "~> 0.7.1" spec_helper.rbに下記を追加 require "simplecov" SimpleCov.start "rails" 確認 bundle exec rake spec…

RSpec | パラメータ化テストのDSL化

概要 パラメータ化テストのDSL化 詳細 下記記事のRSpecでパラメータ化テストをDSL化します。 RSpec | パラメータ化テスト http://d.hatena.ne.jp/tbpg/20130715/1373901728 仕様 下記のような記載でテストケースのパラメータ群を記載できます。 スペース部分…

RSpec | spec/supportにサポートファイルを配置してテストの共通化をする

概要 spec/supportにサポートファイルを配置してテストの共通化をする 内容 support配下はspec_helperで読み込み対象に設定しているため、他のspecでrequireしなくても利用可能です。 逆に言うと、support以外のフォルダにファイルを保存してrequireもしたい…

RSpec | 例外の検証

概要 例外の検証 内容 例外の検証時はブロック+raise_errorメソッドで検証します。 lambda {test_method(args)}.should raise_error(error_class) サンプル 実装 # encoding: utf-8 class Hoge def hoge(error) raise HogeError.new if error end end class…

RSpec | パラメータ化テスト

概要 パラメータ化テスト 詳細 RSpecでパラメータ化テストを行う サンプル 仕様 漢数字の一〜十を数値として扱うようにStringクラスを拡張します。 ・漢数字かどうかの検証 ・漢数字から数値への変換 ・漢数字同士の加算 を実装し、それをパラメータ化テスト…

RSpec | スタブ

概要 スタブ 詳細 スタブはメソッド呼び出し時に特定の値を戻します。 サンプル 引数で指定されたオブジェクトから生成された乱数と 内部で生成された乱数を元にしたテキストを返却するクラスのテストを行うとします。 テスト対象 # encoding: utf-8 class H…

RSpec

概要 Ruby用BDDフレームワークRSpecについて。 詳細 基礎 項目 内容 rspec-core describe/context/it/example/specify http://d.hatena.ne.jp/tbpg/20140415/1397569471 rspec-core shared examples http://d.hatena.ne.jp/tbpg/20140415/1397569770 metadat…

RSpec | モック

概要 モック 詳細 モックは特定の引数でメソッド呼び出し時に特定の値を戻します。 スタブは単純に特定の値を返却するのに対し、モックは特定のコンテキストに応じた値を返却します。 サンプル 引数で指定されたオブジェクトから生成された乱数と 内部で生成…

書籍 RSpec Book | Hello RSpec

パンくずリスト 書籍 RSpec Book Hello RSpec 概要 Hello RSpec 内容 RSpecでHello Worldします。 RSpecのテストは規約として「*_spec.rb」とする必要があります。 テストコード hello_hoge_spec.rb # encoding: utf-8 require_relative "../open_classes.rb…

書籍 RSpec Book | TDD,BDD,RSpec,Cucumber,BDDのサイクルに関して

パンくずリスト 書籍 RSpec Book TDD,BDD,RSpec,Cucumber,BDDのサイクルに関して 概要 TDD,BDD,RSpec,Cucumber,BDDのサイクルに関して 内容 TDD テスト対象のプログラムを書く前にテストを書く、という開発手法。 BDD テスト対象の振る舞い=Behaviorに焦点を…

書籍 RSpec Book

概要 書籍 RSpec Bookに関するメモ。 全てをカバーせず、自分の中で新たに学ぶことやまとめ直しておきたいことのみを抜粋します。 また、例示するサンプルも写経せずに出来るだけ自分で考えたサンプルにします。 各章 章 題目 概要 1 概要 TDD,BDD,RSpec,Cuc…

書籍 RSpec Book | Hello Cucumber

パンくずリスト 書籍 RSpec Book Hello Cucumber 概要 Hello Cucumber 内容 CucumberでHello Worldします。・対象プロジェクト用のルートフォルダを作成する。仮にhoge。 ・hoge配下にfeatures,specの2フォルダを作成する。 ・任意の名前で*.featuresファイ…