読者です 読者をやめる 読者になる 読者になる

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

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

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のテストコードの書き方でした!

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