give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

【Everyday Rails Blog 翻訳】RSpec 3.7.2へのアップグレードとシステムスペック

はじめに

先日もお伝えしたとおり、電子書籍「Everyday Rails - RSpecによるRailsテスト入門」はRails 5.1とRSpec 3.6に対応しました。

ただし、RSpecについては現在すでにバージョン3.7がリリースされています。 RSpec 3.6と3.7は機能的な差異はほとんどないのですが、一点だけ、「システムスペック」という新しいタイプのテストが増えています。

このシステムスペックについて、原著者のAaronさんがご自身のブログで紹介されているので、その内容を翻訳してみました。 Everyday Railsの読者の方は(もちろんそれ以外の方も)ぜひ参考にしてみてください。

RSpec 3.7.2へのアップグレードとシステムスペック

原文: Upgrading to RSpec 3.7.2 and system specs | Everyday Rails

数ヶ月前(それはまさに、私がRails 5.1とRSpec 3.6に対応した「Everyday Rails - RSpecによるRailsテスト入門」の改訂版をリリースした数日後です)、RSpecチームは新たにバージョン3.7をリリースしました。本書の各章の内容はインクリメンタルに積み上げられていくことと、 rspec-rails gemは最初の方で本書のサンプルコードに導入されることから、本書の内容を無理に書き換えないことにしました。そのかわり、ここでは私が本書のサンプルアプリケーションをRSpec 3.7に対応したときの体験談をみなさんに共有します。この話の一番重要なポイントは、 Rails 5.1のシステムテスト(system test)がサポートされたということです。

システムテストが導入されたことにより、Railsフレームワークでは本書の第6章で説明したフィーチャスペックのように、ブラウザ上で実行するエンド・ツー・エンドのテストをデフォルトで書けるようになりました。このテストは システムテスト と呼ばれています。個人的な意見ですが、この種のテストはRailsのデフォルト機能として早く実装してほしいと、ずっと望まれていたように思います。私はRailsチームがシステムテストをシンプルに設定でき、なおかつシンプルに書けるように頑張ってくれたことに大変感謝しています(私のように、Railsアプリケーションのテストの書き方を教えている人にとっては、ちょっと仕事が増えてしまいますが!)。

ご存じかもしれませんが、RailsはデフォルトのテスティングフレームワークとしてMinitestを採用しています。しかし、RSpec 3.7を使えば、Rails 5.1のアプリケーションに対してシステムスペック(system spec)をテストスイートに追加できます 。RSpec 3.7は5.1より古いバージョンのRailsでも動きますが、その場合は統合テストとしてフィーチャスペックを使い続ける必要があります。もしかすると、みなさんはRails 5.1のシステムテストで提供されている機能のいくつかを使いたいと思うかもしれません。ですが、後述するような代替案も存在します。

アップグレード方法

私はこの手順の各ステップをそれぞれ独立したコミットにしています。よかったら、このコミットを見ながら進めてください。このアップグレードの準備を進めている際、私は jquery-railsrspec-rails が、お互いの依存関係からコンフリクトする問題に遭遇しました。そのため、このチュートリアルを執筆する目的で、私はRailsのパッチバージョンをアップグレードしています。

RSpecをアップグレードする前に既存のスペックを実行し、全てのスペックが期待どおりパスすることを確認してください。しばらくさわっていないプロジェクトの場合、この手順はとくに重要です。テストスイートが全てパスしたら、プロジェクト内の Gemfile に書かれたgemのバージョンをアップグレードします。

group :development, :test do
  gem 'rspec-rails', '~> 3.7.2'
  # 他のgemが並ぶ ...
end

bundle update rspec-rails を実行すると、インストールが完了します。場合によっては、ここで作業を止めることもできます。フィーチャスペックはRSpec 3.7でも動かすことができますし、しばらくはこれまで通り使い続けられるはずです。しかし、本書のテストスイートは積極的に新しくしていきたいので、既存のフィーチャスペックをシステムスペックに移行していきましょう。

最初は spec/support/capybara.rb にある、テストドライバの設定変更をお勧めします。ブラウザを使った基本的なテストでは高速な Rack::Test ドライバを使い、より複雑なブラウザ操作が必要な場合はJavaScriptが実行可能なドライバ(私はヘッドレスChromeを使うのが好きです)を使うように設定します。ファイルの内容を次のように変更してください。

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :selenium_chrome_headless
  end
