hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

テスト書きすぎ問題

http://www.flickr.com/photos/36016325@N04/3635855039


テスト書きすぎるとよくないって言ってる人がいた.DHHっていう人.作業時間の1/3以上テストしてたらおかしいとか,ActiveRecordのバリデーションなど,Railsの機能はテストしない,とか.

偉い人が言ってるからという理由で,テスト手抜き派の人に良い材料を与えてしまった.僕は意見ちがって,作業時間半分以上はテスト書いたりしてる.
テストたくさん書くと,最初に書くときのコストは増える.けど,あとから読む時や,変更したい時には,読むだけだし,書くのも差分だけで良い.コード本体を理解できれば,要らないテスト捨てるのは,落ちたのを消すだけだから簡単.あとで見て,テスト足りないと分かったときに,明文化されてない仕様からテストを補う方が難しいし,そのほうが最初にテスト書いておくより時間かかる.今後変更されないことが分かっているコードなら,テストなくていいけど,そんなことは最初には分からない.
ライブラリの機能であっても,どういう挙動が求められているのか示すためにテストは書くべき.そのテストを壊さずに別のライブラリに移行できるか試すときなどに役立つ.
テスト書きすぎるとよくないというスローガンのために,テストが足りなくて,あとから読んだ人が分からなくなる,というほうが,リスクが高い.だから,テストは執拗に書くべき,くらいのスタンスで居る方が役立つと思う.執拗というのは,同じケースを何回も試すという意味ではない.人間は手抜きするから,意識が下がってるとテスト書かないとか,正常系だけ試すとかになる.自分の書いたところは常識的なくらい必ずテストを書く,作業時間の半分以上使っていい,どうせそんなに行数ないんだから自分の書いたところくらいはカバレッジ100%を目指す,くらいの気持ちで居ないといけない.人間は手抜きするから,執拗にテストを書こうって言ってると,自然とそれからちょっと下がったくらいの品質になる.
DHHっていう人の周りには適切な量のテストを書けるような良いプログラマーしかいないのだろうけど,僕の周りではそうでもなくて,テスト書いてない人が後世に渡って害悪を撒き散らすという状況で,テスト多すぎて困ったこともないので,事情は違うと思う.GitHubとか見ててもテストないことがよくある.仕事ではテスト書くけど遊びでは書かないっていう人もいる.そういう人はテスト書けばプロジェクトが良くなるのに手抜きで価値を下げてて損してる.


追記,テストコードの量と実際に実行されるテストの量の違いについては,普通に書いてれば,比例していて,差がないと思う.どういう話かよくわからなかった.冗長なフレームワークを使っていれば増えるとか,RSpecを使えば密度が上がるとか,テストコード千行あってもアサーション1個だけでは少ないとか,テストはあるけど実行しないとか,そういう話題はあるけど,そういう話してないつもりだった.


追記,定量的な話をするべきというのは,たしかにそうで,個人的には,カバレッジについては,C0で100%にしなければならないと思ってる.テストで一度も実行されていないと,そこに誰かがにexit 0;とか書いてもテストは通るということで,そんな状態では安心できない.当然,全部の行が実行されるだけではだめで,結果が正しいか,適切な形で見ないといけない.足し算関数の返り値が数字であるというテストだけでも100%にできるけど,足し算の代わりに引き算呼んでも同じテストが通るので,あまり意味ない.定量的な話もできるけど,どちらかというと気持ちの問題で,とにかく安心したいだけという話でもある気もする.



追記,前提としては,DHHが言ってたという話で,Railsやウェブアプリケーションの話で,DHHも,もしActiveRecordのバリデーションをしないとロケットがホワイトハウスに墜落する危険があるようなときにはテストするべきって書いてる.僕は,ホワイトハウスにロケットが墜落する心配なくてもテスト書くべきだと思う.そのときはいいけど,十年後とかに,いらないと思ってブログの著者のバリデーション消してしまって,なんかブログに著者の名前出ないんだけどなんで,みたいになったら嫌な気持ちになるし,十年前にテスト書かなかった人のこと嫌いになると思う.


追記,テストについての話題が集まりつつある.


追記,なんか写真あったらにぎやかになるかと思ってFlickrから良い写真選んで貼っておきました.
photo by PNNL - Pacific Northwest National Laboratory


追記