ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

CSV ImportをPHP Unitでテストするには?

初めまして、Yourmystarインターンの高梨です。
今回は自分が詰まったCSV Importのテストコードについて
書いていきたいと思います。

前提

CakePHPで、CSVファイルのImportをするための
Componentに対して
実際に実行したテストコードの結果を書いていきます。

やり方

概要としては、AWSのS3にCSVファイルを置いておいて
それを取ってくるという方法で行いました。

ステップとしては、
1.AWSのS3に置いておいたCSVデータを取得。
2.パスに入ったCSVデータをファイルに保存。
3.保存したファイルを使ってテストを実行。
4.最後に作ったファイルを削除。
という流れです。

ポイントは2番の
パスに入ったCSVデータをファイルに保存し直す
というところですね。

Componentの方でどういった処理をされているか
にもよりますが、
今回テストしたかったCSV Import用のComponentでは、
ファイル読み込みの際に、

  • fopen
  • is_file

などのファイルに対する関数を使用していたため、
本番同様の処理をさせるためにはパスではなく、
ファイルを読み込む必要がありました。

(というかパスではうまくいかなかったですね。。。
ファイルとパスの違いを思い知らされました。)

そのため、パスに入ったCSVデータを
ファイルに保存し直す必要があったわけです。

実際のテストコードはこんな感じです。

public function setUp()
{
    parent::setUp();
    $registry = new ComponentRegistry();
    $this->CsvImport = new CsvImportComponent($registry);
    $this->S3 = new S3Component($registry);
    $this->TestModel = TableRegistry::get('TestModel');
    $this->bucket = Configure::read('S3.bucket');
}

public function testCsvImport() {

    //1.S3に置いておいたCSVデータを取得。
    $this->S3->setClientConfig($this->bucket);
    $csvObject = $this->S3->getObject('test.csv');
    $csvPath = $csvObject['@metadata']['effectiveUri'];

    //2.パスに入ったCSVデータをファイルに保存。
    $csv = file_get_contents($csvPath);
    $filename = 'test.csv';
    file_put_contents($filename, $csv);

    //3.保存したファイルを使ってテストを実施。
    $result = $this->CsvImport->importFunction($filename, $this->TestModel);
    $expected = ['csvが読み込まれました。'];
    $this->assertSame($result, $expected);

    //4.最後に作ったファイルを削除。
    unlink($filename);
}

これが最善の方法かはわかりませんが、
Error, Warnningが出ることもなく、
無事CSV Importのテストを実行できました!

もし同じようなことをやりたい時はぜひ参考にしてみてください。

また、もっと効率のいいやり方を知っている方は、
ぜひ教えていただけると大変嬉しいです。

では、今回はここまで!

以上、CSV Importのテストコードの書き方でした!

ここまでご覧いただき、
ありがとうございました!