give IT a try

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

Rails 5.1とRSpec 3.6に対応した「Everyday Rails - RSpecによるRailsテスト入門」をリリースしました

お待たせしました!
ついに「Everyday Rails - RSpecによるRailsテスト入門」(以下Everyday Rails)の改訂版をリリースしました。
すでに日本語版Everyday Railsを購入されている方は、Leanpubのサイトにログインして最新版の電子書籍ファイルを無料でダウンロードすることができます。

このエントリでは今回アップデートされたEveryday Railsの内容を紹介します。
また、価格改定の予告も含まれているので、まだ購入されていない方はそちらもご一読ください。

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

改訂版の3大変更点

変更点その1:Rails 5.1 + RSpec 3.6に対応

これまではRails 4.2 + RSpec 3.1を対象にしていましたが、改訂版ではRails 5.1 + RSpec 3.6が対象になっています。

移り変わりの速いRailsの世界では最新のgemに追従しないとあっという間に情報が古くなってしまうので、アップデートを心待ちにしていた方も多いと思います。
これでもう安心ですね😄

ちなみに現時点のRSpecの最新版は3.7なので、少しだけ古くなっています。
ですが、RSpec 3.7で導入されたシステムスペック(System Spec)については原著者のAaronさんがご自身のブログ記事でサポート情報を載せてくれています。
こちらの記事も後日翻訳して、このブログに載せる予定です。

2018.3.12追記:ブログ記事を翻訳しました!

上記のブログ記事を翻訳しました。
フィーチャスペックからシステムスペックへ移行する手順については、こちらの記事をご覧ください。

変更点その2:サンプルアプリケーションの変更

これまでは顧客管理アプリケーションがサンプルアプリケーションになっていましたが、改訂版ではプロジェクト管理アプリケーションに変わっています。

従来の顧客管理アプリケーションと同様、プロジェクト管理アプリケーションも非常にシンプルなRailsアプリケーションですが、ファイルのアップロードやJavaScriptを使った更新機能など、実践的なテストコードを書くための機能が用意されています。

f:id:JunichiIto:20180219061017p:plain
プロジェクト管理アプリケーションのスクリーンショット

参考:サンプルアプリケーションのソースコード

ソースコードはGitHubで公開されているので、自分のローカル環境で動かすことができます。

ちなみに、このアプリケーションで"bundle install"を実行すると以下のようなエラーが出るかもしれません。

$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching https://github.com/thoughtbot/shoulda-matchers.git
fatal: Could not parse object '0b2e0da6035b9c45b0430bc6eb9a8bab4aeba50e'.
Git error: command `git reset --hard 0b2e0da6035b9c45b0430bc6eb9a8bab4aeba50e` in directory
/Users/jit/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/bundler/gems/shoulda-matchers-0b2e0da6035b has failed.
If this error persists you could try removing the cache directory
'/Users/jit/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/cache/bundler/git/shoulda-matchers-e04e9ade87805b3667f97d976fd84556605e66f8'

このエラーが出たら以下のコマンドを実行して、shoulda-matchersをアップデートしてください。

$ bundle update shoulda-matchers
変更点その3:本文の大規模なリライト

RailsとRSpecの対象バージョンが変わり、さらにサンプルアプリケーションも変更されたので、当然本文も大きく変わってきます。
それだけでなく、以下のような変更点も本文に反映されています。

  • 使用する周辺gem/ライブラリのアップデート
    • 例:ヘッドレスChromeの使用
  • 昨今のトレンドの反映
    • 例:コントローラスペックよりもフィーチャスペックやリクエストスペックを重視する
  • 著者(Aaronさん)が最近よく使うツールやテクニック
    • 例:FactoryGirl/FactoryBotのトレイト(trait)

その結果、本文の内容は7~8割リライトされています。
なので、これはほとんど新しい本と言っても過言ではありません!

前半は従来の文面を再利用した箇所が比較的多いですが、後半に進むにつれ、新しいトピックがどんどん増えてきます。
以前の版には載っていなかったテクニックもたくさん登場するので、ぜひ一通り読んでみてください!

なお、このエントリの最後に改訂版のもくじを載せているので、興味がある方はそちらも参考にどうぞ。

アップデート手順

すでにEveryday Railsを持っている方は以下の手順でアップデートできます。
(もちろん無料です!)

  1. Leanpubにログインする
  2. ライブラリページに移動する
  3. 購入済みの書籍一覧からEveryday Railsを選択する
  4. "Download this book"欄から電子書籍ファイルをダウンロードする

f:id:JunichiIto:20180219063302p:plain
注:これは英語版Everyday Railsをダウンロードする画面です

さらに:3月中にもう一度アップデートする予定です

改訂版の翻訳は一通り完了していますが、2018年3月中にもう一度アップデートする予定です。
ただし、次のアップデートでは翻訳の品質向上や誤字脱字の修正(もしあれば)など、日本語のブラッシュアップが中心になります。

