瀬宮の球拾いブログ

エンジニアだったはずが、みんなにヘイストかける方がチームに貢献できた男のブログ

現場のテストにかけるコスト

3行で

  • 私はテストを書くべきだと思う
  • テストのあるまともなプロジェクトを回したらテスト量は以外と少ない
  • テスト書かないとかありえないよ

昔こんなコピペ流行ってましたねえ

うちはテスト書かないよ、スピード重視だから
TDDってあれでしょ?単体テストを大量に書くやつ

私、あれの元ネタ知らないんですけど、あのコピペってどこ発祥なんです?

話は全然変わるんだけど

大学時代に助教の方からこう言われました

「(コンスタンチンとヨードンが提唱した)構造化設計において、結合度と凝集度という概念がある。 
 これは知ってるよね。 
 通常はこの2つを最高レベルに保つことはできない。限界があるからだ。
 しかし例外的にこの2つを最高に保つ方法がある。なんだと思う?」
「わかりません」
「全部メイン関数に書く」
「それって保守性はどうなるんです」
「最悪だろうね。結局こういうのはトレードオフだから」

トレードオフ

よくCOBOLerあがりのおっさんと若人が「コードの見渡しが悪くなるからできる限りクラスは大きく作れ」vs「保守性考えてクラスやメソッドは細かくしろ」論争していたのを、SIer時代に見かけました

前者がGODクラスを作りたがっているのに対し後者は責任分割や保守性の観点からクラスやメソッドを適切に切りたがっています。
ここで注目したいのは後者も「適切に分割せよ」といっているだけで「とにかく細かくしろ」とは言っていないです

DDD的的な概念も思考停止して適用すると3行以下のメソッド1~2個だけしかもたないクラスが乱立するよな、絶対レビューではねられるよな、って思ってました。

原理的には別メソッドや別クラスにすべきだろうが
それをやるとコストがかかる割に「やらんでもわかるだろ」という部分なので「やりすぎ」になる  

というシーンはコードを書く上でよく発生します
このあたりはトレードオフだと思ってます

テストもトレードオフですよ?

テストも基本トレードオフだと思ってます。

テストを書くべき場所

バグがあった時にUXを大きく損なう、金銭に関わる、データ不整合を引き起こすなど重要な部分には必ず必要です。 しかし、ある値に定数をかけて返すなどのメソッドには必要でしょうか? 不要だと私は思います。 単純なメソッド、一見してわかる箇所、あるいは影響があるユーザーは運営の人間だけの場所など重要度低いと判断されテストが書かなくても良いと思います。

テストのコスト

テストは書くのに初期のコストがかかります。
プロダクトコードが変更されればテストコードを変更するコストもかかります。
複雑なテストコードや入り組んだテストにはバグが潜みやすくなります
さらに、前提から変更されるような変更が入る場合テストの大半は壊れていないか、不要にならないかの判定のあと、かなりの部分が捨てられる恐れがあります。
これらのコストは判断に大きな影響を与えるべきだと思います

ノーテストorALL

「GODクラス志向の実装or責任分割を厳密に守った実装」のように「ノーテストorテスト書きまくり」のような極端な二択を持ち出される方がおります。
ダブルディバイディングといって営業や詐欺師が持ち出す恣意的に片方の選択肢に誘導する話術だそうですね。

実際には書くべきところにはテストを書く、書くにしても正常系onlyか、異常ケースのメイン部分を全部潰すか、画面確認できない部分だけ書くか、そういった「どこまで書く?」の判断はリスクやコストと利益のトレードオフと合わせて判断されるべきだと思います。

テストを書くと採算があいづらい場所

障害が起きても不利益が運営の人間にしかかからない場所
設計の変更が起きやすい場所
画面から確認しやすい場所
スティングフレームワークの限界から、コードでは確認しづらく、逆に人目で容易に確認できる場所

テストは保険

20代独身で月に5万円くらい保険に注ぎ込まれている方はおりますか?
あまりいないと思います。
給与が低くてなにかをもっていないからです
保険料につぎ込むよりもお金を別の場所につぎこんだほうが有益だからです。

同様にテストにはコストがかかるので、そのリソースを他につぎ込んだほうが有益です。

しかし、より高齢で持ち家があって妻子のいる方ならありえる選択肢です。
持てるものが多く、収入が多く、なにかを失った時のリスクが大きいからです。

プロダクトも同じで「立ち上げ時期」や「稼ぎ」「既に得ているもの」によって依存すると思います。
スタートアップならほぼノーテストでもかまわないでしょう。
でもヒットプロダクトを抱えた会社の新規事業なら、本体事業への悪影響を考えて最初からテストをかいたほうがいいかもしれません。

じゃあどれくらい書けばいい?

正直「コンテクスト次第」「チーム次第」と言わざるを得ません。
ただそれじゃあ無責任だと思います。

githubなどの伸びているプロダクトはプロダクトコードとテストコードの比率は1:1だそうです。
だいたい感覚値と合う感じです。

結論

テストは用法用量を守ってお書きください。