Railsでの開発はテストを腐らせたら死ぬ

Railsをバージョンアップし続けるために必要なこと、ほんとRailsで開発する限りはテストが書かないと死んでしまうよね、うんうん、そうよなそうよな、と、首を縦に振りながら読んでおりました。更に言うと、テストを書いていたとしても、テストを腐らせると死にます。

腐ったテスト

「何をテストしているのか分からない」というのが代表的な腐ったテストではありますが、例えばRSpecであれば

  • インスタンス変数を引き回しすぎていて、実際にテストが評価される式までにどんな値になっているか分からない。
  • describe '#hoge' do ... it { is_expected.to be_valid } endとか一見綺麗だけど何が正しいのか分からない。日本語でOK。
  • HTTPリクエストのmockが単純すぎてテストの体をなしていない。バリエーションも増やせる仕組みじゃない。詰んでいる。

などといったものが腐ったテストかなと思います。あれば良いというわけではない。

綺麗すぎるテストは書いた本人しか何のテストをしているか分からないケースもあり、単にコードとして綺麗であれば良いというわけでもないのがテストの特殊なところなのかも知れません。仕様を伝える努力が問われます。

テストが腐ると何が起こるのかというと、

  • 腐っているせいでテストを書く気力を奪われる。
  • 腐っているせいでテストスイートの進化についていけない。
  • Railsのバージョンアップしよう! → dependency的にテスト関連のGemもアップデート → あれ、テスト関連のGemをアップデートしたら動かなくなった → テストが腐ってて改善不能で死ぬ

_人人人人人人人人人_
> 改善不能で死ぬ <
 ̄YYYYYYYYY ̄

というわけで、コア機能のテストはちゃんと書きつつも、腐らせないように適切にリファクタリングするのが肝要です。メインのコードはリファクタリングされているものの、テストだけが妙に濁っているというのもよくあるケース。定期的に棚卸しをしたいものです。

テストが腐っていると「助けてー!」と言っても誰も助けてくれませんので、自衛のためにもぜひ、腐らせない努力を。