レポートAPI - 実行結果をまとめてCSVに書き出すNode.jsスクリプトの例

mablレポートAPIのバッチ結果エンドポイントで以下のNode.jsスクリプトの例を使用してテスト実行結果をまとめて取得し、これらをCSV形式に変換することができます。

セットアップ

このスクリプト例を実行するには、Node.jsをインストールする必要があります。各種主要プラットフォーム向けのNode.jsはここから入手できます。

Node.jsがインストールされたら、mablレポートAPIなどのAPIとやり取りするためのaxiosライブラリを合わせてインストールする必要があります。コマンドラインで、このスクリプトを作成するディレクトリに移動し、Node.jsに付属しているnpmを使ってaxiosライブラリをインストールします。

npm install [email protected] --save

スクリプト例

以下のスクリプトを、axiosをインストールしたディレクトリにindex.jsという名前で保存します。すべてのフィールドをCSVに出力する必要がない場合やフィールドの順序を変更したい場合は、スクリプトのTEST_RUN_FIELDSリストを編集できます。

const axios = require('axios');
const process = require('process');
const fs = require('fs');

// Check correct number of arguments and provide usage help
if (process.argv.length < 5 || process.argv.length > 6) {
  console.error('Usage: node index.js WORKSPACE_ID MABL_API_KEY OUTPUT_FILE [API_QUERY_PARAMS]');
  process.exit(1);
}

const WORKSPACE_ID = process.argv[2];
const MABL_API_KEY = process.argv[3];
const OUTPUT_FILE = process.argv[4];
const QUERY_PARAMS = process.argv[5];

let MABL_ENDPOINT_URL = `https://api.mabl.com/results/workspace/${WORKSPACE_ID}/testRuns?${QUERY_PARAMS || ''}`;

// Ordered fields to extract from each test run
const TEST_RUN_FIELDS = [
  'application_id',
  'application_name',
  'environment_id',
  'environment_name',
  'initial_url',
  'scenario_name',
  'browser',
  'browser_version',
  'execution_runner_type',
  'plan_id',
  'plan_name',
  'plan_run_id',
  'test_id',
  'test_version',
  'test_name',
  'test_type',
  'branch',
  'test_run_id',
  'test_run_app_url',
  'is_ad_hoc_run',
  'failure_category',
  'start_time',
  'end_time',
  'run_time',
  'status',
  'success',
  'trigger_type',
  'triggering_deployment_event_id',
  'emulation_mode',
  'metrics.cumulative_speed_index',
  'metrics.cumulative_api_response_time',
  'metrics.accessibility_rule_violations.critical',
  'metrics.accessibility_rule_violations.serious',
  'metrics.accessibility_rule_violations.moderate',
  'metrics.accessibility_rule_violations.minor',
];

function getField(object, field) {
  return field
    .split('.')
    .reduce((currentObject, currentField) =>  currentObject === undefined || currentObject === null ? undefined : currentObject[currentField], object);
}

async function getRunResults(cursor) {
  let url = MABL_ENDPOINT_URL;
  if (cursor !== undefined) {
    url += `&cursor=${cursor}`;
  }
  console.log(`Fetching results with cursor=${cursor}`);
  const response = await axios.get(url, {
    auth: {
      username: 'key',
      password: MABL_API_KEY,
    }
  });
  if (!response.data) {
    console.error(`No data returned from mabl API; full response: ${JSON.stringify(response)}`);
  }
  return response.data;
}

function getResultFields(results) {
  return results.map(result => {
    return TEST_RUN_FIELDS
      .map(field => escapeValue(getField(result, field)));
  });
}

function escapeValue(value) {
  if (value === undefined) {
    return '';
  }
  if (typeof value === 'string') {
    return value.replace(/,/g, '_');
  }
  return value;
}

function resultRowsToCsv(results) {
  return results
    .map(row => row.join(','))
    .join('\n') + '\n';
}

async function getAllRunResults() {
  let cursor;
  const outStream = fs.createWriteStream(OUTPUT_FILE);
  outStream.write(resultRowsToCsv([TEST_RUN_FIELDS]));
  do {
    const data = await getRunResults(cursor);
    if (data) {
      cursor = data.cursor;
      const results = getResultFields(data.test_results || []);
      outStream.write(resultRowsToCsv(results));
    } else {
      break;
    }
  } while (cursor !== undefined);
  outStream.end();
}

getAllRunResults().catch(console.error);

スクリプトの実行

コマンドラインからindex.jsスクリプトを呼び出し、mablレポートAPIの結果を取得して、これらをCSVファイルに保存します。

node index.js <WORKSPACE_ID> <API_KEY> <OUT_FILE> <QUERY_PARAMETER_STRING>

このindex.jsスクリプトでは、次の引数を使用します。

  • <WORKSPACE_ID>: <WORKSPACE_ID>をワークスペースIDに置き換える
  • <API_KEY>: ワークスペースの所有者にmabl Viewer APIキーを作成してもらうか、既存のmabl Viewer APIキーを使用して、<API_KEY>をキーシークレットに置き換える
  • <OUT_FILE>: <OUT_FILE>を出力ファイル名 (results.csvなど) に置き換える
  • <QUERY_PARAMETER_STRING>: このオプション引数を使用して結果をフィルタリングする

APIのバッチ実行結果エンドポイントに関するAPIのドキュメントを参照して、利用可能なクエリパラメーターを見つけ、適切なクエリパラメーター文字列を作成して<QUERY_PARAMETER_STRING>を置き換えます。

たとえば、一定の時間範囲内のすべての実行を指定するには、https://www.epochconverter.com/を使って目的の開始日時と終了日時のタイムスタンプ (ミリ秒単位) を取得し、これを次のように、クエリパラメーター内で使用します。earliest_run_start_time=1677506400000&latest_run_start_time=1677592800000