mcpField
T
test-generation

test-generation

github.com/happy-technologies-llcテスト・品質4143 回インストール3 日前に更新
リポジトリ

test-generation について

要件、ユーザーストーリー、既存機能から Automated Test Framework(ATF)テストを設計・作成する ServiceNow スキルです。開発者やテスト担当者向けに、ステップ、アサーション、テストデータの後処理、スイート管理、結果分析を扱います。

主な機能

  1. 01要件からの ATF テスト生成
  2. 02順序付きステップとアサーションの作成
  3. 03テストデータの準備と後処理
  4. 04テストのスイートへの編成
  5. 05テストとステップ結果の分析

活用シーン

  1. 01新機能の回帰テスト追加
  2. 02手動テスト計画の ATF テスト化
  3. 03CI/CD テストスイートの構築
  4. 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-SchemaATF テーブル構造とステップ設定オプションの調査
REST API リファレンス
エンドポイントメソッド目的
/api/now/table/sys_atf_testGET/POST/PATCHテストレコードを管理します
/api/now/table/sys_atf_stepGET/POSTテストステップを作成、検索します
/api/now/table/sys_atf_step_configGET利用可能なステップタイプを確認します
/api/now/table/sys_atf_test_suiteGET/POSTテストスイートを管理します
/api/now/table/sys_atf_test_suite_testPOSTテストをスイートに追加します
/api/now/table/sys_atf_test_resultGETテスト実行結果を検索します

ベストプラクティス

  • 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 - 受け入れ基準からテストケースを生成する

コメント