关于 test-generation
此 ServiceNow 技能根据需求、用户故事或现有功能规划并创建 Automated Test Framework(ATF)测试,面向开发者和测试人员。它涵盖测试步骤、断言、测试数据清理、套件组织及结果分析。
主要功能
- 01从需求生成 ATF 测试
- 02创建有序步骤与断言
- 03设置测试数据及清理步骤
- 04将测试加入测试套件
- 05分析测试与步骤结果
适用场景
- 01为新功能补充回归测试
- 02将手动测试计划转为 ATF 测试
- 03构建 CI/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 功能生成自动化测试框架(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_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 | 查询测试执行结果 |
最佳实践
- 每个测试覆盖一个场景: 每个测试都应验证单一场景;使用套件对相关场景分组
- 步骤名称应清晰描述意图: 将步骤描述写成断言(例如,“验证 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- 根据验收标准生成测试用例