読者です 読者をやめる 読者になる 読者になる

テスト書きすぎ問題

少し前までiOSとかAndroidのネイティブアプリとかゲームアプリとかしか開発してなくて、テスト真面目に書いたことが無かった。

テスト真面目に書いたこと無くても、テスト書いたほうが良いとは思っていて、MockとかStubとかテストデータの生成と破棄とかを考えると安い受託開発で納期も少ないしディレクターとかに手動テスト任せたほうがコスト低いよねみたいな感じだった。あとは身近にスマホアプリのテストをしっかりと書いてきた人が居なかったのもテスト真面目に書いてなかった一因ではあると思う。

この前までcocos2d-xでゲームを開発してて、最初はtemplate使って頑張ってDIみたいなことしてみたりしたけど、めちゃくちゃコスト高いし、C++製でandroid-nkdで問題なくビルド出来る良さそうなMockとかStubとかDIとか出来るライブラリが無くて結局通信とかデータとかが絡まない部分のテストしか書いてなかった。

最近になってRuby on RailsAPI作るプロジェクト始まって、テスト書くコストめっちゃ低い〜〜〜って感じになってる。

テスト書くコストめっちゃ低いし、railstutorialでめっちゃテスト書いてたのもあって、めっちゃテスト書いてたんだけど、プロジェクトメンバーのRuby/Railsの先輩は全然(僕の主観)テスト書いてなくて、どの程度テスト書けばええんや……って感じになってる。

その人に聞いてみたところ、正常系のテストが出来てればOKと割り切るとか、ほどほどが良いとか。

Signals vs. Noiseの去年のエントリに、テストをどれくらい書くべきかということについてDHHが指針を示していたものがあったので... - Sooey

ぐぐったところ、DHHっていうなんか偉い人がテストほどほどが良いって言ってたらしいので、Rails界隈だと恐らくそういう感じなんだと思う。

帰りながら、Railsがやってくれてる部分(validationとか)はテスト書かなくていいか〜とか思ったけど、そうすると仕様が変わった時に変更するのが怖い気がした。

具体例上げたほうが早いと思うので、実際のspec問題ない範囲でコピペしたgist

before_user_spec.rb

after_user_spec.rb

beforeの方は、fakerが作ってくれたmodelが問題ないかと、各値が空だったり長すぎたりした時のテストだけ書いてある。

afterの方は、僕がテスト書きまくった結果。respond_toは単に書き忘れだったらしい。

たとえば、screen_nameは空と16文字はダメだけど、じゃあ何文字までOKなの?って部分がテストから読み取れなくなってるし、screen_nameが12文字までになった(なってしまった)場合にテスト通ってしまうので怖い気がした。

after_user_spec.rbくらいなら、0と100と境界値のテストみたいな感じで程良いと思うんだけど、request spec書き始めたらどこまでテスト書くのが良いのかという感じでまた悩んでた。

これも問題ない範囲でコピペしたgist

request_user_spec.rb

最初は投げて20x返ってくるよね〜程度しか確認してなかったんだけど、なんか色々不安になったり思うところがあって殆どafter_user_spec.rbと同じような事テストしてた。

色々、はrequest spec書いてあること簡単だし、見たらクライアントの実装者がAPIの仕様わかると嬉しいよね。 とか、Modelと内容殆ど同じだけど、APIとModelが完全に同じ仕様っていう状態はあり得るのか?他のModelとかが絡んでくると必ずしもそうならないんじゃないか?みたいなRubyRailsも初学者なので、分からない故の不安みたいなのがあった。

この3つが今日僕が読んだ限りでは共感できる感じだった。

hitode909さんのはエントリ上がった当時に読んだのをずっと覚えてて、このエントリのタイトルもそれからパクった。上記のいろいろもそこから来たのかもしれないという感じもある。

hakobe932さんのは各階層ごとに似たようなテストをなんども書く事態に陥ったりするのはやっぱり良くないですよねみたいな感じだった。

あとは退職者なるほどという。

読んだのはスポーツの秋とテスト - ainameの日記の冒頭で引用されてるやつ。

上記のエントリが上がった当時の空気感がどんな感じに落ち着いたのか覚えてないんだけど、今までテスト書いてなかったのでテスト駆動開発入門とか、テストに関する色々な文章でテストについての理想だけは高くなってる気はした。「テスト読んだら仕様が分かる」だとか。

このエントリに特に落ちは無いんだけど、サーバーサイドの開発は初めてなので、一旦は安心するまでテスト書きまくってみてバランスとれると嬉しいなと思った。