余計なテストデータを投入しないようにする

ユニットテストの保守コストを下げたい。無駄なコストをかけないようにしたい。

次のような members テーブルがあるとする。適当…

id     : not null
name   : not null
foo_id : not null ではない
bar_id : not null ではない

たとえば「name で検索できること」を確認するテストがあり、検索ロジックには foo_id, bar_id は関係ない(カラムを参照していない、どんな値が入っていても結果が同じ)という場合、テストデータ投入は

(A)
insert into members (id, name, foo_id, bar_id) values (1, 'tarou', 14, 73);

よりも

(B)
insert into members (id, name) values (1, 'tarou');

の方が良いと思う。
(A) の場合、たとえばテーブル定義が変更されて foo_id や bar_id がカラム削除されるとinsert文の修正が必要になるが、(B) なら必要ない。何もしなくていい。

この例の場合、foo_id, bar_id をカラム削除したら 20個くらいテストが赤くなって、そのそれぞれで foo_id, bar_id がテストに必要なのかそうでないのか確認しないといけなくなり、そのためにコードを追いかけないといけなくて……となるのが嫌なわけです。

「そのテスト(その処理)に必要なものが何なのか」も (A) より (B) の方が余計なものがなくて分かりやすい。

「テスト対象に影響する仕様変更がない限りテストコードやテストデータを修正しなくてよい」というのが理想的。


てな感じでメモを書いていたところ、ちょうど読んでいた「リーダブルコード」に似たような話があって、あぁ、そうそう、と思った。

どうすれば適切な入力値を選択できるのだろう? 適切な入力値というのは、コードを完全にテストするものでなければいけない。それに簡単に読めるような単純なものでなければいけない。

(p188, 14.5 テストの適切な入力値を選択する)