Autify自動テストの実行→結果集計→再実行の効率化について
はじめに
こんにちは、品質向上チームの吉田です。 普段の業務では、手動テスト・自動テスト・品質分析を担当しています。
弊社では自社サイトのリグレッションテストを、Autify自動テストにて行なっています。
リグレッションテストの運用は、準備したテストシナリオが全て成功したら完了としています。
そのため失敗するテストシナリオが無くなるまで再実行を繰り返す必要がありますが、大量にテストシナリオが失敗した場合には、再実行するだけでも多くの手間が掛かっていました。またテストシナリオ数が多い場合には、Autifyのテスト結果画面のみでテスト結果を管理することは難しく、正確なテスト結果報告が困難な状況でした。
自動テストといえばテストシナリオ作成に注目しがちですが、自動テストの運用フェーズに入った際に、テストシナリオ作成以外の作業に予想以上の手間や工数がかかる事を実感しました。具体的には、テスト実行 → テスト結果集計 → テスト再実行に苦労したので、それらの作業を効率化するためにスプレッドシートでテスト結果集計ツールを作成しました。本記事ではどのように効率化したのかを紹介させていただきます。
テスト実行
Autifyでのリグレッションテストの際に実行するテストシナリオ数は、約440本です。このテストシナリオをAutifyの画面上から実行する場合、440回実行ボタンを押下する必要があります。さすがにそれは非効率なので、まずはテストプランにテストシナリオを紐付けることで実行の手間を削減することにしました。しかし、弊社ではテスト対象サイトが23サイトあるので、それに併せてテストプランも23あります。そのためテストプランを実行する場合でも、23回もテスト実行ボタンを押下する必要がありました。この手動実行の手間を削減するため、Autify Command Line Interface (CLI)を活用して実行する事を検討しました。結果としてはファイルに23サイト分のテストプラン実行コマンドを記述し、Autify CLIにて実行することで全テストプランが一括実行できるようになりました。
Autify CLIでテストプランを一括実行する方法を以下に紹介します。
実行コマンド記述例(テストプラン実行.sh)
autify web api execute-schedule --schedule-id 100001 # STG環境_並列実行_site1
autify web api execute-schedule --schedule-id 100002 # STG環境_並列実行_site2
autify web api execute-schedule --schedule-id 100003 # STG環境_並列実行_site3
autify web api execute-schedule --schedule-id 100004 # STG環境_並列実行_site4
autify web api execute-schedule --schedule-id 100005 # STG環境_並列実行_site5
ターミナルを開き、上記のテストプラン実行.shをAutify CLIで実行
test-Mac@wn ~ % '/Users/admin/テストプラン実行.sh'
{
"data": {
"id": "2665464",
"type": "test_plan_result",
"attributes": {
"id": 2665464
}
}
}
{
"data": {
"id": "2665465",
"type": "test_plan_result",
"attributes": {
"id": 2665465
}
}
}
テスト結果集計
弊社ではリグレッションテストの際に23本のテストプランを実行するので、下記画像のようなテスト結果一覧が表示されます。1つのテストプランで完結するのであれば、Autifyのテスト結果画面でもテスト結果報告がしやすいかもしれません。しかし多数のテストプランをサマリーして分かりやすい形で結果報告する場合には、スプレットシート等にテスト結果を出力して成形する必要が出てきます。
2023年11月時点では、テスト結果をAutifyのテスト結果画面からcsv形式等でダウンロードできません。そこでAutify APIの/projects/{project_id}/results/{result_id}を用いて取得することにしました。Autify APIで結果取得する際にはテスト結果IDが必要となりますが、このテスト結果IDをコマンド実行ログから取得できるようにもしました。
具体的な手順は下記となります。
1. 集計したいテストプランのテスト結果IDを取得
-
テストプラン実行コマンドのログをA列に貼り付け
-
テスト結果IDをカンマ区切りにしてコピー(スプレの関数にて、テスト結果IDはカンマ区切りでD4セルに出力される)
参考までにセル内の関数は下記となります。
D1セル内の関数:=B2&","&B3&","&B4&","&B5&","&B6&","&B7&","&B8&","&B9&","&B10&","&B11&","&B12&",・・・
D4セル内の関数:=SUBSTITUTE(SUBSTITUTE(D1,D2,""),D3,"")
2. テスト結果のダウンロード
-
コピーしたテスト結果IDをテスト結果ID入力欄に入力
-
テスト結果ダウンロードボタンを押下
-
6行目以降に実行結果が出力される
参考までに「テスト結果ダウンロード」ボタンの処理は下記となります。
function getResult() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SpreadsheetApp.getActiveSheet().getName());
const token = PropertiesService.getScriptProperties().getProperty('AUTIFY_PERSONAL_ACCESS_TOKEN');
const scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('AUTIFY_PERSONAL_ACCESS_TOKEN', '******************');
scriptProperties.setProperty('PROJECT_ID', '***');
var cntRow = 5;
var cntParameter = 1;
var test_case_id_now;
var test_case_id_next;
// データ初期化
// フィルタ削除
if(sheet.getFilter() != null ){
sheet.getFilter().removeColumnFilterCriteria(1); //1列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(2); //2列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(3); //3列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(4); //4列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(5); //5列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(6); //6列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(7); //7列目のフィルタを全てチェックを入れた状態にする
sheet.getFilter().removeColumnFilterCriteria(8); //8列目のフィルタを全てチェックを入れた状態にする
}
sheet.getRange("A:H6").clearContent(); //前回書き込まれたデータを削除
// スプレからテスト結果IDを取得
var resultIdStr = ss.getRangeByName('テスト結果ID入力').getValue();
var resultIdArray = resultIdStr.split(',');
// テスト結果ID分ループ
for(var cnt=0; cnt<resultIdArray.length; cnt++){
scriptProperties.setProperty('RESULT_ID',resultIdArray[cnt]);
const projectId = PropertiesService.getScriptProperties().getProperty('PROJECT_ID');
const resultId = PropertiesService.getScriptProperties().getProperty('RESULT_ID');
const url = 'https://app.autify.com/api/v1/projects/' + projectId + "/results/" + resultId;
const options = {
'method': 'get',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + token
},
}
const response = UrlFetchApp.fetch(url, options);
const json = response.getContentText();
const data = JSON.parse(json);
const test_plan_capability_results = Object.entries(data["test_plan_capability_results"]);
for(var i=0; i<data.test_plan_capability_results[0].test_case_results.length; i++) {
if (!data.test_plan_capability_results[0].test_case_results.length) {
Logger.log('終了')
break;
}
cntRow++;
sheet.appendRow([data.test_plan_capability_results[0].test_case_results[i].test_case_id,
"=IFERROR(mid(VLOOKUP(A" + (cntRow) + ",'シナリオ一覧'!A:C,3,false),1,100),\"\"\)" + "\&\"_" + (i+1) + "\"",
data.test_plan_capability_results[0].test_case_results[i].status,
data.test_plan_capability_results[0].test_case_results[i].review_needed,
data.test_plan_capability_results[0].test_case_results[i].project_url,
"=if($C" + (cntRow) + "=\"passed\",\"\",(\"autify web test run https://app.autify.com/projects/***/scenarios/\" & $A" + (cntRow) + " & \" --name \"\"\" & $B" + (cntRow) + " & \"\"\"\"))",
]);
}
}
}
テスト再実行(方法1)
テスト結果を集計した後に、失敗したテストシナリオのみ抽出して再実行します。
再実行の工数を削減するため、再実行用のコマンドを自動出力するようにしました。
具体的な手順は下記となります。
1. 失敗したテストシナリオのみを再実行する
-
ステータス(C列)を「failed」でフィルタする
-
自動出力された再実行コマンド(F列)をコピー
参考までにセル内の関数は下記となります。
F6セル内の関数:=if($C6="passed","",("autify web test run https://app.autify.com/projects/***/scenarios/" & $A6 & " --name """ & $B6 & """"))
2. ターミナルを開き、コピーした再実行コマンドを貼り付けて実行する
test-Mac@wn ~ % autify web test run https://app.autify.com/projects/000/scenarios/000001 --name "ホーム_ポートフォリオ_ナビゲーション_tokyupoint_16"
autify web test run https://app.autify.com/projects/000/scenarios/000002 --name "NISA_申込_新規_税務署不備_再申込_(誤認防止あり)_SSNB_8"
autify web test run https://app.autify.com/projects/000/scenarios/000003 --name "NISA_申込_新規_税務署不備_再申込_(誤認防止あり)_SSNB_9"
test-Mac@wn ~ % autify web test run https://app.autify.com/projects/000/scenarios/00001
autify web test run https://app.autify.com/projects/000/scenarios/00002
autify web test run https://app.autify.com/projects/000/scenarios/00003
✅ Successfully started: https://app.autify.com/projects/000/results/2723031 (Capability is Linux Chrome 116.0)
To wait for the test result, run the command below:
💻 $ autify web test wait https://app.autify.com/projects/000/results/2723031
✅ Successfully started: https://app.autify.com/projects/000/results/2723032 (Capability is Linux Chrome 116.0)
To wait for the test result, run the command below:
💻 $ autify web test wait https://app.autify.com/projects/000/results/2723032
✅ Successfully started: https://app.autify.com/projects/000/results/2723033 (Capability is Linux Chrome 116.0)
To wait for the test result, run the command below:
💻 $ autify web test wait https://app.autify.com/projects/000/results/2723033
✅ Successfully started: https://app.autify.com/projects/000/results/2723034 (Capability is Linux Chrome 116.0)
To wait for the test result, run the command below:
💻 $ autify web test wait https://app.autify.com/projects/000/results/2723034
3. テストシナリオが失敗する場合には手順1〜2を繰り返す(失敗が続く場合には、エラー原因を調査)
テスト再実行(方法2)
テスト再実行(方法1)は、テストプランで設定した情報を引き継がずに実行されます。そのため例えば、テストプラン内で「シナリオ内のURL置換」を設定した場合でも、シナリオ内のURL置換は行われず実行されてしまいます。
これに対して、Autifyテスト結果画面の再実行ボタンを押下した場合は、テストプラン内で設定した情報を引き継いで実行されます。
テストプラン内で何も設定していない場合だとテスト再実行(方法1)でも問題ありませんが、テストプラン内で設定している場合だとAutifyテスト結果画面の再実行ボタンを押下する必要があります。
それでは「Autifyテスト結果画面の再実行ボタン押下」を効率的に行うにはどうすればいいか?
解決策として考えたのが、AutifyでAutifyを操作して再実行ボタンを押すという方法です。
具体的な手順は下記となります。
1. 失敗したAutifyテスト結果画面に遷移し、再実行ボタンを押下するシナリオを作成
2. 失敗したテストシナリオの結果画面(E列)を取得
3. 上記で取得した一覧をテストシナリオのデータにセット
4. 1で作成したシナリオを実行する
5. テストシナリオが失敗する場合には手順2〜4を繰り返す(失敗が続く場合には、エラー原因を調査)
最後に
Autify CLIやテスト結果集計ツールを用いて、全てのテストシナリオが成功するまで再実行を繰り返すことで、効率的にリグレッションテストを完了させることができるようになりました。
また弊社では一部の開発チームがAutifyにて自動テストを行なっていますが、開発チームにも上記の手順を共有したところ、自動テストの作業効率が上がったとの報告をもらえました。
Autifyを導入されていて、結果集計や再実行にお悩みの場合には、今回紹介させていただいた方法が参考になるかもしれません。
明日は、プロダクトマネージャー 梅津 の「目的を意識する」です!
お楽しみに!
📣ウェルスナビは一緒に働く仲間を募集しています📣
著者プロフィール
吉田 政幸(よしだ まさゆき)
Webサイト構築等の開発経験を積んだ後、メーカーにてカメラ本体・スマホ本体・アプリ等のテスト業務に従事。2019年4月にウェルスナビに初のQAエンジニアとして入社し、QAチームの立ち上げに参画。
Discussion