内容自体は変わりませんし、現時点でも普通に読む上では問題がないため、それほど気にしなくても大丈夫です。
(改訂版は複数のエンジニアにレビューしてもらい、報告されたフィードバックは一通り対応しています!)


さて、ここまではEveryday Railsをすでに持っている方に向けた情報を書いてきましたが、このエントリを読んでいる人の中にはEveryday Railsをまだ知らない方もいるかもしれません。
そこで以下では、Everyday Railsを知らない方や、まだ持っていない方に向けた情報を書いていきます。

そもそもEveryday Railsって何?

Everyday RailsはRSpecでRailsアプリケーションをテストする方法を紹介した電子書籍です。
「RSpecをまったく使ったことがない」「テストコードを書け、とはよく言われるけど、何から手を付けていいかわからない」といった、初心者さんのために、易しく・詳しくテストの書き方を説明します。

原著者はAaron Sumner氏(@ruralocity)で、日本語版の翻訳チームは僕・伊藤淳一と、Akiさん(@spring_aki)、魚振江さん(@blueplanet42)の3名です。

必要な前提知識

RSpecの入門書なので、RSpecの使い方は丁寧に説明していますが、Railsの仕組みやRubyの文法はある程度理解している前提で書かれています。
「RailsやRubyもまだまだ初心者」という場合は、「Railsチュートリアル」や拙著「プロを目指す人のためのRuby入門」を先に読んでおくと良いかもしれません。

どこで売ってるの?

Everyday RailsはLeanpubという電子書籍販売サイトでのみ購入可能です。
町の本屋さんやAmazonでは販売していないのでご注意ください。

Everyday Rails - RSpecによるRailsテスト入門 | Leanpub

電子書籍の対応フォーマットは?

提供される電子書籍ファイルのフォーマットは以下の3種類です。

  • EPUB(MacやiPhoneのiBooks、および一般的な電子書籍リーダー用)
  • MOBI(Kindle用)
  • PDF

1冊購入すれば、どのフォーマットもダウンロード可能です。
またDRMフリーなので、手持ちのパソコンやスマホなど、複数の端末に保存して読むことができます。

f:id:JunichiIto:20180221045634p:plain
EPUBファイルをMacのiBooksで開くとこんな感じです

試し読みはできますか?

はい、できます。
購入ページにサンプルページへのリンクがあるので、ここから1章と3章を試し読みすることができます。

f:id:JunichiIto:20180220043711p:plain

【予告】次回アップデート時(3月)に価格を改定します

これまで日本語版Everyday Railsは最低価格16ドル(約1700円)、希望価格20ドル(約2100円)で販売してきましたが、この価格を見直し、次のように改定します。

改定後の販売価格
ライセンス数 最低価格 希望価格
パーソナル 1 $19.00 $23.00
スモールチームパッケージ 3 $51.00 $69.00
ラージチームパッケージ 10 $150.00 $230.00

価格改定のスケジュール

販売価格はすぐには変更しません。
上に書いた、2018年3月の次回アップデート時に新しい価格を適用する予定です(具体的な日付は未定)。

ですので、それまでであれば今の価格でお買い求めいただけます。
もちろん、一度購入すれば今後も無料でアップデート可能です!
(すでに購入済みの方も、この価格改定による影響はまったくありません)

2018.3.31追記:価格改定を適用しました

2018年3月31日に本書をアップデートし、同時に価格改定を適用しました。

価格改定の理由

価格改定の理由の一つは、改訂版の翻訳作業に思った以上の工数がかかったことです。
前述の通り、改訂版は「ほとんど新しい本」になっているので、この工数分を新しい価格に反映させてもらいました。

もう一つの理由は、「本書の内容は価格に見合うだけの価値が十分ある」と自信をもって言えるようになったためです。
日本語版は初版のリリースから4年が経過し、開発の現場におけるRSpecの定番の教科書となりました。
この改訂版も「それだけの金額を払った価値はある」と思っていただける内容になっているはずです!

ところで最低価格と希望価格って何?

Leanpubでは購入者が購入価格を変更できる、ユニークな仕組みを取り入れています。
制作者が妥当と考える価格が希望価格で、購入者が選択できる一番低い価格が最低価格です。

購入価格は購入ページのスライダーで変更できます。
(スライダーを右に移動させると希望価格以上の価格で購入することもできます!)

f:id:JunichiIto:20180219150435p:plain

なお、誰がいくらで購入したのかは制作者には分からないようになっているのでご安心ください😅

チームパッケージって何?

上の販売価格表に出てきた「スモールチームパッケージ」と「ラージチームパッケージ」は、複数のユーザーでまとめ買いする際に割安で購入できるオプションです。
職場でEveryday Railsを共通のリファレンスとして購入したりする場合にご利用ください。

チームパッケージの詳細や、ライセンスの考え方については以下の記事で詳しく説明しています。


改訂版をレビューしてくれた木原さんの感想

最後に、僕の同僚で改訂版をレビューをしてくれた木原忠大さんの感想を載せて、このエントリを締めくくります。

