give IT a try

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

【書評】RSpecの初心者から上級者まで役立つ!「Effective Testing with RSpec 3」を読みました

はじめに

数ヶ月前、RSpecコミッタのYuji Nakayamaさん(@nkym37)から突然連絡がきて、「リードメンテナのMyron Marstonが今度RSpecの本を出版するんだけど、Myronが日本人のレビュアーを探している。なので伊藤さん、レビュー記事を書いてみない?」というお話を受けました。
「はい、興味あります!書きます!!」ということで、二つ返事でオファーを受けることにしました😄

というわけで、今回読んだのがこちらの「Effective Testing with RSpec 3」です。

Effective Testing With Rspec 3: Build Ruby Apps With Confidence

Effective Testing With Rspec 3: Build Ruby Apps With Confidence

このエントリではこの本の概要と僕個人の感想をいろいろ書いてみます。
(本を提供してくれたMyron Marstonさん、どうもありがとうございます!日々進めてくれているRSpecの開発にも感謝します!)

f:id:JunichiIto:20170910205234j:plain
僕はEPUB版をiPadに入れて読みました。

本の構成

本書は5つのパート、15の章に分かれています。
対象となるRSpecのバージョンは3.6です(2017年9月時点での最新バージョン)。

以下に各パートの概要を述べていきます。

パート1 「さあはじめよう」

簡単なRubyプログラムをRSpecでテストしながら、RSpecの基本を学ぶパートです。
3章ではテストの種類や良いテストや悪いテストについて説明しています。

  • 1章 RSpecをはじめよう
  • 2章 Specを書いて実行する
  • 3章 RSpec Wayとは
パート2 「RSpecでアプリを作る」

SinatraとSequelで簡単なWeb APIを開発し、それをいろいろなレベルごとにテストするパートです。
パート1よりもさらに実践的なテクニックが学べます。

  • 4章 外側から作る: 受け入れスペック(Acceptance Specs)
  • 5章 個別にテストする: ユニットスペック(Unit Specs)
  • 6章 実物に近づける: 統合スペック(Integration Specs)
パート3 「RSpec Coreについて詳しく」

it/example/specify、describe/context、before/afterフック、メタデータ、spec_helper.rbの設定など、RSpecに用意されている各種機能を掘り下げて説明するパートです。

  • 7章 exampleの構築と整理
  • 8章 メタデータでスペックをさらに便利に
  • 9章 RSpecを設定する
パート4 「RSpec Expectationsについて詳しく」

エクスペクテーションが動作する仕組みやデフォルトで用意されているマッチャの仕様、独自のマッチャの作成など、データを検証するための機能やテクニックを詳しく解説するパートです。

  • 10章 RSpecのエクスペクテーションを詳しく知る
  • 11章 RSpec Expecationsに含まれるマッチャ
  • 12章 カスタムマッチャを作成する
パート5 「RSpec Mocksについて詳しく」

単にモックの使い方を説明するだけでなく、モックやスタブの違い、モックの正しい使い方なんかも詳しく説明してくれるパートです。

  • 13章 テストダブルを理解する
  • 14章 テストダブルをカスタマイズする
  • 15章 効果的にテストダブルを使用する

全体的な感想

僕個人の感想としては非常に良かったです!いや、ほんとに。お世辞抜きで。
さすがRSpecのリードメンテナが執筆に携わっているだけあって、すごく詳細にRSpecの機能が紹介されています。
RSpecにはそれなりに詳しい僕でも知らない機能がいくつかありました。

また、機能を説明する際のユースケースやサンプルコードもかなり実践的なものが多かったです。
本を読みながら「うん、たしかにそういうケースはよくある!」と大きくうなずけるポイントが多数ありました。
なので、本で学んだ内容の多くはすぐに実務のテストコードで適用できるはずです。
僕も早速この本で知った"filter_run_excluding"を使います!

さらに、この本が説明するのはRSpecの機能だけではありません。
どんなテストコードが良くて、どんなテストコードが悪いのか、という「効果的(effective)なテストコードの書き方」についても説明してくれています。
僕の周りでも「どんなテストを書けばいいのかわからない」という声はよく聞くので、そういう人たちには打ってつけの内容になっています。
(「何をテストしないか、を検討すべし」とか、初心者の人はあまり考えたことがないのでは?)

