ソートテストのテストデータの考え方
友人が質問してくれたのでパッと考えてみたことをまとめた.
ツッコみ歓迎します.
結論
ソートされる/されないの分岐を増やしていけば良い.
ソートにかぎらず、シンプルに考え始めて複雑にしていけばOK.
実践
もしSQLが
SELECT
... -- なにかのすごい処理
ORDER BY ID1, -- 何かのID
ID2, -- 何かのID
DATE1, -- 何かの日付
COMMENT -- コメント
みたいな感じだとしたら、それぞれの場合にちゃんとソースが効いてるか確認すれば良い. 最初から全部考えるとややこしくなるから、シンプルにいこう.
まずソート条件が一つなら?
ソート条件が一つだけの場合から始めよう.
ORDER BY ID1 -- ID1の昇順
それなら、2つのデータを用意してちゃんと順番どおりに並べばOK.
SQL> SELECT ID1, NAME FROM T ORDER BY ID1;
+-----+------+
| ID1 | NAME |
+-----+------+
| 1 | one |
| 2 | two |
+-----+------+
っていう順番で取れていれば、仕様通りのソートをしてくれていることが分かる.
ちなみにORACLEはORDEY BYをつけない限り取得される要素の順序は保証されないから、テストデータを入れる順番は気にしなくて良い.
次に2つに条件を増やすと?
2つになったらどうしよう?SQLは
ORDER BY ID1, -- 何かのID
ID2 -- 何かのID
になる. さっきのデータは2件だったけど、ID2がソートされることもテストしたいなら、もう1件データを増やそう.
SQL> SELECT ID1, ID2, NAME FROM T ORDER BY ID1, ID2;
+-----+-----+-------+
| ID1 | ID2 | NAME |
+-----+-----+-------+
| 1 | 1 | one |
| 1 | 2 | two | -- New!
| 2 | 1 | three |
+-----+-----+-------+
こんな並び順で取れてればOK. まずID1でソートされて、ID1が同じなら次はID2でソートされてる.
もし実装を間違えてて、まずID2でソートされていたとしたら
+-----+-----+-------+
| ID1 | ID2 | NAME |
+-----+-----+-------+
| 1 | 1 | one |
| 2 | 1 | three | -- これと
| 1 | 2 | two | -- これの順番が変わるはず.
+-----+-----+-------+
こんなふうに、ミスしてたら必ずテストが失敗するから、テストデータの量はこれで十分.
3つになってもコトは同じ.
なんか雰囲気が分かってきたね. 3つになっても話は同じ.
まずID1、次にID2、そして最後にDATE1、という順にソートが効いていれば良いから
SQL> SELECT ID1, ID2, DATE1, NAME FROM T ORDER BY ID1, ID2, DATE1;
+-----+-----+-------------------------------+-------+
| ID1 | ID2 | DATE1 | NAME |
+-----+-----+-------------------------------+-------+
| 1 | 1 | 2016-11-15T09:00:00.000+09:00 | one |
| 1 | 2 | 2016-11-15T09:00:00.000+09:00 | two |
| 1 | 2 | 2016-11-15T10:00:00.000+09:00 | three | -- New!
| 2 | 1 | 2016-11-15T09:00:00.000+09:00 | four |
+-----+-----+-------------------------------+-------+
ソート条件を間違えていれば必ずこれ以外の順番になるから、良いテストデータといえると思う.
最後に、4つのソート.
もう答えだけ書いておく.
SQL> SELECT ID1, ID2, DATE1, COMMENT, NAME FROM T ORDER BY ID1, ID2, DATE1, COMMENT;
+-----+-----+-------------------------------+---------+-------+
| ID1 | ID2 | DATE1 | COMMENT | NAME |
+-----+-----+-------------------------------+---------+-------+
| 1 | 1 | 2016-11-15T09:00:00.000+09:00 | aaa | one |
| 1 | 2 | 2016-11-15T09:00:00.000+09:00 | aaa | two |
| 1 | 2 | 2016-11-15T10:00:00.000+09:00 | aaa | three |
| 1 | 2 | 2016-11-15T10:00:00.000+09:00 | bbb | four | -- New!
| 2 | 1 | 2016-11-15T09:00:00.000+09:00 | aaa | five |
+-----+-----+-------------------------------+---------+-------+
ただし、条件が不足していても気づけない
でも気づけない部分もある. 4つの条件のうち一つを実装し忘れてたら?つまり
SQL> SELECT ID1, ID2, DATE1, COMMENT, NAME FROM T ORDER BY ID1, ID2, DATE1; -- COMMENT のソート条件を書き忘れている.
みたいなミスがあったとしたら? ORACLEは取得の順序を保証しない. つまり、うっかり期待通りの順序でデータを取得してしまう場合もありえる.
でもこれは何個テストデータを追加しても防げない問題だから... どうしたらいいんだろうなぁ.