Ruby on Railsのテストフレームワーク、RSpec(アールスペック)の効率的な勉強法を紹介します。
本記事はターゲットは下記の通り。
アプリケーション開発において、重要なのが確実にアプリケーションが動くことです。
とはいえ、小さなアプリケーションならば実際にクリックしてアプリケーションの動きを確認しても良いですが、アプリケーションが大きくなり機能が増えるたびにそうした手作業による確認を行うのは不可能に近いです。
そこで必要になるのが、テストコードの記載です。擬似的にアプリケーションを動かし、テストをすることができるのです。
実務でもほぼ確実に導入する必要がある技術のため、転職を目指す身としては必須スキルと考えています。
今回はRuby on RailsによるテストフレームワークのRSpecをゼロから学びオリジナルアプリケーションに実装することができたので、そこでえられた効率的な勉強法の知見をご紹介します。
RSpecの勉強法4つのステップ
RSpecの勉強は下記の4ステップが必要となります。
・インプット(メイン):書籍『Everyday Rails』
・アウトプット:オリジナルサービスに反映
・インプット(補助1):GitHub
・インプット(補助2):Qiita
それでは詳しく見ていきましょう。
インプット(メイン):書籍『Everyday Rails』
書籍『Everyday Rails』をメインのインプットに。
『Everyday Rails – RSpecによるRailsテスト入門」』
本書では「テストコードの書き方」を学びます。
初心者には少々複雑な(スケジュール管理など)タスクアプリにテストコードを実装するというもの。
進め方は、実際にGitHubからタスク管理アプリをクローンして、見よう見まねでテストコードを実装するのが良いです。
まずは雰囲気をつかむために、実際にコードは書かずコピー&ペーストしながら、さらっと終わらせてしまってもよいでしょう。(私は効率性を重視してさらっと終わらせました。)
アウトプット:オリジナルサービスに反映
さて、それでは、ご自身のアプリケーションにテストコードを実装していきましょう。僕のテストコードは下記のGitHubで公開しています。
ユーザー登録関連の仕様はどのアプリケーションでも似通っているため、すぐにでもテストコードを実装できるのではないでしょうか。
また、投稿機能などのテストは、『Everyday Rails』のテストコードをそのまます実装するのは難しいかもしれません。
そのような時は、下記のインプットを行いましょう。
インプット(補助1):GitHub
テストコードの書き方は実際に動いているアプリケーションのテストコードをお手本にするのが一番の近道になります。
GitHubの検索窓から「spec/model」や「spec/feature」や「spec/system」と検索してみましょう。
そして、ご自身のアプリケーションと近い機能を持ったアプリケーションをREADMEやソースコードを見ながら見つけましょう。
だいたい、3件くらい見つけられるとよいです。
可能ならば、コードをフォーク(またはダウンロード)して、ローカル上で動かしながらテストコードを確認します。
この際に、『Everyday Rails』には載っていなかった、見慣れていないコードがあるかもしれません。とはいえ、下記のQiitaの記事を見ればたいていは解決できるはずです。
インプット(補助2):Qiita
伊藤さんの超良質な記事により『Everyday Rails』に乗っていないテクニックも補完が可能です。
使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」(Qiita)
使えるRSpecはシリーズものでして、全4編を読めば下記の事項もQiitaの記事を理解できることと思います。
・describe,context,itの使い分け
・Capybaraの具体的な使用方法
おそらく、たいていのRSpecによるテストコードを読み解けると思います。
GitHub等を参考にしながらご自身のアプリケーションにテストコードを実装していきましょう。
RSpecによるテストのポイント・小ネタ
RSpecの勉強を始めるために、また勉強しながらいくつかハマりどころがありましたので、ポイントをまとめました。
アプリケーションをフォーク(ダウンロード)してローカルで立ち上げる方法
『Everyday Rails』を勉強する際もそうですが、プログラミング初心者の方は自分以外の人のアプリケーションをダウンロードしてローカルで使用する、というのは初めての経験なのではないでしょうか。僕は意外とこの点でつまづいてしまったため、Qiitaにまとめています。
Ruby on RailsでGitHubからクローンしてアプリを立ち上げるために気をつけること
さくっと概要をまとめると、
・言語を合わせる
・フレームワークを合わせる
になっています。
Cloud9上でRSpecを利用する方法
プログラミング初心者の方は、RailsTutorialやプログラミングスクールを利用している方も多いかもしれません。そうした場合、開発環境としてCloud9を利用しているケースは多いです。
Cloud9でRSpecを利用するには、ざっくりと説明しますとCloud9にGoogleChromeをインストールする必要があります。下記コマンドにてインストール可能です。
1 |
詳しくは、こちらの記事をご参考ください。
INSTALLING GOOGLE CHROME ON CENTOS, AMAZON LINUX, OR RHEL
モデルスペック→システム(フィーチャー)スペックの順で学習しよう
RSpecにはいくつかの種類がありますが、中でもモデルスペックとシステムスペックが必須のテストとなります。
モデルスペックの方がシステムスペックよりも簡単に記述できます。まずはたくさんのモデルに対して、モデルスペックを書いて、RSpecの基本をマスターしましょう。
その後、システムスペックを書いていきましょう。
システムスペックは今まで学んだモデルスペックの知識に加えて、capybaraの使い方を学べば、基本的なテストコードががけるはずです。
動くコードを書く→リファクタリングの順でコードを書こう
テストコードを書く際に、初めからbeforeやletなどのリファクタリング用のコードは利用しなくてよいです。
動くコードをある程度かけてきたタイミングで、重複するコードをDRYにするためにbeforeやletを使えばよいのです。
1からきれいなDRYなコードを書こうとすると、エラーが出た際に問題の切り分けが難しくなってしまいます。(僕はこの点の理解が甘く、多くの時間を犠牲にしてしまいました)
画像のアップロードテストはテスト後に画像を削除しよう
ユーザーのプロフィール画像投稿機能などをテストするために画像アップロードのテストを追加するケースは多いはずです。
この場合、テストをする度に画像が増えていってしまいます。ローカル(Clud9)や本番環境にこうした使用しない画像が量産されてしまうと容量がひっ迫しますし、サービスの資料料金が増えてしまいます。
(それに、使わない画像がGitHub上にあがってしまうとかっこ悪いですよね><)
そのため、画像のアップロードテスト後は使用した画像が自動で削除される設定を追加することをお勧めします。僕は下記の記事を参考に実装しました。
Rspecのcarrierwaveを実行した後のファイルを削除
まとめ
以上、僕が約30時間を使ってRSpecをゼロから学び、オリジナルアプリケーションにテストコードを適用したステップをご紹介しました。
まだまだ実装できていない機能のテスト(メイラーやAPI)やリファクタリングの余地あるコードがあるので、調査して適用していきたいと思います。
・Railsの知識はある程度わかっている(「Progate」や『現場で使える Ruby on Rails 5速習実践ガイド』)
・オリジナルサービスにテストコードを実装したい
・丁寧かつ効率的にRSpecの書き方を知りたい
・エンジニアに転職する際に技術力をアピールしたい