もちろん、高度な内容だけでなく、最初のパートではRSpecの基本から説明してくれるので、RSpecをまったく知らない初心者も付いていけるようにちゃんと配慮されています。
RSpecの設計思想なども要所要所で語られているので、「RSpecは難しくて嫌い」と言っている人たちもこの本を読むとRSpecに対する考え方が少し変わるかもしれません。

というわけで、RSpecの初心者でも上級者でもすごくためになりますし、RSpecに限定されない「テストコードのベストプラクティス」や「モックの使用ガイドライン」まで説明されているところも素晴らしいと思いました。

細かい部分の感想など

パート2ではRailsではなく、あえてSinatraとSequelを使っているところが興味深かったです。
Railsを使わないのは「Railsは機能が多すぎるのと、ジェネレータがあるためにテストのセットアップ手順の勉強にならないから」ということでした。

最初は「えー、なんでRailsじゃないの?」と思ったのですが、普段あまり使わないSinatraとSequelの使い方がわかって、思わぬところで勉強になりました。
というか、いかに普段Railsのおかげで自分たちが楽をしているか(悪く言えば、いかに甘やかされているのか)ということを痛感しました。

ちなみに、本書の最後に出てくる付録パートで、rspec-railsの基本はさらっと説明されています。

あと、本文を読みながら思ったのは「RSpecってやっぱり、英語として読めるテストコードを強く意識してるんだなあ」ということです。
もちろん、ある程度までは「英語として読めるテストコード」は僕たち日本人にとっても嬉しいのですが、行きすぎるとそのこだわりがいまいちピンと来ないところが出てきます。

たとえば、本文の中で、

expect([]).to start_with( be_within(0.1).of(Math::PI) )

と書くよりも、

expect([]).to start_with( a_value_within(0.1).of(Math::PI) )

って書けた方が英語として読みやすいでしょ?という説明がありました。
ですが、日本人の僕からすると、「え?ああ、そう言われてみれば、そう・・・かな??🤔」と思ってしまいました。
この点はRSpecを読み書きする上で、英語ネイティブの人と非英語ネイティブの人の壁を少し感じる部分ですね。

本文の英語は平易で読みやすい

さて、この本はまだ翻訳されていないので英語で読む必要があります。
普段洋書を読まない人は「洋書なんて無理無理!!」と思うかもしれませんが、本書の英語は全体的に平易で読みやすいです。
コードも多いので、コードと一緒に英語を読めば、だいたい意味はつかめるんじゃないでしょうか。

洋書を読む上で必要なのは、

  • 「この技術が知りたい!」という強いモチベーション
  • 全部理解しようとせず、わかりにくいところがあっても立ち止まらずに読み進める勢い

の2つです。
これがあればなんとか読破できると思います。

公式サイトで販売している電子書籍版であれば、思い立ったときにすぐ手に入れることができるので、勇気を出して購入してみてください!

まとめ

というわけでこのエントリでは、先日発売された「Effective Testing with RSpec 3」の書評を書いてみました。

RSpecそのものにフォーカスした技術書といえば、これまで「The RSpec Book」しか選択肢がありませんでした。

The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)

  • 作者: David Chelimsky,Dave Astels,Zach Dennis,角谷 信太郎,豊田 祐司,株式会社クイープ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/02/22
  • メディア: 大型本
  • 購入: 7人 クリック: 141回
  • この商品を含むブログ (19件) を見る

「The RSpec Book」もRSpecを学ぶ上では非常に良かったのですが、バージョンが古いのと、RSpec以外のテストフレームワーク(Cucumber)が占める割合が高い点がちょっと残念でした。

今回登場した「Effective Testing with RSpec 3」は、今までの定番だった「The RSpec Book」を見事にリプレースする出来になっていると思います。
「今風のRSpecの書き方を体系的に学びたい」という人にとっては最適な一冊になっているので、ぜひ一度読んでみてください。

Effective Testing With Rspec 3: Build Ruby Apps With Confidence

Effective Testing With Rspec 3: Build Ruby Apps With Confidence

最後に宣伝: 「プロを目指す人のためのRuby入門」もよろしくお願いします🙇

このブログでも何度か紹介していますが、僕も現在本を書いているところです。
「プロを目指す人のためのRuby入門」というRubyの入門書で、「Effective Testing with RSpec 3」に負けないぐらい実践的な内容を書いたつもりです。
2017年11月に発売予定ですので、こちらもぜひよろしくお願いします!
blog.jnito.com

あわせて読みたい

伊藤さんはいつもどんなふうに洋書を読んでるの?という質問を受けたので、それに対する回答をつらつらと書いてみました。
blog.jnito.com