give IT a try

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

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付)

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です
  • 統合スペックを最初に書こうとしてください
  • テストをする時間を作ってください
  • 常にシンプルにしてください
  • 古い習慣に戻らないでください!
  • テストを使ってコードを改善してください
  • 自動テストのメリットを周りの人たちに売り込んでください
  • 練習し続けてください
  • それではさようなら