end

driven_by の設定はテストごとに変更することもできます。ですが、私は可能な限りシステム全体の共通設定とします。

では、既存のフィーチャスペックを新しいシステムスペックの構造と構文に移行していきましょう。必要な変更は以下のとおりです。

  • spec/featuresspec/system にリネームします。(diff
  • 各ステップのtypeを type: :system にします。(diff
  • RSpec.feature の代わりに、システムスペックを定義する RSpec.describe を使います。(diff
  • フィーチャスペックで使っていた scenario エイリアスを、標準的な it 構文に置き換えます(この変更は任意のようです)。(diff

以上です!スペックは以前と同様にパスします。さらにこのあと、新しい統合テストを今回作成した spec/system ディレクトリに追加していくこともできます。

新しいシステムスペックを作成する

バージョン3.7.2の時点では、rspec-rails はシステムスペックを作成するジェネレータを提供していません。ですが、私がこの記事を執筆している時点で、すでにプルリクエストが進行中です。ジェネレータが提供されるまでの間は、次のような定型コードを使用して手作業で新しいスペックファイルを spec/system ディレクトリに追加する必要があります。

require 'rails_helper'

RSpec.system "Test name", type: :system do
  it "does something" do
    # ... your test
  end
end

スクリーンショット

私たちがCapybaraを使い始めたときから、ブラウザベースのテストでは save_screenshot メソッドを使って、実行中のテストのスクリーンショットを保存することができました。Rails 5.1とRSpec 3.7では代わりに take_screenshot メソッドを使い、テスト内のあらゆる場所でシミュレート中のブラウザの画像を作成することができます。画像ファイルはデフォルトで tmp/screenshots に保存されます。また、テストが失敗したら、自動的にスクリーンショットが保存されます!この機能はヘッドレスブラウザで実行している統合テストをデバッグするのに大変便利です。

Rails 5.1を使っていない場合は、同じような機能を capybara-screenshot gemを使って実現できます。多少のセットアップは必要になりますが、このgemはRails 5.1がデフォルトで提供している機能よりも、さらに充実した機能を備えています。

Database Cleaner

本書のRails 5.1版では、Database Cleanerの説明を削除しました。なぜなら、これがなくてもサンプルアプリケーションのテストが動くようになったからです。しかし、以前のバージョンのRailsとRSpecからアップグレードした場合、みなさんはテスト間でデータベースの状態が予期せず共有されてしまわないよう、このツールを使い続けているかもしれません。Rails 5.1ではDatabase Cleanerはもう必要ありません。少なくとも、私の経験と私がこれまでに読んだ情報の上では不要になっています。もしみなさんが例外的な状況に遭遇したら、ぜひコメントを残して教えてください(訳注:日本語のフィードバックはこちらにお願いします)。

さらに前進する

RSpecのドキュメントではフィーチャスペックよりもシステムスペックを使うように推奨しています。この方針は合理的なものだと感じます。少なくとも、実際に私が既存のフィーチャスペックを新しいシステムテストに移行した経験上、そう思います。私は、みなさんが他のタスクよりも優先度を上げてこの変更に取り組む必要があるとは思いません。ですが、もし時間があればやってみてください。私はこの新機能を隅から隅まで試したわけではありませんが、これはあなたにとってCapybara gemをアップデートするいい機会にもなるかもしれません。特に、エラーや非推奨の警告(deprecation warning)に遭遇した場合は、きっとアップデートが必要になるでしょう。

みなさんが自分のRailsアプリケーションをシステムスペックに移行した際に経験したことをぜひ聞かせてください。ポジティブな話でもネガティブな話でも結構です。コメント欄はこの下にあります(訳注:英語版ブログの話です)。みなさん、いつも読んでくれてありがとうございます!

参考文献

(翻訳ここまで)

まとめ

というわけで、このエントリではEveryday Railsの原著者であるAaronさんのブログ記事を翻訳してみました。 システムスペックを導入してみたいと考えている方はぜひ参考にしてみてください。

Everyday Railsは今後もできるかぎり最新のRailsとRSpecに追従していきますので、引き続き「Everyday Rails - RSpecによるRailsテスト入門」よろしくお願いします!

Everyday Rails - RSpecによるRailsテスト入門 | Leanpub f:id:JunichiIto:20180219082935p:plain

「Everyday Railsって何?」「いったいどんな本?」と思われている方は以下のブログ記事をご覧ください。

Rubyプログラマが一番よく使うテスティングフレームワークはRSpecのようです(2018年3月調べ)

はじめに

先日Qiitaでこんな記事を拝見しました。

この記事の中に以下のような記述がありました。

RSpecとは

Ruby用のテスティングフレームワーク。
Ruby on railsには標準でminitestが搭載されているが、より多く使われているのはRSpec(主観)

最後に書いてある「主観」がちょっと気になりますね。
僕もたしかにそんな気がするのですが、僕の考えもやっぱり主観でしかありません。

そこで、Twitterを使ってアンケートを採ってみることにしました。

「一番よく使っているテスティングフレームワークはどれですか?」というアンケートです。

さあ、そのアンケート結果がどうなったかというと・・・

結果はRSpecが77%で(やっぱり)1位!

投票結果は以下のとおりで、RSpecが1位(77%)となりました(主観どおりでしたね)。

続いて、minitestが2位(14%)、test-unitが3位(6%)となっています。

投票数は322票と、まあまあ集まったので、それなりに信頼できる数値なんじゃないかと思います。

回答してくれたのはおそらく日本人が多いと思うのですが、できたら投票した人の国の分布も見たかったですね。
もしかすると「日本では特にRSpecの利用者が多い」みたいな分布になっているかもしれません。

各フレームワークに対する個人的な感想

ところで、参考までに、アンケートの選択肢に上げた各フレームワークについて、個人的な感想をつらつらと書いてみます(あくまで個人の感想です)。

RSpecについて

僕も一番よく使うのはRSpecです。
特に、仕事で書くテストコードはほぼRSpecですね。

RSpecを使う理由は「最初からいろんな機能が全部入ってて便利だから」です。
ちょっとテストコードのここだけを共通化したい、とか、モックで少し凝ったことをやりたい、みたいなときにRSpecの標準機能でほぼ完結するのが便利だな~と感じています。

ネット等では「構文が嫌い」という意見をよく見かけますが、僕自身は特にRSpecの構文が嫌だと思ったことはありません。

minitestについて

次によく使うのはminitestです。
minitestはごくごく簡単なRubyプログラムの動作確認をしたりするときに使います。
デフォルトでRubyにインストールされるので、すぐに使えて便利です。
そうそう、僕が執筆した「プロを目指す人のためのRuby入門」で使っているのもminitestですね。

ただ、RSpec並みに凝ったことをやろうとすると、プラグインをたくさん入れたり、継承やらモジュールやらを駆使したりすることになるので、業務レベルのテストコードではminitestは使いません(僕の場合は)。

test-unitについて

test-unitはあまり使うことがないですねえ。残念ながら。。
「test-unitもデフォルトでRubyにインストールされる、minitestみたいにシンプルに書ける、なおかつminitest以上にデフォルト機能は豊富」という特徴はあるのですが、Railsの標準テスティングフレームワークがminitestだったり、機能豊富といってもRSpecの方がさらに上だったりするので、わざわざtest-unitを選択する動機がなかったりします。

あと、ドキュメントやネットの情報の少なさも気になります。
使い方を調べるのに毎回コードを見に行くというのも、ちょっと億劫に感じます(もちろん、コードを読むことは大事ですが)。

注意:アンケート結果=テスティングフレームワークの優劣ではない

テスティングフレームワークについては、どれが良くて、どれが悪い、という話ではなく、あくまで「適材適所」の話だと思っています。
僕の場合はそのときどきのニーズに応じて、RSpecとminitestを使い分けています。

ですので、このアンケート結果は別にフレームワークの優劣を示しているわけではない、という点に注意してください。

まとめ

というわけで、この記事ではTwitter上で実施した「Rubyのテスティングフレームワーク・アンケート」の結果を紹介しました。
他のRubyプログラマがどんなテスティングフレームワークを使っているのか、気になっている人の参考になれば幸いです。

あわせて読みたい

過去に書いたRSpecとminitestの比較記事です。

PR:Rails 5対応版のEveryday Railsが発売中です!

僕が翻訳している電子書籍「Everyday Rails - RSpecによるRailsテスト入門」が、先日Rails 5に対応しました。
「RSpecでRailsのテストコードが書けるようになりたい!」という人はぜひ読んでみてください。

本書の詳細については、こちらのブログエントリで紹介しています。

そこまで熱烈なファンというわけではないけど、CHEMISTRYのライブに行ってみたら

昨日、妻と一緒にCHEMISTRYのライブに行ってきました。

「へ~、ライブに行くぐらいCHEMISTRYが好きなんだ」って思われるかもしれませんが、実は熱狂的なファンというわけではありません。
僕も妻も知ってるのはシングル曲ばかり、しかも初期のシングル曲ばかりで最近の曲はほとんどわかりません。

ただ、車の中や家の中でBGMとしてかける機会が多く、妻も僕も「(他の曲はよく知らんけど)よく聴く曲は大好き」なので、試しに一度ライブに行ってみようと思い、チケットを購入しました。

・・・が、チケットを買ったのが半年前の8月で、かなり日が空いたために若干熱が冷めてしまい、「あー、そういえば今日がライブの日かあ。まあ、チケット買ったし、もったいないから行くか」というかなり低いテンションで会場に向かいました。
僕も妻もこんな低いテンションでライブに足を運ぶのは初めてです(ファンのみなさん、すいません💦)。

で、感想はだったかというと・・・、

すごかった!感動した!!行って良かった!!!

いやあ、あの二人、めちゃくちゃ歌がうまい。
もちろん、プロだから当たり前と言えば当たり前なんですが、たまに「あれ、CDの方がなんかうまい・・・」みたいなアーティストもいるじゃないですか。
でも彼らは完璧だった。
いや、むしろ、CDよりも迫力があって熱がこもってて、CDで聴くよりもずっと良かった。

そして二人のハモりも完璧。
めっちゃ気持ちいい。

すごい声量だし、あんなにいっぱい歌ったら最後の方は声が枯れるんじゃないかと思うけど、最後まで安定した歌唱力でした。
いったいどんなトレーニングしたら2時間半も完璧に歌い続けられるんだ・・・。

あと、CDで聴くと、どっちの声がどっちがわからなかったけど、ライブで聴くとどっちが歌っているのが明らかなので、声の聞き分けができるようになりました。
少し太くて男らしさを感じる方が川畑さん。
少し細くて若干甲高さを感じさせる方が堂珍さん。
はい、覚えました。
まだわからないときがたまにあるけどw

MCも「近所のお兄ちゃん」っぽい気さくな感じで、それはそれですごく親しみやすさを覚えました。
特に堂珍さんのトークが少し天然っぽい感じで面白かったです。

ボーカルの二人だけでなく、バックバンドの演奏もタイトですごく良かった。
ライブに行く前は「もしかしてライブはカラオケ?」とか思ったけど、ちゃんとバンドが生演奏してました。
僕は楽器を弾く人なので、歌だけでなく演奏の方にもしっかり耳を傾けるんですが、みんな上手かった(当たり前か)。
あー、僕もあれぐらい弾けるようになりたい・・・。

冒頭でも書いたように基本的に初期のシングル曲しか知らない人なので、知らない曲もたしかに多かったですが、有名どころのシングル曲はちゃんと全部歌ってくれたし、歌と演奏が素晴らしいので知らない曲も普通に楽しめました。
MCでも「初めて来た人も楽しめるように、いろんな曲を歌います」と語ってくれて、僕らのようなライトなファン(?)のこともちゃんと考えてくれているのが嬉しかったですね。

ライブの評価は結構辛口な僕の妻も「めっちゃ良かった!!」と、むしろ僕以上に感動していました。
今日は大阪でライブをやっているので、今日も見に行きたいそうです(笑)。

というわけで、そこまで熱烈なファンでなくても、CHEMISTRYのライブはすごく楽しめるということがわかりました。
生の演奏と生の歌声の方がCDよりも圧倒的に素晴らしいので、(熱烈なファンでない)みなさんも機会があれば行ってみてください!

参考: CHEMISTRY @ たつの市総合文化会館 赤とんぼ文化ホール 大ホール (兵庫県) (2018.03.03) | ライブ・セットリスト情報サービス【 LiveFans (ライブファンズ) 】

CHEMISTRY TOUR 2012-Trinity-(初回生産限定盤)(DVD付)

CHEMISTRY TOUR 2012-Trinity-(初回生産限定盤)(DVD付)