はじめに
この記事では、Tricentis Testim(以下Testim)の「Validate download」機能と JavaScriptを用いて、CSVファイルの内容を自動で検証する手順とサンプルコードを紹介します。
他のテスト自動化ツールではダウンロードしたファイルの内容を検証するのは難しい場合がありますが、TestimではJavaScriptを用いることで柔軟に対応できます。
本記事で紹介するステップフローやJavaScriptスニペットは、ある程度汎用的に利用できるように作成しています。本記事の通りに実装したうえで、検証に利用するデータ部分だけを変更していただくことで、様々なCSVファイルの検証に応用可能です。
自動E2Eテストにおけるファイルダウンロードの検証に興味がある方は、参考にしていただければ幸いです。
Tricentis Testim 公式サイト
Testimのダウンロードファイルを検証するValidate download機能とは
Testimの「Validate download」機能は、アプリケーションからダウンロードしたファイルの内容を検証するための機能です。
この機能を使用することで、ダウンロードしたファイルの内容が期待通りであるかどうかを確認できます。
驚くことに、Testimは多様なファイル形式に対応できるようになっています。
これは、Validate download機能でnpmパッケージを利用できるためです。npmパッケージに対応したファイル内容を解析するJavaScriptライブラリさえあれば、そのライブラリを使って多くのファイル形式を検証できると考えられます。
たとえば、次のようなレポートファイルをE2Eテストで検証したいケースにも対応できます。
| 対応ファイル形式 | 利用可能なJavaScriptライブラリ例 |
|---|---|
| Excelファイル(.xlsx) | xlsx |
| PDFファイル(.pdf) | pdf-parse |
| CSVファイル(.csv) | csv-parse |
TestimのValidate download機能には、次のような制約があります。
- ダウンロードファイルの容量が1.5MBまでの制限があります。テスト実行時にダウンロードするファイルの容量が制限を超えないようにご注意ください。
- Validate download機能を利用できるブラウザはChrome、Edge Chromiumのみです。
Validate download機能の詳細は、Testim公式ドキュメントをご覧ください。
Validate download機能でCSVファイルを検証する方法
ここからは、TestimのValidate download機能を使用してCSVファイルの内容を検証する具体的な手順を説明します。大まかな流れは次のとおりです。
- Chrome拡張機能の設定
- Testim CLIのインストール
- テストシナリオ作成
- 作成したテストシナリオの実行
- テスト実行のログ確認
今回は、筆者がAIを活用して固定のCSVデータをダウンロードするサンプルサイトを作成しましたので、それを利用して検証を行う例を紹介します。
本記事でも後述していますが、今回の検証フローは動的な値やZipファイル形式には対応していませんのでご注意ください。
1. Chrome拡張機能でファイルURLアクセス許可
TestimのValidate download機能を使用するには、Chrome拡張機能のTestim Editorの設定で「ファイルURLへのアクセスを許可」を有効にする必要があります。
2. Testim CLIでnpmパッケージをインストール
テストシナリオ作成時にValidate downloadの設定を行う場合や、作成後にローカル環境でValidate download機能を利用してテストを実行する場合は、Testim CLIが必要になります。
そのため、本記事の手順に沿ってValidate download機能を利用する場合は、あらかじめクライアントPCにTestim CLIをインストールしておいてください。
Testim Grid上でテストシナリオを実行する際には、テスト実行そのものにはクライアントPCへのTestim CLIのインストールは不要ですが、事前のValidate download設定にはTestim CLIが必要になる点にご注意ください。
お使いのPCのルートディレクトリに移動し、ターミナルで以下のコマンドを実行してTestim CLIをインストールします。
npm install -g @testim/testim-cli
以下のような出力が表示されたら、インストール成功です。
Starting Testim.io CLI
Start Testim CLI on Agent mode
Running on port: <実際のポート番号が表示されます>
? Type the word "stop" or Press Ctrl + C. ›
インストールが成功したら、一度ターミナルでstopと入力してEnterキーを押すか、Ctrl + Cを押してTestim CLIを停止しておいてください。
Testim CLIを利用するには、Node.jsのインストールが必要です。
Node.jsがインストールされていない場合は、先に公式サイトからNode.jsの安定版をインストールしてください。
※Testim CLIはNode.jsの安定版をサポートしているため、筆者としては安定版の利用を推奨します。
3. TestimでCSVファイル検証シナリオを作成
Testimのテストシナリオで、Validate download機能を使用してCSVファイルの内容を検証するシナリオを作成します。
3.1 Testimエディタで新しいテストシナリオを作成し、ベースURLを設定する
ベースURLには、 https://static-csv-download-sample.vercel.app/ を設定します。
3.2 期待値としてカラム名と行データを Add custom action で定義する
ここでは、後続のCSV検証で使用する「期待値」として、カラム名と行データを Add custom action で定義します。
まず、ヘッダーカラムの期待値となる配列データを作成します。
※今回はサンプルのため、Shared stepチェックは外しています。
// 実運用ではcolumnsの中身を差し替えてご利用ください
const columns = [
"ID",
"氏名",
"部署",
"役職",
"入社年",
"給与"
];
exportsTest.csvColumns = columns;
※こちらもサンプルのため、Shared stepチェックは外しています。
続いて、再度Add custom actionでデータ行の期待値となる配列データを作成します。
// 実運用ではfirstRowとlastRowの中身を差し替えてご利用ください
const firstRow = [
"1",
"田中 太郎",
"営業部",
"部長",
"2015",
"8000000"
];
const lastRow = [
"10",
"加藤 麻衣",
"人事部",
"課長",
"2017",
"6600000"
];
exportsTest.csvFirstRow = firstRow;
exportsTest.csvLastRow = lastRow;
3.3 CSVダウンロードステップを録画して「Validate download」ステップを登録する
CSVダウンロードステップを録画し、「Validate download」ステップが登録されることを確認します。
3.4 Validate downloadステップのPROPERTIESでスニペット名と引数を設定する
Validate downloadステップを開き、PROPERTIES設定でスニペット名と引数を設定します。
今回利用するCSVをパースするためのnpmパッケージは、上記で紹介したcsvtojsonを利用します。スニペットで利用する引数を以下に記載します。
| 引数名 | 引数の種類 | 引数の設定値 | 引数の説明 |
|---|---|---|---|
| csv | npm | csvtojson @ 2.0.14 | npmパッケージの設定 今回は、csvtojsonを指定 |
| expectedColumns | JS | csvColumns | 比較元カラムの配列 |
| expectedFirstRow | JS | csvFirstRow | 比較元データ先頭行の配列 |
| expectedLastRow | JS | csvLastRow | 比較元データ末行の配列 |
| expectedDataRowCount | JS | 10 | ヘッダーを除いたCSV行数 Numberで指定 |
3.5 CSV検証スニペットをコピーして貼り付ける
設定ができたら、以下のスニペットをコピーして貼り付けます。※長いので折りたたんでいます。
CSVをValidate downloadで検証するサンプルコード
/*
【概要】
この関数は「テストで使う CSV チェックツール」です。
CSV ファイルの形式や中身が、事前に決めた仕様どおりかどうかを確認します。
具体的には、ヘッダーの項目名・列数・行数・先頭行と末尾行の値をチェックします。
どれか 1 つでもズレていたらテストを止めてエラーにし、原因をログに出します。
これにより、誤った CSV を本番処理に流してしまうことを防ぎます。
【詳細】
目的:
- CSVファイルのヘッダー(列名)が期待通りの順序・名前で定義されているか
- CSVデータ行が期待通りの列数・行数で存在するか
- 先頭行と末尾行のセル値が期待値と完全一致しているか
引数:
- fileBuffer: CSVファイルのバッファ
- fileName: ファイル名(ダウンロード時に取得した値、ログ用)
- sizeInBytes: ファイルサイズ(ダウンロード時に取得した値、ファイル容量確認、ログ用)
- csv: csvパーサーライブラリのインスタンス(csvtojson など)
- expectedColumns: 期待するカラム名のリスト(配列)
- expectedFirstRow: カラム行を除いた先頭側の期待データ行(配列 または 配列の配列)
- expectedLastRow: カラム行を除いた末尾側の期待データ行(配列 または 配列の配列、任意)
- expectedDataRowCount: 期待するデータ行数(ヘッダー除外後の総行数)
エラーコード(テスト担当向けの補足付き):
- INVALID_ARGS:
関数の呼び出し引数が不正(expectedColumns が配列ではない 等)。
→ テストコードやローコード側の設定内容を確認してください。
- CSV_EMPTY:
CSVが空(0行)。
→ テストに使っている CSV ファイルにヘッダー行が入っているか確認してください。
- CSV_EXPECTED_DATA_COLUMN_MISMATCH:
期待データ(先頭/末尾)の列数が expectedColumns と一致していない。
→ テストコード側の期待値配列と、仕様上のカラム数が揃っているか確認してください。
- CSV_HEADER_COLUMN_COUNT_MISMATCH:
ヘッダー列数の不一致。
→ CSV の 1 行目の項目数が、仕様書どおりか確認してください。
- CSV_HEADER_COLUMN_NAME_MISMATCH:
ヘッダー列名の不一致。
→ CSV の 1 行目の項目名が、仕様書どおりか確認してください。
- CSV_DATA_ROW_COUNT_MISMATCH:
データ行数の不一致。
→ 想定している件数(テスト仕様)と、CSV に入っているデータ行数が一致しているか確認してください。
- CSV_DATA_ROW_COLUMN_COUNT_MISMATCH:
データ行の列数不一致。
→ 問題の行だけ列が欠けていないか、余計な区切り文字が入っていないか確認してください。
- CSV_DATA_VALUE_MISMATCH:
データ値の不一致。
→ 指摘された行・列の値が、テスト仕様どおりか確認してください。
検証方式:
チェック項目 | 動作 | 方式
------------------------|-------------------------|-----------
ヘッダー列数 | 不一致で即終了 | Fail fast
ヘッダー列名 | 最初の不一致で即終了 | Fail fast
データ行数 | 不一致で即終了 | Fail fast
各行の列数 | 最初の不一致で即終了 | Fail fast
データ値(先頭・末尾行) | 最初の不一致で即終了 | Fail fast
備考:
- CSV は UTF-8 エンコーディング前提です。Shift-JIS 等の CSV を扱う場合は、
呼び出し側で UTF-8 に変換してから渡してください。
*/
// 1. 入力値の前提チェック
// expectedColumns は必須。配列でなければ呼び出し側の設定ミスとみなす。
if (!Array.isArray(expectedColumns)) {
const err = new Error('expectedColumns が配列ではありません');
err.code = 'INVALID_ARGS';
return Promise.reject(err);
}
if (expectedFirstRow == null) {
const err = new Error('expectedFirstRow が指定されていません');
err.code = 'INVALID_ARGS';
return Promise.reject(err);
}
if (typeof expectedDataRowCount !== 'number') {
const err = new Error('expectedDataRowCount が数値で指定されていません');
err.code = 'INVALID_ARGS';
return Promise.reject(err);
}
// 2. CSV文字列の準備(Buffer → UTF-8文字列, BOM除去)
// バッファを UTF-8 文字列に変換
let csvStr = fileBuffer.toString("utf8");
// BOM (Byte Order Mark) が存在する場合は除去
if (csvStr.charCodeAt(0) === 0xFEFF) {
csvStr = csvStr.substring(1);
}
// 3. CSV をパース
// csv: csvtojson のインスタンス(Validate download の npm 引数で渡される)
return csv({
noheader: true,
output: "csv"
})
.fromString(csvStr)
.then(csvRows => {
// 4. パース結果の存在チェック
if (!csvRows || csvRows.length === 0) {
const err = new Error('CSVにヘッダー行がありません(0行)');
err.code = 'CSV_EMPTY';
throw err;
}
console.log(`[CSV検証] パース結果: ${csvRows.length}行 × ${csvRows[0]?.length || 0}列`);
// 5. ヘッダー行とデータ行に分割
const header = csvRows[0];
const dataRows = csvRows.slice(1);
// 6. 期待データ(先頭・末尾)を配列の配列形式に正規化
const normalizeExpectedRows = (rows) => {
if (!rows || rows.length === 0) {
return [];
}
// rows[0] が配列なら既に2次元配列、そうでなければ1次元配列とみなして配列で包む
return Array.isArray(rows[0]) ? rows : [rows];
};
const normalizedExpectedFirstRows = normalizeExpectedRows(expectedFirstRow);
const normalizedExpectedLastRows = normalizeExpectedRows(expectedLastRow);
console.log(`[CSV検証] 期待データ(先頭): ${normalizedExpectedFirstRows.length}行`);
console.log(`[CSV検証] 期待データ(末尾): ${normalizedExpectedLastRows.length}行`);
// 7. 期待データ(先頭・末尾)側の列数チェック
const assertExpectedRowsColumnCount = (normalizedRows, label) => {
if (normalizedRows.length === 0) {
return;
}
if (normalizedRows[0].length !== expectedColumns.length) {
const err = new Error(
`期待データ(${label})1行目の列数が expectedColumns と一致しません。期待値: ${expectedColumns.length}列, 実際: ${normalizedRows[0].length}列`
);
err.code = 'CSV_EXPECTED_DATA_COLUMN_MISMATCH';
throw err;
}
};
assertExpectedRowsColumnCount(normalizedExpectedFirstRows, '先頭');
assertExpectedRowsColumnCount(normalizedExpectedLastRows, '末尾');
// 8. ヘッダー列数の検証
console.log(`[CSV検証] ヘッダー列数チェック: 期待=${expectedColumns.length}, 実際=${header.length}`);
if (header.length !== expectedColumns.length) {
console.log(`[CSV検証] [NG] ヘッダーの列数が一致しません。期待値: ${expectedColumns.length}列, 実際: ${header.length}列`);
const err = new Error(`ヘッダーの列数が一致しません。期待値: ${expectedColumns.length}列, 実際: ${header.length}列`);
err.code = 'CSV_HEADER_COLUMN_COUNT_MISMATCH';
throw err;
}
console.log('[CSV検証] [OK] ヘッダー列数チェックOK');
// 9. ヘッダー列名の検証(各列ごとに比較)
console.log('[CSV検証] ヘッダー列名チェック開始');
for (let i = 0; i < expectedColumns.length; i++) {
const expected = String(expectedColumns[i]);
const actual = String(header[i]);
const match = expected === actual;
const mark = match ? 'OK' : 'NG';
console.log(`[CSV検証] 列${i}: 期待="${expected}", 実際="${actual}" [${mark}]`);
if (!match) {
console.log(`[CSV検証] [NG] ヘッダー列名が一致しません: 位置${i}, 期待値="${expected}", 実際="${actual}"`);
const err = new Error(`ヘッダー列名が一致しません: 位置${i}, 期待値="${expected}", 実際="${actual}"`);
err.code = 'CSV_HEADER_COLUMN_NAME_MISMATCH';
throw err;
}
}
console.log('[CSV検証] [OK] ヘッダー列名チェックOK');
// 10. データ行数の検証(ヘッダー除外後の行数)
if (typeof expectedDataRowCount !== 'number') {
const err = new Error('expectedDataRowCount が数値で指定されていません');
err.code = 'CSV_DATA_ROW_COUNT_MISMATCH';
throw err;
}
console.log(`[CSV検証] データ行数チェック: 期待=${expectedDataRowCount}, 実際=${dataRows.length}`);
if (dataRows.length !== expectedDataRowCount) {
console.log(`[CSV検証] [NG] データ行数が一致しません。期待値: ${expectedDataRowCount}行, 実際: ${dataRows.length}行`);
const err = new Error(`データ行数が一致しません。期待値: ${expectedDataRowCount}行, 実際: ${dataRows.length}行`);
err.code = 'CSV_DATA_ROW_COUNT_MISMATCH';
throw err;
}
console.log('[CSV検証] [OK] データ行数チェックOK');
// 11. 各データ行の列数検証
console.log('[CSV検証] 各行の列数チェック開始');
for (let rowIndex = 0; rowIndex < dataRows.length; rowIndex++) {
const match = dataRows[rowIndex].length === expectedColumns.length;
const mark = match ? 'OK' : 'NG';
console.log(`[CSV検証] 行${rowIndex + 1}: 期待=${expectedColumns.length}列, 実際=${dataRows[rowIndex].length}列 [${mark}]`);
if (!match) {
console.log(`[CSV検証] [NG] データ行${rowIndex + 1}の列数が一致しません。期待値: ${expectedColumns.length}列, 実際: ${dataRows[rowIndex].length}列`);
const err = new Error(`データ行${rowIndex + 1}の列数が一致しません。期待値: ${expectedColumns.length}列, 実際: ${dataRows[rowIndex].length}列`);
err.code = 'CSV_DATA_ROW_COLUMN_COUNT_MISMATCH';
throw err;
}
}
console.log('[CSV検証] [OK] 各行の列数チェックOK');
// 12. データ値の検証(先頭・末尾行)
const formatValue = (value) => value.length > 100 ? value.slice(0, 100) + '...(省略)' : value;
const assertRowValues = (expectedRow, actualRow, logicalRowIndex, label) => {
console.log(`[CSV検証] データ行${logicalRowIndex + 1}(${label})の値チェック開始`);
if (!actualRow) {
console.log(`[CSV検証] 行${logicalRowIndex + 1}: 行が存在しません [NG]`);
const err = new Error(`データ行${logicalRowIndex + 1}(${label})が存在しません`);
err.code = 'CSV_DATA_VALUE_MISMATCH';
throw err;
}
for (let colIndex = 0; colIndex < expectedRow.length; colIndex++) {
const expectedValue = String(expectedRow[colIndex]);
const actualValue = String(actualRow[colIndex]);
const match = actualValue === expectedValue;
const mark = match ? 'OK' : 'NG';
console.log(`[CSV検証] 行${logicalRowIndex + 1}, 列${colIndex}(${expectedColumns[colIndex]}): 期待="${formatValue(expectedValue)}", 実際="${formatValue(actualValue)}" [${mark}]`);
if (!match) {
console.log(`[CSV検証] [NG] データ値が一致しません(${label}): 行${logicalRowIndex + 1}, 列${colIndex}(${expectedColumns[colIndex]}), 期待値="${formatValue(expectedValue)}", 実際="${formatValue(actualValue)}"`);
const err = new Error(`データ値が一致しません(${label}): 行${logicalRowIndex + 1}, 列${colIndex}(${expectedColumns[colIndex]}), 期待値="${formatValue(expectedValue)}", 実際="${formatValue(actualValue)}"`);
err.code = 'CSV_DATA_VALUE_MISMATCH';
throw err;
}
}
};
// 先頭側(normalizedExpectedFirstRows)の検証
for (let i = 0; i < normalizedExpectedFirstRows.length; i++) {
const expectedRow = normalizedExpectedFirstRows[i];
const actualRow = dataRows[i];
assertRowValues(expectedRow, actualRow, i, '先頭');
}
// 末尾側(normalizedExpectedLastRows)の検証(指定されている場合のみ)
if (normalizedExpectedLastRows.length > 0) {
for (let i = 0; i < normalizedExpectedLastRows.length; i++) {
const expectedRow = normalizedExpectedLastRows[i];
const logicalRowIndex = dataRows.length - normalizedExpectedLastRows.length + i;
const actualRow = dataRows[logicalRowIndex];
assertRowValues(expectedRow, actualRow, logicalRowIndex, '末尾');
}
}
console.log('[CSV検証] [OK] データ値チェックOK');
console.log(`[CSV検証] [OK] 全ての検証が成功しました`);
console.log(`[CSV検証] [OK] ヘッダー: ${header.length}列, データ: ${dataRows.length}行`);
return true;
});
CSV検証スニペットについて
今回のスニペットでは、次の4点を検証します。
- CSVヘッダーの確認
- データ行が1行のみの場合の検証
- データ行が複数行ある場合の検証(先頭行と末行)
- ヘッダーを除いたデータ行数の検証
同値分割、境界値分析(最小値・最大値)の考え方を取り入れ、複数行ある場合は先頭行と末行のデータをチェックするようにしています。1行のみの場合は、expectedLastRow を未指定にすることで先頭1行のみを検証できるようにしています。
サンプルコード補足
- 筆者がAIの支援を受けつつ作成したコードで、動作確認済みです
- コメントとログ出力を多めに入れているため、実運用では、不要なログを削除してご利用ください
- もっと良い書き方などありましたら、フィードバックいただけると幸いです
3.6 SAVEボタンをクリックしてテストシナリオを保存する
SAVEボタンをクリックしてテストシナリオを保存します。
4. テストシナリオの実行
以上で設定が完了したので、テストシナリオを実行し、CSVファイルの内容が期待通りであることを確認します。テストシナリオが成功すれば、CSVファイルの内容が正しく検証されたことになります。
ローカル環境とクラウド環境の違いは、次のとおりです。
| 実行環境 | 必要なもの | 起動方法 |
|---|---|---|
| ローカル | Node.js Testim CLI |
testim connect を実行 |
| クラウド (Grid) | なし | Testim画面から Run on a Grid をクリック |
4.1 ローカル環境での実行
Validate download機能を利用したテストシナリオをローカル環境で実行する場合は、Testim CLIを起動する必要があります。以下のコマンドをターミナルで実行して、Testim CLIを起動します。
testim connect
起動後、インストール成功時と同様に、以下のような出力が表示されていれば、Testim CLIの起動成功です。
Starting Testim.io CLI
Start Testim CLI on Agent mode
Running on port: <実際のポート番号が表示されます>
? Type the word "stop" or Press Ctrl + C. ›
初めてTestim CLIを利用してローカルでテスト実行する時に、ターミナル上で以下のような対象プロジェクトの選択画面が表示される場合があります。その場合は、対象プロジェクトを選択してください。
ユーザーが複数のプロジェクトに対する閲覧権限を持っているにもかかわらず、Testim CLIを用いた初めてのローカルテスト実行時にプロジェクト選択画面が表示されない場合は、いったんTestim CLIを停止し、PCを再起動したうえで再度Testim CLIを起動し、Testimのテストシナリオ画面を更新してみてください。
一方、単一のプロジェクトしか利用していない、もしくは閲覧権限が1つのプロジェクトにしか付与されていない場合は、そもそもプロジェクト選択画面が表示されない可能性があります。
初回のプロジェクト選択表示について
Testim CLIのプロジェクト表示は初回のみ?のようです。今回のプロジェクトを指定した場合、他のプロジェクトでもCLI実行を試してみましたが、特にプロジェクト選択の画面はターミナルには表示されませんでした。初回のプロジェクト選択時に認証のためのトークン?も発行されているような動きのようです。
コンソールに表示されている英文を翻訳してみたところ、
There are multiple projects associated with your user account. Please select the project you would like to connect to: › - Use arrow-keys. Return to submit.
複数のプロジェクトに登録しているユーザーの場合に接続したいプロジェクトを選択するために表示されているようです。ただ、現状の動作として、一度どこかのプロジェクトを選択すると他のプロジェクトで実行してもプロジェクト選択表示はされず、他のプロジェクトでもそのまま実行できる状態のようです。
そのため、内部の仕組みまでは分かりませんが、基本的には一度何かしらのプロジェクトを選択すれば良いようです。
プロジェクト選択したID情報の保存場所
Testim CLIで選択したプロジェクトIDは、PCのユーザーディレクトリ配下の.testimファイルに保存されます。
具体的には、以下のパスに保存されます。
- Windows:
C:\Users\<ユーザー名>\.testim - macOS/Linux:
/Users/<ユーザー名>/.testim
token: <認証トークン情報>
projectId: <選択したプロジェクトID>
誤って他のプロジェクトを選択してしまい、やり直したい時は.testimファイルを削除し、再度Testim CLIを起動後にテストシナリオ画面を更新するとプロジェクト表示がされるのでご安心ください。
ここまでの設定が完了し、Testim CLIが起動している状態であれば、ローカル環境でテストシナリオが実行できるようになります。
テストシナリオ内の Run locally with debugging または、Run locallyボタンをクリックして、テストシナリオを実行してみましょう!
4.2 クラウド環境での実行
Testimのクラウド環境でテストシナリオを実行する場合は、Testim CLIの起動は不要です。テストシナリオ内の Run on a Grid ボタンをクリックして、テストシナリオを実行してみましょう!
付録: Validate downloadステップの詳細ログの確認方法
付録として、Validate download機能のテスト実行結果ログの確認方法について説明します。ローカル環境とクラウド環境での確認方法はメニューの入口が異なりますが、基本的な流れは同じです。
ローカル環境で実行したValidate download実行ログの確認方法
- 左のRunsメニューをクリックします
- TEST RUNS タブを選択します
- 次に、対象のテストシナリオの実行結果をダブルクリックします
- テスト実施されたテストシナリオが表示されるので、「Validate download」ステップをクリックします
- 右下の歯車アイコンをクリック、または右上の歯車アイコンをクリックして、PROPERTIESを表示します
- PROPERTIES内のStep paramsをクリックして展開します
クラウド環境で実行したValidate download実行ログの確認方法
クラウド環境の場合も、基本的な確認手順はローカル環境と同じです。
- 左のRunsメニューをクリックします
- 次に、対象のテストシナリオの実行結果をダブルクリックします
- テスト実施されたテストシナリオが表示されるので、「Validate download」ステップをクリック
- 右下の歯車アイコンをクリック、または右上の歯車アイコンをクリックして、PROPERTIESを表示します
- PROPERTIES内のStep paramsをクリックして展開します
Step params内のLogsセクションを展開すると、このステップまで実行された関連ログが表示されるので、Validate downloadステップの実行ログを確認します。
今回のCSVダウンロードファイル検証フローの改善点
今回はサンプルとしてできるだけシンプルな構成を優先したため、以下のような課題が残っています。
- 比較データをハードコーディングしているため、固定値での検証しかできない
- Zipファイル形式には対応していない
実運用では、外部データやAPIから動的に比較データを取得することで、より独立性・汎用性・信頼性の高いフローにできます。また、Zipファイル形式をサポートすることで、テスト対象のカバー範囲をさらに広げられると考えています。
さいごに
TestimのValidate download機能を使用して、CSVファイルの内容を検証する方法について説明しました。TestimのValidate downloadはnpmパッケージを利用することで、様々なファイル形式に対応できます。そのため、E2Eテストにおけるファイルダウンロードの検証を自動化することができ、工数削減やヒューマンエラーによる見落としリスクの改善につながると思います。
実装にはJavaScriptを書く必要がありますが、できるだけそのまま利用できるようなサンプルコードにしましたので、トライアル時の短い期間やちょっと試してみたい時などにお試しいただけるのではないかと思います。
まずは本記事の実装フローやサンプルコードをそのままコピーして、一度テストを実行してみることをおすすめします。そのうえで、自分たちのプロダクトのCSVに合わせて期待値やカラム定義を差し替えていけば、スムーズに実運用へ発展させられるのではないでしょうか。
E2E自動テストでCSVファイルの内容を検証に困っている方や、TestimのValidate download機能に興味がある方は、本記事を参考にしていただければ幸いです。ここまで読んでいただき、ありがとうございました。
















