test-generation について
要件、ユーザーストーリー、既存機能から Automated Test Framework(ATF)テストを設計・作成する ServiceNow スキルです。開発者やテスト担当者向けに、ステップ、アサーション、テストデータの後処理、スイート管理、結果分析を扱います。
主な機能
- 01要件からの ATF テスト生成
- 02順序付きステップとアサーションの作成
- 03テストデータの準備と後処理
- 04テストのスイートへの編成
- 05テストとステップ結果の分析
活用シーン
- 01新機能の回帰テスト追加
- 02手動テスト計画の ATF テスト化
- 03CI/CD テストスイートの構築
- 04ビジネスルール、クライアントスクリプト、ワークフローの検証
MCP 対応
SN-Query-Table や SN-Create-Record などの MCP ツールで ATF 設定や結果を確認し、テスト、ステップ、スイートとの関連を作成します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill test-generationインストール後、Claude Code で/test-generationを入力して読み込まれたか確認します。
詳細
ATF テスト生成
概要
このスキルを使用すると、要件、ユーザーストーリー、または既存の ServiceNow 機能から Automated Test Framework(ATF)テストを生成できます。対象となる内容は次のとおりです。
- メタデータ、説明、設定を含む
sys_atf_testのテストレコードの作成 - レコード操作、フォーム操作、サーバーサイドスクリプト用の順序付きテストステップを
sys_atf_stepに生成 - 期待される動作と実際の結果を照合するアサーションの作成
- 独立性と再現性のあるテストのためのテストデータのセットアップおよび後処理ステップの作成
sys_atf_test_suite_testを使用したテストスイートへのテストの整理- 品質レポート作成のための
sys_atf_test_resultからのテスト結果の分析
使用する場面: 自動回帰テストが必要な新機能を開発するとき、手動テスト計画を ATF テストに変換するとき、CI/CD パイプラインのテストスイートを構築するとき、またはビジネスルール、クライアントスクリプト、ワークフローを検証するときに使用します。
価値: テストを自動生成することで、ATF テストの作成時間を 70~80%削減し、一貫したテスト品質を確保するとともに、CI/CD パイプライン向けの回帰テスト範囲を迅速に拡大できます。
前提条件
- プラグイン:
com.snc.automated_test_framework(Automated Test Framework) - ロール:
atf_test_admin、atf_test_designer、またはadmin - アクセス権:
sys_atf_test、sys_atf_step、sys_atf_step_configおよび関連する ATF テーブルへの読み取り/書き込みアクセス - 知識: テスト対象の機能、期待される動作、ServiceNow の ATF ステップタイプに関する理解
手順
ステップ 1:要件または機能を分析する
テストする対象を特定し、テスト可能なシナリオに分割します。
対象テーブルの既存のビジネスルール、クライアントスクリプト、またはワークフローを検索します。
MCP を使用する場合(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sys_script
query: collection=[table_name]^active=true
fields: sys_id,name,when,filter_condition,script,active,order
limit: 20
同じ領域の既存テストを検索し、重複を避けます。
Tool: SN-Query-Table
Parameters:
table_name: sys_atf_test
query: descriptionLIKE[feature_keyword]^ORnameLIKE[feature_keyword]
fields: sys_id,name,description,status,sys_updated_on,test_suite
limit: 20
REST API を使用する場合:
GET /api/now/table/sys_atf_test?sysparm_query=descriptionLIKE[feature_keyword]&sysparm_fields=sys_id,name,description,status,sys_updated_on&sysparm_limit=20&sysparm_display_value=true
使用可能なステップ設定を特定します。
Tool: SN-Query-Table
Parameters:
table_name: sys_atf_step_config
query: active=true
fields: sys_id,name,category,description,batch_order_constraint
limit: 50
order_by: category,name
ステップ 2:テストレコードを作成する
説明的なメタデータを含むテストを生成します。
MCP を使用する場合:
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_test
fields:
name: "Validate Incident Priority Calculation Business Rule"
description: |
Tests the priority lookup business rule on the incident table.
Scenarios covered:
1. Impact=1 + Urgency=1 should set Priority=1 (Critical)
2. Impact=2 + Urgency=2 should set Priority=3 (Moderate)
3. Impact=3 + Urgency=3 should set Priority=4 (Low)
4. Changing Impact should recalculate Priority
5. Priority field should be read-only after calculation
Related requirement: REQ-2026-0145
Related story: STY0015678
status: design
active: true
application: [app_scope_sys_id]
category: functional
priority: 2
REST API を使用する場合:
POST /api/now/table/sys_atf_test
Content-Type: application/json
{
"name": "Validate Incident Priority Calculation Business Rule",
"description": "Tests the priority lookup business rule on the incident table.",
"status": "design",
"active": "true",
"category": "functional",
"priority": "2"
}
ステップ 3:テストデータのセットアップステップを生成する
既知のデータを使用してテスト環境を準備するステップを作成します。
MCP を使用する場合:
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_step
fields:
test: [test_sys_id]
step_config: [create_record_step_config_sys_id]
order: 100
description: "Create test incident with Impact=1 and Urgency=1"
active: true
inputs: |
{
"table": "incident",
"fields": {
"short_description": "ATF Test - Priority Calculation P1",
"caller_id": "javascript:gs.getUserID()",
"impact": "1",
"urgency": "1",
"category": "software",
"assignment_group": "javascript:new GlideRecord('sys_user_group').get('name', 'Service Desk') ? current.sys_id : ''"
}
}
output_variable: test_incident_p1
REST API を使用する場合:
POST /api/now/table/sys_atf_step
Content-Type: application/json
{
"test": "[test_sys_id]",
"step_config": "[create_record_step_config_sys_id]",
"order": "100",
"description": "Create test incident with Impact=1 and Urgency=1",
"active": "true"
}
ステップ 4:アサーションステップを生成する
期待される結果を検証するステップを作成します。
MCP を使用する場合:
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_step
fields:
test: [test_sys_id]
step_config: [assert_record_values_step_config_sys_id]
order: 200
description: "Assert Priority is set to 1 (Critical) when Impact=1, Urgency=1"
active: true
inputs: |
{
"table": "incident",
"sys_id": "{{test_incident_p1.sys_id}}",
"assertions": [
{
"field": "priority",
"operator": "=",
"expected": "1"
}
]
}
複雑なアサーション用のサーバーサイドスクリプトステップを作成します。
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_step
fields:
test: [test_sys_id]
step_config: [run_server_side_script_step_config_sys_id]
order: 300
description: "Validate priority matrix lookup logic"
active: true
inputs: |
{
"script": "var gr = new GlideRecord('incident');\ngr.get('{{test_incident_p1.sys_id}}');\n\nvar expectedPriority = '1';\nvar actualPriority = gr.getValue('priority');\n\nstepResult.setOutputMessage('Expected: ' + expectedPriority + ', Actual: ' + actualPriority);\nstepResult.assertEqual({\n name: 'Priority calculation for Impact=1, Urgency=1',\n shouldbe: expectedPriority,\n value: actualPriority\n});"
}
ステップ 5:複数のテストシナリオを生成する
ステップの一括生成を使用して、包括的なテスト範囲を作成します。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Generate ATF test steps for all priority matrix combinations
script: |
var testId = '[test_sys_id]';
var createStepConfig = '[create_record_step_config_sys_id]';
var assertStepConfig = '[assert_record_values_step_config_sys_id]';
var cleanupStepConfig = '[delete_record_step_config_sys_id]';
// Priority matrix: Impact x Urgency = Priority
var matrix = [
{ impact: 1, urgency: 1, expected_priority: 1, label: 'Critical' },
{ impact: 1, urgency: 2, expected_priority: 2, label: 'High' },
{ impact: 1, urgency: 3, expected_priority: 2, label: 'High' },
{ impact: 2, urgency: 1, expected_priority: 2, label: 'High' },
{ impact: 2, urgency: 2, expected_priority: 3, label: 'Moderate' },
{ impact: 2, urgency: 3, expected_priority: 3, label: 'Moderate' },
{ impact: 3, urgency: 1, expected_priority: 2, label: 'High' },
{ impact: 3, urgency: 2, expected_priority: 3, label: 'Moderate' },
{ impact: 3, urgency: 3, expected_priority: 4, label: 'Low' }
];
var stepOrder = 100;
var createdSteps = 0;
matrix.forEach(function(combo) {
var varName = 'incident_i' + combo.impact + '_u' + combo.urgency;
// Create record step
var create = new GlideRecord('sys_atf_step');
create.initialize();
create.test = testId;
create.step_config = createStepConfig;
create.order = stepOrder;
create.description = 'Create incident: Impact=' + combo.impact + ', Urgency=' + combo.urgency;
create.active = true;
create.insert();
stepOrder += 50;
createdSteps++;
// Assert step
var assert = new GlideRecord('sys_atf_step');
assert.initialize();
assert.test = testId;
assert.step_config = assertStepConfig;
assert.order = stepOrder;
assert.description = 'Assert Priority=' + combo.expected_priority + ' (' + combo.label + ') for Impact=' + combo.impact + ', Urgency=' + combo.urgency;
assert.active = true;
assert.insert();
stepOrder += 50;
createdSteps++;
});
gs.info('Created ' + createdSteps + ' ATF steps for ' + matrix.length + ' priority combinations');
ステップ 6:クリーンアップ(後処理)ステップを追加する
実行後にテストデータがクリーンアップされるようにします。
MCP を使用する場合:
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_step
fields:
test: [test_sys_id]
step_config: [delete_record_step_config_sys_id]
order: 9000
description: "Cleanup: Delete test incidents created during test"
active: true
inputs: |
{
"table": "incident",
"query": "short_descriptionSTARTSWITHATF Test - Priority Calculation"
}
ステップ 7:テストスイートに整理する
一括実行に適したテストスイートにテストを追加します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sys_atf_test_suite
query: active=true^nameLIKEregression^ORnameLIKEincident
fields: sys_id,name,description,active,scheduled,run_condition
limit: 10
テストをスイートに追加します。
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_test_suite_test
fields:
test_suite: [suite_sys_id]
test: [test_sys_id]
order: 500
abort_on_failure: false
REST API を使用する場合:
POST /api/now/table/sys_atf_test_suite_test
Content-Type: application/json
{
"test_suite": "[suite_sys_id]",
"test": "[test_sys_id]",
"order": "500",
"abort_on_failure": "false"
}
ステップ 8:テスト結果を確認する
テスト実行後に結果を分析します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sys_atf_test_result
query: test=[test_sys_id]^ORDERBYDESCstart_time
fields: sys_id,test,status,start_time,end_time,duration,output,run_by,failure_reason
limit: 10
ステップレベルの結果を取得します。
Tool: SN-Query-Table
Parameters:
table_name: sys_atf_step_result
query: test_result=[result_sys_id]
fields: sys_id,step,step.description,status,output,start_time,end_time,failure_reason
limit: 50
order_by: step.order
REST API を使用する場合:
GET /api/now/table/sys_atf_test_result?sysparm_query=test=[test_sys_id]^ORDERBYDESCstart_time&sysparm_fields=sys_id,test,status,start_time,end_time,duration,output,failure_reason&sysparm_limit=10&sysparm_display_value=true
ツールの使用方法
MCP ツールのリファレンス
| ツール | 使用する場面 |
|---|---|
SN-Query-Table | 既存のテスト、ステップ設定、スイート、結果の検索 |
SN-Create-Record | テスト、ステップ、スイートとの関連付けの作成 |
SN-Update-Record | テストステータスの更新、ステップの有効化/無効化 |
SN-Natural-Language-Search | 説明からテストまたは機能を検索 |
SN-Execute-Background-Script | ステップの一括生成、複雑なテストデータのセットアップ |
SN-Discover-Table-Schema | ATF テーブル構造とステップ設定オプションの調査 |
REST API リファレンス
| エンドポイント | メソッド | 目的 |
|---|---|---|
/api/now/table/sys_atf_test | GET/POST/PATCH | テストレコードを管理します |
/api/now/table/sys_atf_step | GET/POST | テストステップを作成、検索します |
/api/now/table/sys_atf_step_config | GET | 利用可能なステップタイプを確認します |
/api/now/table/sys_atf_test_suite | GET/POST | テストスイートを管理します |
/api/now/table/sys_atf_test_suite_test | POST | テストをスイートに追加します |
/api/now/table/sys_atf_test_result | GET | テスト実行結果を検索します |
ベストプラクティス
- 1 テストにつき 1 つのシナリオ: 各テストで検証するシナリオは 1 つにします。関連するシナリオはスイートでグループ化します
- わかりやすいステップ名: ステップの説明はアサーションとして記述します(例:「Impact=1、Urgency=1 の場合、優先度が Critical であることを確認する」)
- 必ずクリーンアップする: テストデータを削除するティアダウンステップを含めます。プロダクションテーブルにテストレコードを残さないでください
- 出力変数を使用する: 出力変数を使ってステップの出力を連結し、作成ステップとアサートステップ間で sys_id を渡します
- テストデータをパラメーター化する: テストデータの値には変数を使用し、要件が変わったときにテストを簡単に保守できるようにします
- 否定ケースをテストする: 無効な入力、権限拒否、エラー条件のテストを含めます
- まずサブプロダクションで実行する: 新しいテストは、プロダクションの CI/CD パイプラインに追加する前にサブプロダクションインスタンスで実行します
- テストをバージョン管理する: 適切なライフサイクル管理のため、テストをアプリケーションスコープおよび更新セットに関連付けます
トラブルシューティング
テストステップ「Create Record」が失敗する
原因: 必須フィールドが不足している、ビジネスルールによって作成がブロックされている、またはアクセス制御によってテストユーザーが拒否されている可能性があります 解決策: ステップの入力にすべての必須フィールドが指定されていることを確認します。管理者ユーザーとしてテストを実行し、ACL の問題を切り分けます。レコードの作成を妨げる可能性のあるビジネスルールの条件を確認します。
アサーションが予期しない値で失敗する
原因: ビジネスルールの実行タイミング(before と after)、非同期プロセス、または表示値と内部値の不一致が考えられます
解決策: アサーションの前にビジネスルールが実行されるよう、ステップの順序を確認します。参照には表示値ではなく sys_id を使用します。非同期処理が関係する場合は、「Wait」ステップを追加します。
テストスイートの実行がタイムアウトする
原因: ステップが多すぎる、サーバーサイドスクリプト内の負荷の高いクエリ、または外部連携のタイムアウトが考えられます 解決策: 各テストのステップ数を最大 20~30 に制限します。サーバーサイドステップ内の GlideRecord クエリを最適化します。スイートの設定で適切なタイムアウト値を設定します。
失敗後もテストデータが残る
原因: 先行するステップが失敗すると、クリーンアップステップがスキップされます(abort_on_failure=true の場合)
解決策: 重要でないステップでは abort_on_failure=false を設定するか、テスト結果に関係なく実行されるテストの「Teardown」セクションを使用します。孤立したテストデータを検出するため、クエリとともに「Delete Records」ステップタイプを使用することも検討してください。
例
例 1:ユーザーストーリーに基づくビジネスルールテスト
入力ストーリー: 「サービスデスクエージェントとして、インシデントの優先度を影響度と緊急度に基づいて自動計算し、手動で設定せずに済むようにしたい。」
生成されたテスト: すべての Impact x Urgency の組み合わせを対象とする 9 組の作成/アサートステップと、ティアダウン。
例 2:フォーム検証テスト
入力: 「インシデントをクローズするときに、「Close Notes」フィールドが必須であることをテストする」
Tool: SN-Create-Record
Parameters:
table_name: sys_atf_test
fields:
name: "Validate Close Notes Mandatory on Incident Close"
description: "Verifies that closing an incident without close_notes is blocked by UI policy or business rule."
status: design
active: true
# Steps:
# 1. Create test incident (open state)
# 2. Attempt to set state=Closed without close_notes
# 3. Assert record is NOT in Closed state (business rule should block)
# 4. Set close_notes and state=Closed
# 5. Assert record IS in Closed state
# 6. Cleanup: delete test incident
例 3:API エンドポイントテスト
入力: 「ユーザーの詳細を返すカスタムの Scripted REST API エンドポイントのテストを生成する」
# Steps:
# 1. Server-side script: Call REST API endpoint with test user sys_id
# 2. Assert: Response status = 200
# 3. Assert: Response body contains expected user name
# 4. Assert: Response body does NOT contain sensitive fields (password, token)
# 5. Server-side script: Call with invalid sys_id
# 6. Assert: Response status = 404
関連スキル
development/automated-testing- ATF の一般的な使用方法とベストプラクティスdevelopment/business-rules- テスト対象のビジネスルールを理解するdevelopment/client-scripts- 検証対象となるクライアントサイド機能development/script-includes- テスト対象となるサーバーサイドロジックadmin/deployment-workflow- ATF との CI/CD パイプライン連携spm/acceptance-criteria- 受け入れ基準からテストケースを生成する