本書はRSpecをよく知らない頃に一度読んでいて、当時、書き方がわからなかった初心者の自分にはとても役に立った覚えがあります。


現在では、私もある程度RSpecを使いこなせるようになっています。
ですが、今回の新版を改めて読んでみると、いつのまにか知らない機能が増えていて、RSpec経験者にも役に立つことがたくさんありました。


また、テストを読みやすく書いているか?テストの速度を意識して書いているか?など、自分のRSpecの書き方を見直すきっかけにもなりました。


本書はRSpecの初心者と経験者のどちらにもおすすめです!

まとめ

というわけで、このエントリではRails 5.1とRSpec 3.6に対応した「Everyday Rails - RSpecによるRailsテスト入門」について紹介しました。

本当に長い間お待たせして申し訳ありませんでした。
ですが、改訂版は翻訳者として「この内容なら自信をもってお勧めできる!」という内容になっています。

すでに購入された方も、まだ購入されていない方も、新しくなったEveryday Railsをぜひチェックしてみてください!😉

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

改訂版のもくじ

改訂版Everyday Railsのもくじは以下のとおりです。
興味がある方は参考にしてみてください。
(長くなるので最後に載せました)

1. イントロダクション

  • なぜRSpecなのか?
  • 対象となる読者
  • 私が考えるテストの原則
  • 本書の構成
  • サンプルコードのダウンロード
  • コードの方針
  • 間違いを見つけた場合
  • gemのバージョンに関する注意点
  • サンプルアプリケーションについて


2. RSpecのセットアップ

  • Gemfile
  • テストデータベース
  • RSpecの設定
  • rspec binstubを使ってテストスイートの起動時間を速くする
  • 試してみよう!
  • ジェネレータ
  • まとめ
  • Q&A
  • 演習問題


3. モデルスペック

  • モデルスペックの構造
  • モデルスペックを作成する
  • RSpecの構文
  • バリデーションをテストする
  • インスタンスメソッドをテストする
  • クラスメソッドとスコープをテストする
  • 失敗をテストする
  • マッチャについてもっと詳しく
  • describe、context、before、afterを使ってスペックをDRYにする
  • まとめ
  • Q&A
  • 演習問題


4. 意味のあるテストデータの作成

  • ファクトリ対フィクスチャ
  • Factory Girlをインストールする
  • アプリケーションにファクトリを追加する
  • シーケンスを使ってユニークなデータを生成する
  • ファクトリで関連を扱う
  • ファクトリ内の重複をなくす
  • コールバック
  • ファクトリを安全に使うには
  • まとめ
  • 演習問題


5. コントローラスペック

  • コントローラスペックの基本
  • 認証が必要なコントローラスペック
  • ユーザー入力をテストする
  • ユーザー入力のエラーをテストする
  • HTML以外の出力を扱う
  • まとめ
  • Q&A
  • 演習問題


6. フィーチャスペックでUIをテストする

  • なぜフィーチャスペックなのか?
  • インストールが必要なgem
  • フィーチャスペックの基本
  • CapybaraのDSL
  • フィーチャスペックをデバッグする
  • JavaScriptを使った操作をテストする
  • ヘッドレスドライバを使う
  • JavaScriptの完了を待つ
  • まとめ
  • 演習問題


7. リクエストスペックでAPIをテストする

  • リクエストスペックとフィーチャスペックの比較
  • GETリクエストをテストする
  • POSTリクエストをテストする
  • コントローラスペックをリクエストスペックで置き換える
  • まとめ
  • 演習問題


8. スペックをDRYに保つ

  • サポートモジュール
  • let で遅延読み込みする
  • shared_context (contextの共有)
  • カスタムマッチャ
  • aggregate_failures (失敗の集約)
  • テストの可読性を改善する
  • まとめ
  • 演習問題


9. 速くテストを書き、速いテストを書く

  • RSpecの簡潔な構文
  • エディタのショートカット
  • モックとスタブ
  • タグ
  • 不要なテストを削除する
  • テストを並列に実行する
  • Railsを取り外す
  • まとめ
  • 演習問題


10. その他のテスト

  • ファイルアップロードのテスト
  • バックグラウンドワーカーのテスト
  • メール送信をテストする
  • Webサービスをテストする
  • まとめ
  • 演習問題


11. テスト駆動開発に向けて

  • フィーチャを定義する
  • レッドからグリーンへ
  • 外から中へ進む(Going outside-in)
  • レッド・グリーン・リファクタのサイクル
  • まとめ
  • 演習問題


12. 最後のアドバイス

  • 小さなテストで練習してください
  • 自分がやっていることを意識してください
  • 短いスパイクを書くのはOKです
  • 小さくコードを書き、小さくテストするのもOKです
  • 統合スペックを最初に書こうとしてください
  • テストをする時間を作ってください
  • 常にシンプルにしてください
  • 古い習慣に戻らないでください!
  • テストを使ってコードを改善してください
  • 自動テストのメリットを周りの人たちに売り込んでください
  • 練習し続けてください
  • それではさようなら