用途
该技能为 ABAP 类生成 ABAP Unit 单元测试,通过组合 ARC-1(SAP 系统访问)与 mcp-sap-docs(文档与最佳实践),复刻 SAP Joule 的“单元测试生成”能力。与面向 CDS 实体的 CDS 单元测试技能不同,本技能面向 ABAP 类,并使用基于接口的测试替身,而非 CDS Test Double Framework。
主要能力
- 读取类上下文:读取完整类源码(支持 structured 格式,一次获取元数据与全部 include,包括已有测试)、列出所有方法及签名与可见性、获取依赖上下文(实现的接口、父类层级、构造器注入依赖、使用的类及其公共 API、访问的数据库表)。
- 依赖分类:将依赖分为可 Mock(构造器注入的接口)、可打桩(数据库访问)、透明(内部私有/受保护辅助方法,不 Mock)、框架(对 SAP 框架类的静态调用,需包装为可注入接口或接受限制)。
- 按方法分析:识别分支(IF/CASE/COND/SWITCH)、错误路径(RAISE EXCEPTION、TRY-CATCH)、返回值、状态变更、所用依赖。
- 提出测试用例:按方法分组输出编号清单,标注 HAPPY/ERROR/BRANCH/EDGE 等类型,并询问用户生成全部或指定编号。
- 获取测试框架参考:通过 mcp-sap-docs 检索 ABAP Unit 与测试替身模式,核对断言方法名、测试替身创建方式、FOR TESTING 语法、风险等级与时长注解。
- 生成测试类:按模板生成完整 ABAP 测试类,包含 class_setup、class_teardown、setup 及各测试方法;支持 cl_abap_testdouble 或本地测试替身类两种模式。
- 写入、激活与运行:将本地测试类写入目标类的 testclasses include,激活类,运行单元测试,报告通过/失败/跳过数量,并对失败用例给出修复建议,可用方法级手术(edit_method)修复后重新激活运行。
使用方式
用户提供要测试的 ABAP 类(如 ZCL_TRAVEL_HANDLER),仅类名即可。若只给类名,技能会静默应用智能默认值并立即继续。可选指定:测试类名(默认目标类 testclasses include 中的本地类 ltc_<短类名>)、要测试的方法(默认所有公共方法)、包(默认 $TMP)、传输请求(仅非 $TMP 包需要)。
流程为:收集类上下文 → 分析方法并提出测试用例 → 获取测试框架参考 → 生成测试类 → 预览并确认 → 写入、激活并测试。写入使用 SAPWrite 的 update 动作写入 include="testclasses",ARC-1 内部完成 ADT 锁定、初始化缺失的 CCAU include、写入、解锁;对已有本地测试方法的小修复可用 edit_method。激活使用 SAPActivate,运行测试使用 SAPDiagnose(action="unittest")。
智能默认值
- 测试类名:ltc_<短类名>(全局类的 ABAP Unit 测试应放在其本地 testclasses/CCAU include 中)
- 测试方法:所有公共方法
- 包:$TMP(快速原型)
- 风险等级:HARMLESS(测试替身不修改真实数据)
- 时长:SHORT(单元测试应快速)
- Mock 策略:基于接口的测试替身(依赖注入最干净的模式)
测试数据与命名约定
测试数据遵循:最小数据(通常每测试 1-3 条)、值明显(如 100.00 - 10.00 = 90.00)、类型正确(NUMC 用 '001',DEC/CURR 用 '100.00',DATS 用 '20260101',ABAP_BOOL 用 abap_true/abap_false)、确定性(不使用 sy-datum、sy-uzeit、cl_abap_context_info=>get_system_date() 或随机值)、隔离(每个测试方法自包含)。命名:测试类为 ltc_<短类名>,测试方法为 test_<方法><场景>(snake_case,30 字符以内),Mock 变量为 mock<短依赖名>。
适用场景
- 类的公共方法含非平凡业务逻辑
- 类使用依赖注入(构造器参数为接口),适合 Mock
- 用户希望以测试覆盖作为 TDD 起点
- 重构类前希望建立回归测试
限制
- 不生成 CDS 单元测试(应使用 generate-cds-unit-test 技能)
- 不生成集成测试(本技能生成带 Mock 依赖的隔离单元测试,非端到端流程)
- 不生成性能测试(性能分析应使用 ABAP profiler / SAPDiagnose)
- 不生成 RAP 行为测试(RAP BO 测试替身需要单独模式)
- 不适用于无公共方法或纯数据容器(结构/常量)类;若分析未发现可测试场景(无分支、无错误路径、无有意义返回值),会提示该类没有非平凡公共方法可测
- BTP 与 On-Premise 存在差异:BTP 必须使用 ABAP Cloud 语法,仅可用已发布 API 进行 Mock,cl_abap_testdouble 可用,构造器注入为标准模式;On-Premise 灵活性更高,可用经典 ABAP,cl_abap_testdouble 自 7.51+ 可用,更早系统需使用本地测试替身类
- 常见错误处理:class_setup 失败(检查 CUT 构造器签名)、Mock 注入失败(核对接口名与类型)、断言失败(核对预期值与测试数据)、激活错误(修复语法)、cl_abap_testdouble 不可用(改用本地测试替身类)、方法不可调用(仅测公共方法,受保护方法可用 FRIENDS 子句)、testclasses/CCAU include 缺失(ARC-1 会自动初始化)、edit_method 找不到方法(需先写入完整 testclasses include)