ITツールの機能紹介-Playwright内でCSVを作成

つ~じ~です。ゲーマーを名乗っておきながら最近没入できるゲームが無くなってきてて我が感性枯渇のピンチです。何かを楽しむ感性は持ち続けたい(この間のニンテンドーダイレクトはテンション上がった!)。

さて今回は自動テスト『Playwright』の技術記事、自社の自動テストでたまに使うプログラムを簡潔にご紹介します。

自動テスト中にCSVファイルを作成する方法

自動テストを構築する上で課題だったことの一つが「テスト用のCSVファイルの準備が大変」である事。

毎回毎回参照先を指定し、ファイルの中身を手動で書き換え…が、ありていに言えばとても面倒でした。これを自動化できないかと技術を学び、そしてPlaywrightにはCSVを自作する仕組みが存在することを突き止め、実装に成功しました。

main.spec.ts  

// 検証用のCSVデータの中身を作成
  const csv_data = [
    ['シリアルコード1', '商品名1', '利用開始日1', 'シリアルコード2', '商品名2', '利用開始日2'],
    ['0001', name1, 2020-01-01, '0002', name2, 2025-09-01],
    ['0003', name3, 2022-12-10, '0004', name4, 2024-11-01],
    ['0005', name5, 2030-08-01, '0006', name6, 2026-03-20],
  ];
  // テスト用のCSVを作成
  await createCsv(csv_data, '01_sample.csv');
common_csv.ts

import fs from 'fs';
import path from 'path';
import Papa from 'papaparse';

// testsフォルダ内のcsvフォルダにCSVファイルを作成する関数
// csv_data:CSV内に記述するデータ(2次元配列データ)、filename:作成するCSVファイル名
export async function createCsv(csv_data: string[][], filename: string) {
  // 引数で受け取ったデータをCSV形式に変換(ヘッダーを無効化)
  const new_csv = Papa.unparse(csv_data, { header: false });

  // 相対パスでcsvフォルダを指定(testsフォルダ内のcsvフォルダに格納する)
  const outputPath = path.join(__dirname, 'csv', filename);

  // csvフォルダが存在しない場合は作成
  if (!fs.existsSync(path.dirname(outputPath))) {
    fs.mkdirSync(path.dirname(outputPath), { recursive: true });
  }

  // ファイルに書き込む
  fs.writeFileSync(outputPath, new_csv);

  console.log(`【INFO】テスト用の「${filename}」ファイルを作成しました: ${outputPath}`);
}

概要説明

  • 二次元配列の形式でCSVの内容を構築。出力先のファイルパスを構築。それらを専用の関数に渡してCSVを作成している
  • 上記サンプルではCSVの中身は固定値にになっているが、乱数現在日付自動テストで取得したWEBサイト上のデータなどをCSVに組み込むことも可能
  • 新規でインポートしているモジュールは以下の通り
    • import fs from ‘fs’;       :ファイルの読み書き用。フォルダ新規作成やファイル作成などに必要
    • import path from ‘path’;     :ファイルパス構築用。出力先のフォルダパスを作るために必要
    • import Papa from ‘papaparse’;   :CSV作成用。CSV作成や読み取りに必要な機能が詰まっている

上記のプログラムを導入する事により、以下の達成に成功しました。

  • テストの度にCSVを準備する必要がなくなった
  • 自動テスト内で画面上のデータ(管理画面のデータなど)を参照し、それをCSVに組み込んでCSVインポートに活用する事が出来た

自動テストのハードルがぐっと下がって、開発チームからもお褒めの言葉を頂けました。


今後も技術開拓に邁進してまいりましょう。今回はこれにて。