Railsチュートリアル完走者向け基礎力向上テスト②
Rails開発から少し離れることになるので、Railsチュートリアルの『基礎力向上テスト』を深堀りしていこう企画第二弾です。
最初は正直に自分なりの考えを簡単に書いて、その後に調べたことを(主に安川さんの解説を基に)書いていきます。 宣伝を兼ねて参考にしているリンクを貼っておきます。 https://railstutorial.jp/screencast
Q3. 第3章「テストを先に書く? 後に書く?」
Q. 第3章ではテストの書き方を習得し、以降の章ではテストを先に書いたり後で書いたりと、場面に応じて使い分けています。例えば Sample App の拡張機能として、Microposts コントローラに show アクションおよびそのテンプレートを実装し、各マイクロポストの単一ページを作るとします(参考: Twitter における単一ページの例)。あなたならこの拡張機能を実装するとき、テストを先に書きますか、それとも後で書きますか? あなたの意見とその理由を簡潔に述べてください
(おおの)A.仕様が明確に決まっている実装なのでテストを先に書くべきだと思う。逆に開発中に仕様が変わる可能性がある機能(作ってみないと使用感がわからないとか)を実装する場合はテストを後に書く。
この辺はRailsチュートリアルの解説動画2周半したから安川さんが熱弁していたのを覚えている気がする…! 安川さんのお言葉を確認してみましょう。
A. ケースバイケースである(前回振り2度目)
テストを先に書く、後に書く事に絶対的な正義や正解はない。例えば、決済機能、電子マネー等ではチームとして仕様が決まっていたほうが効率的に動ける。デザイン的な機能の場合はできた後に仕様自体を変更する場合もある為、後で書いたほうがいい。ケースバイケースなのでチームやプロジェクトによって議論する必要がある。
日本語でテストを書いて仕様書のような役割になることもある。そのような場合は、開発者間/開発者と顧客間の意識のすり合わせになるメリットもある。PoC(Proof of Concept)の場合、簡単なテストは書くことがあるがしっかり書かない場合が多い。結論として、仕事でテストを書かないことはほぼ無い。
※PoCとは、アイディアの実証を目的とした、試作開発の前段階における検証やデモンストレーションを指す。
Q4.第4章「ベンチマークしてみよう」
Q.第4章の解説動画では benchmark-ips gem を使ってハッシュの Key に数字・文字列・シンボルをそれぞれ渡してベンチマークをとる実験をしてみました。下記の変数 a をソートするとき、a = a.sort と a.sort! のどちらが早いか「ベンチマーク例」を参考に実験してみましょう。ベンチマークの出力結果を回答欄に貼り付け、実行速度に差が出た理由、もしくは差が出なかった理由について、あなたの考えを簡潔に述べてください。
a = [['C', 14], ['A', 3], ['B', 5], ['E', 50], ['D', 23]]
(おおの)A.(こちら環境構築が面倒だったため、実行結果を回答例から参照させていただきました。BeOpen)
下記実行結果を見たところ、!を付けた非破壊的の方が時間がかかっている。非破壊的な方は新しくオブジェクトを生成するから遅い?
Warming up --------------------------------------
sort 82.303k i/100ms
sort! 93.305k i/100ms
Calculating -------------------------------------
sort 835.386k (± 2.3%) i/s - 4.197M in 5.027503s
sort! 934.123k (± 2.4%) i/s - 4.759M in 5.097195s
Comparison:
sort!: 934123.0 i/s
sort: 835385.8 i/s - 1.12x (± 0.00) slower
A. 上記参考例で言うと、1.12x (± 0.00) slower とあるので a = a.sort の方がやや時間がかかっている。a.sort! は代入されている配列の要素を直接並べ替えているが、a = a.sort は要素を並び替えた配列を新しく作成して代入し直しているので、その分の時間がかかっていると考えられる。
ちなみに、上記問題に記載のハッシュの Key に数字・文字列・シンボルをそれぞれ渡してベンチマークをとる実験結果はSymbolとIntegerはStringに比べると早い。なぜかと言うと、コンピュータからするとString型のみ計算が必要だから。なのでハッシュにはシンボルを使う理由の一つでもある。いろんな場面によって速さの違いは出てくるので気になったら検証する必要もある。このような実験によって理解を深めることが大事である。バージョンによって違いも出ることもあるので注意.
おわりに
基礎力向上テスト第二弾は如何でしたでしょうか。なかなか独特な切り口(Q4は特に)で面白かったです。
テスト駆動開発(TDD)という単語は良く聞きますが、個人開発では全くやらなかったので次なにか作る際は練習も兼ねてやってみたいですね。
このブログを書くにあたってRailsチュートリアルを久しぶりにチラ目しましたwが、話題が多岐にわたるし、テストについて解説などの記載も多いので、再度目を通す必要ありだなと感じました。
特にテスト関係は当時やった時はほぼ総スルーだったので学ぶ必要アリと感じました。(minitestだけど。。)
また、安川さんの話し方とかちょっとふざける時の感じが好きなので、解説動画は必ず再視聴しようと思います。
解説動画の宣伝も軽くしたところで締めさせていただきます!