mcpField
T
test-generation

test-generation

github.com/happy-technologies-llc测试与质量4143 次安装3 天前更新
代码仓库

关于 test-generation

此 ServiceNow 技能根据需求、用户故事或现有功能规划并创建 Automated Test Framework(ATF)测试,面向开发者和测试人员。它涵盖测试步骤、断言、测试数据清理、套件组织及结果分析。

主要功能

  1. 01从需求生成 ATF 测试
  2. 02创建有序步骤与断言
  3. 03设置测试数据及清理步骤
  4. 04将测试加入测试套件
  5. 05分析测试与步骤结果

适用场景

  1. 01为新功能补充回归测试
  2. 02将手动测试计划转为 ATF 测试
  3. 03构建 CI/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 功能生成自动化测试框架(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(自动化测试框架)
  • 角色: 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_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查询测试执行结果

最佳实践

  • 每个测试覆盖一个场景: 每个测试都应验证单一场景;使用套件对相关场景分组
  • 步骤名称应清晰描述意图: 将步骤描述写成断言(例如,“验证 Impact=1、Urgency=1 时,优先级为 Critical”)
  • 始终清理数据: 包含用于删除测试数据的拆卸步骤;切勿将测试记录留在生产表中
  • 使用输出变量: 通过输出变量串联步骤输出,在创建和断言步骤之间传递 sys_id
  • 参数化测试数据: 使用变量存储测试数据值,以便在需求变更时轻松维护测试
  • 测试负面场景: 包含无效输入、权限拒绝和错误条件的测试
  • 先在非生产环境运行: 将新测试加入生产 CI/CD 流水线之前,先在非生产实例中执行
  • 对测试进行版本控制: 将测试关联到应用范围和更新集,以妥善管理生命周期

故障排除

测试步骤“Create Record”失败

原因: 缺少必填字段、业务规则阻止创建,或访问控制拒绝测试用户的访问 解决方案: 检查步骤输入中是否提供了所有必填字段。以管理员用户身份运行测试,以排除 ACL 问题。检查可能阻止记录创建的业务规则条件。

断言失败,实际值与预期不符

原因: 业务规则执行时机(之前还是之后)、异步进程,或显示值与内部值不匹配 解决方案: 确认步骤顺序可确保在断言前业务规则已执行。查找记录时使用 sys_id 引用,而非显示值。如果涉及异步操作,请添加“Wait”步骤。

测试套件执行超时

原因: 步骤过多、服务器端脚本中的查询开销过大,或外部集成超时 解决方案: 将每个测试限制在最多 20-30 个步骤。优化服务器端步骤中的 GlideRecord 查询。在套件配置中设置适当的超时值。

测试数据在失败后仍然存在

原因: 较早的步骤失败时,清理步骤会被跳过(如果 abort_on_failure=true) 解决方案: 将非关键步骤的 abort_on_failure 设为 false,或使用测试的“Teardown”部分,该部分无论测试结果如何都会运行。可考虑使用带查询条件的“Delete Records”步骤类型来清理遗留的测试数据。

示例

示例 1:根据用户故事测试业务规则

输入故事:“作为服务台 Agent,我希望事件优先级根据影响和紧急程度自动计算,这样就不必手动设置。”

生成的测试: 9 组创建/断言步骤对,涵盖所有 Impact x Urgency 组合,并包含拆卸步骤。

示例 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 - 根据验收标准生成测试用例

评论

支持 Markdown