6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ソート条件のテストデータの作り方

Last updated at Posted at 2016-11-15

ソートテストのテストデータの考え方

友人が質問してくれたのでパッと考えてみたことをまとめた.

ツッコみ歓迎します.

結論

ソートされる/されないの分岐を増やしていけば良い.
ソートにかぎらず、シンプルに考え始めて複雑にしていけば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は取得の順序を保証しない. つまり、うっかり期待通りの順序でデータを取得してしまう場合もありえる.
でもこれは何個テストデータを追加しても防げない問題だから... どうしたらいいんだろうなぁ.

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?