テストコードを考える

前回は、開発しているソフトウェアにテストコードを追加する例を紹介した。テストコードは自分の身を守ることになる大切なものだ。機能の追加やバグの修正によって、バグが生まれてしまうのはソフトウェア開発にはよくあることだが、テストコードがあればこうした問題を検出し、リリース前に修正できる可能性が高まるのだ。

前回は、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データが適切なフォーマットではなかったときの動作など、やろうと思えばどこまでもテストケースを用意することができる。どこまで用意するかはバランス感覚が要求されるところだが、仕様の整理とテストコードの開発を行ったり来たりしながら丁寧に作業してみよう。