テストコードを考える
前回は、開発しているソフトウェアにテストコードを追加する例を紹介した。テストコードは自分の身を守ることになる大切なものだ。機能の追加やバグの修正によって、バグが生まれてしまうのはソフトウェア開発にはよくあることだが、テストコードがあればこうした問題を検出し、リリース前に修正できる可能性が高まるのだ。
前回は、Visual Studio Codeを使ってテストコードを追加する方法を取り上げた。テスト用のPowerShellスクリプトを作成し、make testで実行できるようにし、最後にVisual Studio Codeからテストを実行できるようにした。テストコードを取り込む方法としてはかなりシンプルなものだ。
しかし、実際にはテストコードが単一ということはほとんどない。テストコードはすべてのケースを網羅していることが理想的だ。やり方はいろいろあるが、前回のやり方を踏襲していくなら、テストごとにスクリプトを作成して追加することになる。どれだけ網羅的なテストコードを用意できるかが、どれだけ将来の自分も助けることになるかにつながっていく。
テストコードは網羅的に
テストコードは同じようなものをたくさん用意しても意味がない。できるだけすべてのケースを網羅するようにテストコードを追加していく。どこまで用意するかはケースバイケースだが、特に見逃しがちなケースを重点的にテストコードに落とし込んでおくとよいだろう。
csv2tsvの場合、変換前のCSVファイルと変換後のTSVファイルを用意しておけばテストコードを作成できる。まず、テストコードの元となるデータを用意する。最初はよくある一般的なCSVファイルだ。
zip.csv
13101,100,1000000,トウキョウト,チヨダク,イカニケイサイガナイバアイ
13101,102,1020072,トウキョウト,チヨダク,イイダバシ
13101,102,1020082,トウキョウト,チヨダク,イチバンチョウ
13101,101,1010032,トウキョウト,チヨダク,イワモトチョウ
13101,101,1010047,トウキョウト,チヨダク,ウチカンダ
13101,100,1000011,トウキョウト,チヨダク,ウチサイワイチョウ
13101,100,1000004,トウキョウト,チヨダク,オオテマチ(ツギノビルヲノゾク)
13101,100,1006890,トウキョウト,チヨダク,オオテマチジェイエイビル(チカイ・カイソウフメイ)
13101,100,1006801,トウキョウト,チヨダク,オオテマチジェイエイビル(1カイ)
13101,100,1006802,トウキョウト,チヨダク,オオテマチジェイエイビル(2カイ)
zip.tsv
13101 100 1000000 トウキョウト チヨダク イカニケイサイガナイバアイ
13101 102 1020072 トウキョウト チヨダク イイダバシ
13101 102 1020082 トウキョウト チヨダク イチバンチョウ
13101 101 1010032 トウキョウト チヨダク イワモトチョウ
13101 101 1010047 トウキョウト チヨダク ウチカンダ
13101 100 1000011 トウキョウト チヨダク ウチサイワイチョウ
13101 100 1000004 トウキョウト チヨダク オオテマチ(ツギノビルヲノゾク)
13101 100 1006890 トウキョウト チヨダク オオテマチジェイエイビル(チカイ・カイソウフメイ)
13101 100 1006801 トウキョウト チヨダク オオテマチジェイエイビル(1カイ)
13101 100 1006802 トウキョウト チヨダク オオテマチジェイエイビル(2カイ)
次に、問題となりそうなケースを用意していく。最初はダブルクォーテーションの処理だ。CSVファイルではダブルクォーテーションがクォートの対象となるため、その扱いに注意する必要がある。そういったケースをテストデータとして先に用意しておく。仕様に則って機能した場合の適切な出力をあらかじめ用意しておくのだ。
doublequotes.csv
13101,"1""0""0",,100 0000
"13101","""102""",,102 0072
13101,"1""02",,102 0082
13101,"101""""",, 10 10032
13101,"""""101",, 101 0047
,13101,@,"1""0""0",
,"13101","""102""",@
,13101,"1""02",
@,13101,"101""""",
,13101,"""""101",
doublequotes.tsv
13101 1"0"0 100 0000
13101 "102" 102 0072
13101 1"02 102 0082
13101 101"" 10 10032
13101 ""101 101 0047
13101 @ 1"0"0
13101 "102" @
13101 1"02
@ 13101 101""
13101 ""101
ファイルが空、つまりゼロバイトだった場合の処理もレアケースになる。そのときにも適切に動作してもらう必要があるので、次のように空のファイルを用意して動作確認を行うようにする。
empty.csv
empty.tsv
フィールドが空のケースや、フィールドの前後が空白である場合なども処理を間違えがちだ。この辺りもテストデータとして用意しよう。
spaces.csv
,,,100 0000
,,,102 0072
,,,102 0082
,,, 10 10032
,,, 101 0047
,,,,
,,,
,,,
,,,
,,,
spaces.tsv
100 0000
102 0072
102 0082
10 10032
101 0047
どこまでやるかは用途にも依るが、たとえばフィールド数が1000とか10000といった極端に多いケース、1行あたりのデータサイズがきわめて大きなケース、CSVデータが適切なフォーマットではなかったときの動作など、やろうと思えばどこまでもテストケースを用意することができる。どこまで用意するかはバランス感覚が要求されるところだが、仕様の整理とテストコードの開発を行ったり来たりしながら丁寧に作業してみよう。