アラフォーからのプログラミングとデザイン

大人から始めたプログラミングとデザインについてのあれこれ

Railsチュートリアル復習中:テストを行う重要性

f:id:simpledancer:20171209142407p:plain

とりあえず順番通りに進めています。今日はテストのことについて。

 アプリケーションを開発しながらテストスイート (Test Suite) をみっちり作成しておけば、いざというときのセーフティネットにもなり、それ自体がアプリケーションのソースコードの「実行可能なドキュメント」にもなります。テストを作成するということは、その分コードを余分に書くことになりますが、正しく行えば、むしろテストがないときよりも確実に開発速度がアップします。テストが揃っていれば、バグを追うために余分な時間を使わずに済むためです。そんなふうにうまくいくとは信じられない人もいるかもしれませんが、一度でもテスト作成が上達すれば間違いなくこのとおりになります。だからこそ、テスト作成の習慣をできるだけ早いうちに身につけることが重要なのです。

 テストを行うメリット

確かにテストを行うのって余分にかかなきゃいけないしめんどくさいけれど。。

メリットがあるから行うわけです。

 1 テストが揃っていれば、機能停止に陥るような回帰バグ (Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること) を防止できる

2 テストが揃っていれば、コードを安全にリファクタリング (機能を変更せずにコードを改善すること) ができる。

3 テストコードは、アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ。

 テストを書くタイミング

 上の3つのメリットは、テストを先に書かなくても得ることができますが、それでもテスト駆動開発 (TDD) という手法をいつでも使えるようにしておけば、間違いなく多くの場面で役に立ちます。テストの手法やタイミングは、ある意味テストをどのぐらいすらすら書けるかで決まると言ってよいでしょう。たいていの開発者は、テストを書くのに慣れてくるとテストを先に書くようになります。その他にも、アプリケーションのコードと比べてテストがどのぐらい書きにくいか、必要な機能をどのぐらい正確に把握しているか、その機能が将来廃止される可能性がどのぐらいあるかによっても異なってくるでしょう。

ということですが 以下がテストを書くタイミングの基準的な。

  • アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる (=簡単に書ける) のであれば、「先に」書く
  • 動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を「後で」書く
  • セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合、テストを「先に」書く
  • バグを見つけたら、そのバグを再現するテストを「先に」書き、回帰バグを防ぐ体制を整えてから修正に取りかかる
  • すぐにまた変更しそうなコード (HTML構造の細部など) に対するテストは「後で」書く
  • リファクタリングするときは「先に」テストを書く。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする  

 テストを行う

testディレクトリのなかにあるstatic_pages_controller_test.rbのファイルにaboutページのコードを書く

f:id:simpledancer:20171209143729p:plain

そしてターミナルに$ rails testと打ち込むと

NameError: undefined local variable or method `static_pages_about_url' for #

以下略

とでます。

 

Aboutページ見つからないエラー。

 

aboutページのコード書いてないからね。なのでルーティングファイルを修正します

get  'static_pages/about'

を追加します。

意味は 'static_pages/about'のURLのgetリクエストが来たらStaticPagesコントローラのaboutアクションに渡すようRailsに指示

static_pages_about_urlのヘルパーが使えるようになる。

 

次に同様にrails testするとまた違うエラーが出ます。

AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController

なのでアクションが見つからないというエラーが出ます。

 

コントローラにaboutアクションを追加します

f:id:simpledancer:20171209145156p:plain

def about

end

と追加。

でrails testすると

StaticPagesControllerTest#test_should_get_about:
ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant.

テンプレート(=view)がないですと出ます。

 app/views/static_pageディレクトリのなかにabout.html.erbというファイルを作ります

f:id:simpledancer:20171209145651p:plain

作った!

そして再びrails testします。

f:id:simpledancer:20171209145823p:plain

0errorsになりました!

そのあと実際に表示されるかサーバーを立ち上げて実行してみてテスト完了!

f:id:simpledancer:20171209145956p:plain

 

テストって今までサラーーーっと流してましたが

こんな風に確認してたんですね〜と今更ながらなことですがたくさん学べました。

今日はここまで!