関数のテストコードを書くときに、幾つものパターンをどうまとめるのが一番良いのか悩んでいます。
単純なパターンであれば、それぞれの入力値、期待する出力値を配列にまとめることでfor文(foreach文)で回してテストコードをコンパクトにすることができます。
テストコード自体よりもテストパターンが重要だと思うので、それぞれが「どういったテストなのか」「他のパターンとはどこがちがうのか」が分り易くないとダメだと思っています。
これが複雑な幾つかのパラメータを受け取るような関数だと、そのテストパターンをわかりやすく書くのが難しいです。
「テストしたい関数を実行して、その戻り値をチェックする」という部分は共通なので、ここはまとめてしまいたいところです。
「まとめる」ということは繰り返し実行により実行するわけですが、なるべく一つの繰り返しにまとめられるようにするというのがネックになります。
配列のデータを渡す際に、すべての要素があることが前提ならまだ楽です。
「この要素が無かった場合」といったパターンが生じてくると、その入力値をまとめるのが大変になります。
<?php // テストパターン $testCases = [ [ 'record' => [ // 全てある場合 'a' => 1, 'b' => 1 ], 'expected' => true ], [ 'record' => [ // aが無い場合 'b' => 1 ], 'expected' => false ], [ 'record' => [ // bが無い場合 'b' => 1 ], 'expected' => false ] ];
こうなってくると、テストケースの配列が冗長的になってしまいます。
baseとなる配列を作成し、その配列に上書き(マージ)したり、その配列から任意の要素を削除したりと書いていますが、これもまだ微妙な感じがします。
まだまだ試行錯誤が必要なようです。