enterprise-integration-testing

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Enterprise Integration Testing

企业集成测试

<default_to_action> When testing enterprise integrations or SAP-connected systems:
  1. MAP the end-to-end flow (web -> API -> middleware -> backend -> response)
  2. IDENTIFY integration points and protocols (REST, SOAP, RFC, IDoc, OData, EDI)
  3. SELECT the right agent for each integration type
  4. TEST each integration boundary with contract and data validation
  5. VALIDATE cross-system data consistency (SAP <-> WMS <-> middleware)
  6. EXERCISE enterprise error handling (compensation, retry, alerting)
  7. GATE releases with enterprise-specific quality criteria
Agent Selection Guide:
  • SAP RFC/BAPI calls ->
    qe-sap-rfc-tester
  • SAP IDoc flows ->
    qe-sap-idoc-tester
  • OData/Fiori services ->
    qe-odata-contract-tester
  • SOAP/ESB endpoints ->
    qe-soap-tester
  • Message broker flows ->
    qe-message-broker-tester
  • Middleware routing/transformation ->
    qe-middleware-validator
  • Authorization / SoD conflicts ->
    qe-sod-analyzer
Critical Success Factors:
  • Enterprise testing is cross-system: no system is tested in isolation
  • Data consistency across systems is the primary quality signal
  • Environment access and test data are the biggest bottlenecks </default_to_action>
<default_to_action> 在测试企业集成或SAP关联系统时:
  1. 梳理端到端流程(Web -> API -> 中间件 -> 后端 -> 响应)
  2. 识别集成点与协议(REST、SOAP、RFC、IDoc、OData、EDI)
  3. 为每种集成类型选择合适的Agent
  4. 通过契约与数据验证测试每个集成边界
  5. 验证跨系统数据一致性(SAP <-> WMS <-> 中间件)
  6. 测试企业级错误处理(补偿、重试、告警)
  7. 基于企业特定质量标准管控发布
Agent选择指南:
  • SAP RFC/BAPI调用 ->
    qe-sap-rfc-tester
  • SAP IDoc流程 ->
    qe-sap-idoc-tester
  • OData/Fiori服务 ->
    qe-odata-contract-tester
  • SOAP/ESB端点 ->
    qe-soap-tester
  • 消息代理流程 ->
    qe-message-broker-tester
  • 中间件路由/转换 ->
    qe-middleware-validator
  • 权限/职责分离(SoD)冲突 ->
    qe-sod-analyzer
关键成功因素:
  • 企业测试是跨系统的:没有系统可以孤立测试
  • 跨系统数据一致性是核心质量指标
  • 环境访问与测试数据是最大瓶颈 </default_to_action>

Quick Reference Card

快速参考卡片

When to Use

适用场景

  • Testing SAP-connected enterprise systems (S/4HANA, ECC, BW)
  • Validating end-to-end business processes (Order-to-Cash, Procure-to-Pay)
  • Testing middleware/ESB integrations (IIB, MuleSoft, SAP PI/PO)
  • Cross-system data reconciliation (SAP <-> WMS <-> CRM)
  • Enterprise release readiness assessment
  • 测试与SAP关联的企业系统(S/4HANA、ECC、BW)
  • 验证端到端业务流程(订单到收款、采购到付款)
  • 测试中间件/ESB集成(IIB、MuleSoft、SAP PI/PO)
  • 跨系统数据对账(SAP <-> WMS <-> CRM)
  • 企业发布就绪性评估

Enterprise Integration Types

企业集成类型

IntegrationProtocolAgentTypical Use
SAP RFC/BAPIRFCqe-sap-rfc-testerReal-time SAP function calls
SAP IDocALE/EDIqe-sap-idoc-testerAsynchronous document exchange
SAP ODataREST/ODataqe-odata-contract-testerFiori apps, external APIs
SOAP/ESBSOAP/HTTPqe-soap-testerLegacy service integration
Message BrokerAMQP/JMSqe-message-broker-testerAsync messaging (MQ, Kafka)
MiddlewareVariousqe-middleware-validatorRouting, transformation
AuthorizationSAP Authqe-sod-analyzerSoD conflicts, role testing
集成类型协议Agent典型用途
SAP RFC/BAPIRFCqe-sap-rfc-tester实时SAP函数调用
SAP IDocALE/EDIqe-sap-idoc-tester异步文档交换
SAP ODataREST/ODataqe-odata-contract-testerFiori应用、外部API
SOAP/ESBSOAP/HTTPqe-soap-tester遗留服务集成
消息代理AMQP/JMSqe-message-broker-tester异步消息(MQ、Kafka)
中间件多种qe-middleware-validator路由、转换
权限验证SAP Authqe-sod-analyzerSoD冲突、角色测试

Critical Test Scenarios

关键测试场景

ScenarioMust TestExample
E2E Order FlowFull order lifecycleWeb order -> SAP Sales Order -> WMS Pick -> Ship -> Invoice
Data ConsistencyCross-system matchSAP inventory = WMS inventory
IDoc ProcessingInbound/outboundPurchase order IDoc -> SAP PO creation
AuthorizationSoD complianceUser cannot create AND approve PO
Error RecoveryCompensationFailed payment -> reverse inventory reservation
Master Data SyncReplication accuracyMaterial master in SAP = Product in WMS
场景必测内容示例
端到端订单流程完整订单生命周期Web订单 -> SAP销售订单 -> WMS拣货 -> 发货 -> 开票
数据一致性跨系统数据匹配SAP库存 = WMS库存
IDoc处理入站/出站采购订单IDoc -> SAP采购订单创建
权限验证SoD合规性用户不能同时创建与审批采购订单
错误恢复补偿机制支付失败 -> 撤销库存预留
主数据同步复制准确性SAP物料主数据 = WMS产品数据

Tools

工具

  • SAP: SAP GUI, Transaction codes (SE37, WE19, SEGW), Eclipse ADT
  • Middleware: IBM IIB/ACE, MuleSoft, SAP PI/PO/CPI
  • Testing: SoapUI, Postman, Playwright, custom harnesses
  • Monitoring: SAP Solution Manager, Splunk, Dynatrace
  • Data: SAP LSMW, SECATT, eCATT
  • SAP:SAP GUI、事务代码(SE37、WE19、SEGW)、Eclipse ADT
  • 中间件:IBM IIB/ACE、MuleSoft、SAP PI/PO/CPI
  • 测试:SoapUI、Postman、Playwright、自定义测试框架
  • 监控:SAP Solution Manager、Splunk、Dynatrace
  • 数据:SAP LSMW、SECATT、eCATT

Agent Coordination

Agent协同

  • qe-sap-rfc-tester
    : SAP RFC/BAPI function module testing
  • qe-sap-idoc-tester
    : IDoc inbound/outbound processing validation
  • qe-odata-contract-tester
    : OData service contract and Fiori app testing
  • qe-soap-tester
    : SOAP/WSDL contract validation and WS-Security
  • qe-message-broker-tester
    : Message broker flows, DLQ, ordering
  • qe-middleware-validator
    : ESB routing, transformation, EIP patterns
  • qe-sod-analyzer
    : Segregation of Duties and authorization testing

  • qe-sap-rfc-tester
    :SAP RFC/BAPI函数模块测试
  • qe-sap-idoc-tester
    :IDoc入站/出站处理验证
  • qe-odata-contract-tester
    :OData服务契约与Fiori应用测试
  • qe-soap-tester
    :SOAP/WSDL契约验证与WS-Security
  • qe-message-broker-tester
    :消息代理流程、死信队列(DLQ)、消息顺序
  • qe-middleware-validator
    :ESB路由、转换、企业集成模式(EIP)
  • qe-sod-analyzer
    :职责分离(SoD)与权限测试

E2E Enterprise Flow Testing

端到端企业流程测试

Order-to-Cash Flow

订单到收款流程

javascript
describe('Order-to-Cash E2E Flow', () => {
  it('processes web order through SAP to warehouse fulfillment', async () => {
    // Step 1: Create order via web API
    const webOrder = await api.post('/orders', {
      customerId: 'CUST-1000',
      items: [{ materialNumber: 'MAT-500', quantity: 10 }],
      shippingAddress: { city: 'Portland', state: 'OR' }
    });
    expect(webOrder.status).toBe(201);
    const webOrderId = webOrder.body.orderId;

    // Step 2: Verify SAP Sales Order created via middleware
    const sapOrder = await sapClient.call('BAPI_SALESORDER_GETLIST', {
      CUSTOMER_NUMBER: 'CUST-1000',
      SALES_ORGANIZATION: '1000'
    });
    const matchingSapOrder = sapOrder.find(o => o.PURCHASE_ORDER_NO === webOrderId);
    expect(matchingSapOrder).toBeDefined();
    const sapOrderId = matchingSapOrder.SD_DOC;

    // Step 3: Verify WMS received pick instruction
    const wmsPickTask = await wmsApi.get(`/pick-tasks?externalRef=${sapOrderId}`);
    expect(wmsPickTask.status).toBe(200);
    expect(wmsPickTask.body.status).toBe('PENDING');

    // Step 4: Complete pick in WMS
    await wmsApi.post(`/pick-tasks/${wmsPickTask.body.taskId}/complete`, {
      pickedItems: [{ sku: 'MAT-500', quantity: 10, location: 'A-01-03' }]
    });

    // Step 5: Verify SAP delivery created (via IDoc confirmation)
    await waitFor(async () => {
      const delivery = await sapClient.call('BAPI_DELIVERYPROCESSING_GETLIST', {
        SALES_ORDER: sapOrderId
      });
      return delivery.length > 0 && delivery[0].DELVRY_STATUS === 'C';
    }, { timeout: 30000, interval: 3000 });

    // Step 6: Verify invoice posted in SAP
    await waitFor(async () => {
      const invoice = await sapClient.call('BAPI_BILLINGDOC_GETLIST', {
        REFDOCNUMBER: sapOrderId
      });
      return invoice.length > 0;
    }, { timeout: 30000, interval: 3000 });
  });
});
javascript
describe('Order-to-Cash E2E Flow', () => {
  it('processes web order through SAP to warehouse fulfillment', async () => {
    // Step 1: Create order via web API
    const webOrder = await api.post('/orders', {
      customerId: 'CUST-1000',
      items: [{ materialNumber: 'MAT-500', quantity: 10 }],
      shippingAddress: { city: 'Portland', state: 'OR' }
    });
    expect(webOrder.status).toBe(201);
    const webOrderId = webOrder.body.orderId;

    // Step 2: Verify SAP Sales Order created via middleware
    const sapOrder = await sapClient.call('BAPI_SALESORDER_GETLIST', {
      CUSTOMER_NUMBER: 'CUST-1000',
      SALES_ORGANIZATION: '1000'
    });
    const matchingSapOrder = sapOrder.find(o => o.PURCHASE_ORDER_NO === webOrderId);
    expect(matchingSapOrder).toBeDefined();
    const sapOrderId = matchingSapOrder.SD_DOC;

    // Step 3: Verify WMS received pick instruction
    const wmsPickTask = await wmsApi.get(`/pick-tasks?externalRef=${sapOrderId}`);
    expect(wmsPickTask.status).toBe(200);
    expect(wmsPickTask.body.status).toBe('PENDING');

    // Step 4: Complete pick in WMS
    await wmsApi.post(`/pick-tasks/${wmsPickTask.body.taskId}/complete`, {
      pickedItems: [{ sku: 'MAT-500', quantity: 10, location: 'A-01-03' }]
    });

    // Step 5: Verify SAP delivery created (via IDoc confirmation)
    await waitFor(async () => {
      const delivery = await sapClient.call('BAPI_DELIVERYPROCESSING_GETLIST', {
        SALES_ORDER: sapOrderId
      });
      return delivery.length > 0 && delivery[0].DELVRY_STATUS === 'C';
    }, { timeout: 30000, interval: 3000 });

    // Step 6: Verify invoice posted in SAP
    await waitFor(async () => {
      const invoice = await sapClient.call('BAPI_BILLINGDOC_GETLIST', {
        REFDOCNUMBER: sapOrderId
      });
      return invoice.length > 0;
    }, { timeout: 30000, interval: 3000 });
  });
});

Procure-to-Pay Flow

采购到付款流程

javascript
describe('Procure-to-Pay E2E Flow', () => {
  it('creates purchase requisition through to vendor payment', async () => {
    // Step 1: Create Purchase Requisition
    const prResult = await sapClient.call('BAPI_PR_CREATE', {
      PRHEADER: { PR_TYPE: 'NB', CTRL_IND: '' },
      PRHEADERX: { PR_TYPE: 'X' },
      PRITEMS: [{ MATERIAL: 'MAT-RAW-100', QUANTITY: 500, UNIT: 'EA', PLANT: '1000' }]
    });
    expect(prResult.NUMBER).toBeDefined();
    const prNumber = prResult.NUMBER;

    // Step 2: Verify PR triggers sourcing (ME57 equivalent)
    const sourcingResult = await sapClient.call('BAPI_PR_GETDETAIL', {
      NUMBER: prNumber
    });
    expect(sourcingResult.PRITEM[0].PREQ_NO).toBe(prNumber);

    // Step 3: Create Purchase Order from PR
    const poResult = await sapClient.call('BAPI_PO_CREATE1', {
      POHEADER: { COMP_CODE: '1000', DOC_TYPE: 'NB', VENDOR: 'VEND-500' },
      POITEMS: [{ PO_ITEM: '00010', MATERIAL: 'MAT-RAW-100', QUANTITY: 500, PLANT: '1000' }]
    });
    expect(poResult.PO_NUMBER).toBeDefined();

    // Step 4: Verify PO IDoc sent to vendor
    const idocStatus = await sapClient.call('IDOC_STATUS_READ', {
      DOCNUM: poResult.IDOC_NUMBER
    });
    expect(idocStatus.STATUS).toBe('03'); // Successfully sent
  });
});

javascript
describe('Procure-to-Pay E2E Flow', () => {
  it('creates purchase requisition through to vendor payment', async () => {
    // Step 1: Create Purchase Requisition
    const prResult = await sapClient.call('BAPI_PR_CREATE', {
      PRHEADER: { PR_TYPE: 'NB', CTRL_IND: '' },
      PRHEADERX: { PR_TYPE: 'X' },
      PRITEMS: [{ MATERIAL: 'MAT-RAW-100', QUANTITY: 500, UNIT: 'EA', PLANT: '1000' }]
    });
    expect(prResult.NUMBER).toBeDefined();
    const prNumber = prResult.NUMBER;

    // Step 2: Verify PR triggers sourcing (ME57 equivalent)
    const sourcingResult = await sapClient.call('BAPI_PR_GETDETAIL', {
      NUMBER: prNumber
    });
    expect(sourcingResult.PRITEM[0].PREQ_NO).toBe(prNumber);

    // Step 3: Create Purchase Order from PR
    const poResult = await sapClient.call('BAPI_PO_CREATE1', {
      POHEADER: { COMP_CODE: '1000', DOC_TYPE: 'NB', VENDOR: 'VEND-500' },
      POITEMS: [{ PO_ITEM: '00010', MATERIAL: 'MAT-RAW-100', QUANTITY: 500, PLANT: '1000' }]
    });
    expect(poResult.PO_NUMBER).toBeDefined();

    // Step 4: Verify PO IDoc sent to vendor
    const idocStatus = await sapClient.call('IDOC_STATUS_READ', {
      DOCNUM: poResult.IDOC_NUMBER
    });
    expect(idocStatus.STATUS).toBe('03'); // 发送成功
  });
});

SAP-Specific Testing Patterns

SAP特定测试模式

RFC/BAPI Testing

RFC/BAPI测试

javascript
describe('SAP RFC/BAPI Testing', () => {
  it('validates BAPI return structure and error handling', async () => {
    // Test with valid input
    const result = await sapClient.call('BAPI_MATERIAL_GETDETAIL', {
      MATERIAL: 'MAT-EXIST'
    });
    expect(result.RETURN.TYPE).not.toBe('E');
    expect(result.MATERIAL_GENERAL_DATA.MATL_DESC).toBeDefined();

    // Test with invalid material
    const errorResult = await sapClient.call('BAPI_MATERIAL_GETDETAIL', {
      MATERIAL: 'MAT-NONEXIST'
    });
    expect(errorResult.RETURN.TYPE).toBe('E');
    expect(errorResult.RETURN.MESSAGE).toContain('does not exist');
  });

  it('handles BAPI commit correctly', async () => {
    const createResult = await sapClient.call('BAPI_SALESORDER_CREATEFROMDAT2', {
      ORDER_HEADER_IN: {
        DOC_TYPE: 'OR',
        SALES_ORG: '1000',
        DISTR_CHAN: '10',
        DIVISION: '00'
      },
      ORDER_PARTNERS: [{ PARTN_ROLE: 'AG', PARTN_NUMB: 'CUST-1000' }],
      ORDER_ITEMS_IN: [{ MATERIAL: 'MAT-500', TARGET_QTY: 10 }]
    });

    // Must call BAPI_TRANSACTION_COMMIT to persist
    await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });

    // Verify order exists after commit
    const getResult = await sapClient.call('BAPI_SALESORDER_GETDETAIL', {
      SALESDOCUMENT: createResult.SALESDOCUMENT
    });
    expect(getResult.ORDER_HEADER_OUT.SD_DOC_CAT).toBe('C');
  });
});
javascript
describe('SAP RFC/BAPI Testing', () => {
  it('validates BAPI return structure and error handling', async () => {
    // Test with valid input
    const result = await sapClient.call('BAPI_MATERIAL_GETDETAIL', {
      MATERIAL: 'MAT-EXIST'
    });
    expect(result.RETURN.TYPE).not.toBe('E');
    expect(result.MATERIAL_GENERAL_DATA.MATL_DESC).toBeDefined();

    // Test with invalid material
    const errorResult = await sapClient.call('BAPI_MATERIAL_GETDETAIL', {
      MATERIAL: 'MAT-NONEXIST'
    });
    expect(errorResult.RETURN.TYPE).toBe('E');
    expect(errorResult.RETURN.MESSAGE).toContain('does not exist');
  });

  it('handles BAPI commit correctly', async () => {
    const createResult = await sapClient.call('BAPI_SALESORDER_CREATEFROMDAT2', {
      ORDER_HEADER_IN: {
        DOC_TYPE: 'OR',
        SALES_ORG: '1000',
        DISTR_CHAN: '10',
        DIVISION: '00'
      },
      ORDER_PARTNERS: [{ PARTN_ROLE: 'AG', PARTN_NUMB: 'CUST-1000' }],
      ORDER_ITEMS_IN: [{ MATERIAL: 'MAT-500', TARGET_QTY: 10 }]
    });

    // Must call BAPI_TRANSACTION_COMMIT to persist
    await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });

    // Verify order exists after commit
    const getResult = await sapClient.call('BAPI_SALESORDER_GETDETAIL', {
      SALESDOCUMENT: createResult.SALESDOCUMENT
    });
    expect(getResult.ORDER_HEADER_OUT.SD_DOC_CAT).toBe('C');
  });
});

IDoc Testing

IDoc测试

javascript
describe('SAP IDoc Processing', () => {
  it('validates inbound IDoc creates correct SAP document', async () => {
    // Send IDoc via middleware
    const idocPayload = {
      IDOCTYP: 'ORDERS05',
      MESTYP: 'ORDERS',
      SNDPOR: 'SAPEXT',
      SNDPRT: 'LS',
      SNDPRN: 'EXTERN',
      RCVPOR: 'SAPSI1',
      RCVPRT: 'LS',
      RCVPRN: 'SAPCLNT100',
      segments: {
        E1EDK01: { BELNR: 'EXT-PO-001' },
        E1EDK14: [{ QUESSION: '001', ORGID: '1000' }],
        E1EDP01: [{ POSEX: '000010', MENGE: '100', MENEE: 'EA', MATNR: 'MAT-500' }]
      }
    };

    const idocNumber = await middlewareClient.sendIDoc(idocPayload);

    // Wait for IDoc processing in SAP
    await waitFor(async () => {
      const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
      return status.STATUS === '53'; // Application document posted successfully
    }, { timeout: 60000, interval: 5000 });

    // Verify SAP document was created
    const sapDoc = await sapClient.call('BAPI_SALESORDER_GETLIST', {
      PURCHASE_ORDER_NO: 'EXT-PO-001'
    });
    expect(sapDoc).toHaveLength(1);
  });

  it('handles IDoc error status correctly', async () => {
    // Send IDoc with invalid material
    const idocPayload = buildIdocPayload({ materialNumber: 'INVALID-MAT' });
    const idocNumber = await middlewareClient.sendIDoc(idocPayload);

    await waitFor(async () => {
      const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
      return ['51', '56'].includes(status.STATUS); // Error statuses
    }, { timeout: 60000 });

    const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
    expect(status.STATUS_TEXT).toContain('Material');
  });
});
javascript
describe('SAP IDoc Processing', () => {
  it('validates inbound IDoc creates correct SAP document', async () => {
    // Send IDoc via middleware
    const idocPayload = {
      IDOCTYP: 'ORDERS05',
      MESTYP: 'ORDERS',
      SNDPOR: 'SAPEXT',
      SNDPRT: 'LS',
      SNDPRN: 'EXTERN',
      RCVPOR: 'SAPSI1',
      RCVPRT: 'LS',
      RCVPRN: 'SAPCLNT100',
      segments: {
        E1EDK01: { BELNR: 'EXT-PO-001' },
        E1EDK14: [{ QUESSION: '001', ORGID: '1000' }],
        E1EDP01: [{ POSEX: '000010', MENGE: '100', MENEE: 'EA', MATNR: 'MAT-500' }]
      }
    };

    const idocNumber = await middlewareClient.sendIDoc(idocPayload);

    // Wait for IDoc processing in SAP
    await waitFor(async () => {
      const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
      return status.STATUS === '53'; // 应用文档已成功过账
    }, { timeout: 60000, interval: 5000 });

    // Verify SAP document was created
    const sapDoc = await sapClient.call('BAPI_SALESORDER_GETLIST', {
      PURCHASE_ORDER_NO: 'EXT-PO-001'
    });
    expect(sapDoc).toHaveLength(1);
  });

  it('handles IDoc error status correctly', async () => {
    // Send IDoc with invalid material
    const idocPayload = buildIdocPayload({ materialNumber: 'INVALID-MAT' });
    const idocNumber = await middlewareClient.sendIDoc(idocPayload);

    await waitFor(async () => {
      const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
      return ['51', '56'].includes(status.STATUS); // 错误状态
    }, { timeout: 60000 });

    const status = await sapClient.call('IDOC_STATUS_READ', { DOCNUM: idocNumber });
    expect(status.STATUS_TEXT).toContain('Material');
  });
});

OData Service Testing

OData服务测试

javascript
describe('SAP OData Service Testing', () => {
  it('validates OData entity CRUD operations', async () => {
    // CREATE
    const createResponse = await odataClient.post('/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder', {
      SalesOrderType: 'OR',
      SalesOrganization: '1000',
      DistributionChannel: '10',
      OrganizationDivision: '00',
      SoldToParty: 'CUST-1000'
    });
    expect(createResponse.status).toBe(201);
    const salesOrder = createResponse.body.d.SalesOrder;

    // READ with $expand
    const readResponse = await odataClient.get(
      `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder('${salesOrder}')?$expand=to_Item`
    );
    expect(readResponse.status).toBe(200);
    expect(readResponse.body.d.SalesOrder).toBe(salesOrder);

    // READ collection with $filter
    const listResponse = await odataClient.get(
      `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder?$filter=SoldToParty eq 'CUST-1000'&$top=10`
    );
    expect(listResponse.status).toBe(200);
    expect(listResponse.body.d.results.length).toBeGreaterThan(0);
  });

  it('validates OData $metadata contract', async () => {
    const metadata = await odataClient.get(
      '/sap/opu/odata/sap/API_SALES_ORDER_SRV/$metadata'
    );
    expect(metadata.status).toBe(200);

    const parsedMetadata = parseEdmx(metadata.body);
    expect(parsedMetadata.entityTypes).toContain('A_SalesOrder');
    expect(parsedMetadata.entityTypes).toContain('A_SalesOrderItem');

    // Validate required properties exist
    const salesOrderType = parsedMetadata.getEntityType('A_SalesOrder');
    expect(salesOrderType.properties).toContain('SalesOrder');
    expect(salesOrderType.properties).toContain('SalesOrderType');
    expect(salesOrderType.navigationProperties).toContain('to_Item');
  });
});
javascript
describe('SAP OData Service Testing', () => {
  it('validates OData entity CRUD operations', async () => {
    // CREATE
    const createResponse = await odataClient.post('/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder', {
      SalesOrderType: 'OR',
      SalesOrganization: '1000',
      DistributionChannel: '10',
      OrganizationDivision: '00',
      SoldToParty: 'CUST-1000'
    });
    expect(createResponse.status).toBe(201);
    const salesOrder = createResponse.body.d.SalesOrder;

    // READ with $expand
    const readResponse = await odataClient.get(
      `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder('${salesOrder}')?$expand=to_Item`
    );
    expect(readResponse.status).toBe(200);
    expect(readResponse.body.d.SalesOrder).toBe(salesOrder);

    // READ collection with $filter
    const listResponse = await odataClient.get(
      `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder?$filter=SoldToParty eq 'CUST-1000'&$top=10`
    );
    expect(listResponse.status).toBe(200);
    expect(listResponse.body.d.results.length).toBeGreaterThan(0);
  });

  it('validates OData $metadata contract', async () => {
    const metadata = await odataClient.get(
      '/sap/opu/odata/sap/API_SALES_ORDER_SRV/$metadata'
    );
    expect(metadata.status).toBe(200);

    const parsedMetadata = parseEdmx(metadata.body);
    expect(parsedMetadata.entityTypes).toContain('A_SalesOrder');
    expect(parsedMetadata.entityTypes).toContain('A_SalesOrderItem');

    // Validate required properties exist
    const salesOrderType = parsedMetadata.getEntityType('A_SalesOrder');
    expect(salesOrderType.properties).toContain('SalesOrder');
    expect(salesOrderType.properties).toContain('SalesOrderType');
    expect(salesOrderType.navigationProperties).toContain('to_Item');
  });
});

Fiori Launchpad Testing

Fiori启动台测试

javascript
describe('Fiori Launchpad App Testing', () => {
  it('validates Fiori tile loads and displays correct data', async () => {
    await page.goto(`${fioriLaunchpadUrl}#SalesOrder-manage`);

    // Wait for OData call to complete
    await page.waitForResponse(resp =>
      resp.url().includes('API_SALES_ORDER_SRV') && resp.status() === 200
    );

    // Verify smart table loaded with data
    const tableRows = await page.locator('table tbody tr');
    expect(await tableRows.count()).toBeGreaterThan(0);

    // Verify filter bar is functional
    await page.fill('[data-sap-ui="filterField-SalesOrder"]', '1000000');
    await page.click('[data-sap-ui="btnGo"]');

    await page.waitForResponse(resp =>
      resp.url().includes("$filter=SalesOrder eq '1000000'")
    );
  });
});

javascript
describe('Fiori Launchpad App Testing', () => {
  it('validates Fiori tile loads and displays correct data', async () => {
    await page.goto(`${fioriLaunchpadUrl}#SalesOrder-manage`);

    // Wait for OData call to complete
    await page.waitForResponse(resp =>
      resp.url().includes('API_SALES_ORDER_SRV') && resp.status() === 200
    );

    // Verify smart table loaded with data
    const tableRows = await page.locator('table tbody tr');
    expect(await tableRows.count()).toBeGreaterThan(0);

    // Verify filter bar is functional
    await page.fill('[data-sap-ui="filterField-SalesOrder"]', '1000000');
    await page.click('[data-sap-ui="btnGo"]');

    await page.waitForResponse(resp =>
      resp.url().includes("$filter=SalesOrder eq '1000000'")
    );
  });
});

Cross-System Data Validation

跨系统数据验证

javascript
describe('Cross-System Data Consistency', () => {
  it('SAP inventory matches WMS inventory', async () => {
    const materials = ['MAT-100', 'MAT-200', 'MAT-300'];

    for (const material of materials) {
      // Get SAP stock
      const sapStock = await sapClient.call('BAPI_MATERIAL_STOCK_REQ_LIST', {
        MATERIAL: material,
        PLANT: '1000'
      });
      const sapQuantity = parseFloat(sapStock.TOTAL_STOCK);

      // Get WMS inventory
      const wmsInventory = await wmsApi.get(`/inventory/${material}`);
      const wmsQuantity = wmsInventory.body.availableQuantity;

      expect(wmsQuantity).toBe(sapQuantity);
    }
  });

  it('customer master data is consistent across systems', async () => {
    const customerId = 'CUST-1000';

    const sapCustomer = await sapClient.call('BAPI_CUSTOMER_GETDETAIL', {
      CUSTOMERNO: customerId
    });

    const crmCustomer = await crmApi.get(`/customers/${customerId}`);
    const wmsCustomer = await wmsApi.get(`/customers/${customerId}`);

    // Core fields must match
    expect(crmCustomer.body.name).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.NAME);
    expect(wmsCustomer.body.name).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.NAME);
    expect(crmCustomer.body.taxId).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.TAX_NUMBER);
  });

  it('order status is synchronized across all systems', async () => {
    const orderId = 'ORD-SYNC-TEST';

    // Create order and wait for propagation
    await api.post('/orders', { orderId, customerId: 'CUST-1000', items: [{ sku: 'MAT-100', qty: 5 }] });
    await sleep(10000); // Allow for async propagation

    const webStatus = (await api.get(`/orders/${orderId}`)).body.status;
    const sapStatus = (await sapClient.call('BAPI_SALESORDER_GETDETAIL', {
      SALESDOCUMENT: orderId
    })).ORDER_HEADER_OUT.DOC_STATUS;
    const wmsStatus = (await wmsApi.get(`/orders/${orderId}`)).body.status;

    // All systems should reflect same logical status
    expect(mapSapStatus(sapStatus)).toBe(webStatus);
    expect(mapWmsStatus(wmsStatus)).toBe(webStatus);
  });
});

javascript
describe('Cross-System Data Consistency', () => {
  it('SAP inventory matches WMS inventory', async () => {
    const materials = ['MAT-100', 'MAT-200', 'MAT-300'];

    for (const material of materials) {
      // Get SAP stock
      const sapStock = await sapClient.call('BAPI_MATERIAL_STOCK_REQ_LIST', {
        MATERIAL: material,
        PLANT: '1000'
      });
      const sapQuantity = parseFloat(sapStock.TOTAL_STOCK);

      // Get WMS inventory
      const wmsInventory = await wmsApi.get(`/inventory/${material}`);
      const wmsQuantity = wmsInventory.body.availableQuantity;

      expect(wmsQuantity).toBe(sapQuantity);
    }
  });

  it('customer master data is consistent across systems', async () => {
    const customerId = 'CUST-1000';

    const sapCustomer = await sapClient.call('BAPI_CUSTOMER_GETDETAIL', {
      CUSTOMERNO: customerId
    });

    const crmCustomer = await crmApi.get(`/customers/${customerId}`);
    const wmsCustomer = await wmsApi.get(`/customers/${customerId}`);

    // Core fields must match
    expect(crmCustomer.body.name).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.NAME);
    expect(wmsCustomer.body.name).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.NAME);
    expect(crmCustomer.body.taxId).toBe(sapCustomer.CUSTOMER_GENERAL_DATA.TAX_NUMBER);
  });

  it('order status is synchronized across all systems', async () => {
    const orderId = 'ORD-SYNC-TEST';

    // Create order and wait for propagation
    await api.post('/orders', { orderId, customerId: 'CUST-1000', items: [{ sku: 'MAT-100', qty: 5 }] });
    await sleep(10000); // 等待异步同步

    const webStatus = (await api.get(`/orders/${orderId}`)).body.status;
    const sapStatus = (await sapClient.call('BAPI_SALESORDER_GETDETAIL', {
      SALESDOCUMENT: orderId
    })).ORDER_HEADER_OUT.DOC_STATUS;
    const wmsStatus = (await wmsApi.get(`/orders/${orderId}`)).body.status;

    // 所有系统应反映相同的逻辑状态
    expect(mapSapStatus(sapStatus)).toBe(webStatus);
    expect(mapWmsStatus(wmsStatus)).toBe(webStatus);
  });
});

Enterprise Test Data Management

企业测试数据管理

javascript
describe('Enterprise Test Data Strategy', () => {
  // Master data setup - reusable across test suites
  const masterDataFixture = {
    async setup() {
      // Create customer in SAP (source of truth)
      const customer = await sapClient.call('BAPI_CUSTOMER_CREATE', {
        PI_COPYREFERENCE: { SALESORG: '1000', DISTR_CHAN: '10' },
        PI_PERSONALDATA: { FIRSTNAME: 'Test', LASTNAME: `Customer-${Date.now()}` }
      });
      await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });

      // Wait for replication to downstream systems
      await waitFor(async () => {
        const wms = await wmsApi.get(`/customers/${customer.CUSTOMERNO}`);
        return wms.status === 200;
      }, { timeout: 60000 });

      return { customerId: customer.CUSTOMERNO };
    },

    async teardown(customerId) {
      // Mark customer for deletion (SAP does not hard delete)
      await sapClient.call('BAPI_CUSTOMER_CHANGEFROMDATA', {
        CUSTOMERNO: customerId,
        PI_PERSONALDATA: { DELETION_FLAG: 'X' }
      });
      await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });
    }
  };

  let testCustomer;

  beforeAll(async () => {
    testCustomer = await masterDataFixture.setup();
  });

  afterAll(async () => {
    await masterDataFixture.teardown(testCustomer.customerId);
  });

  it('uses properly replicated test customer', async () => {
    const order = await api.post('/orders', {
      customerId: testCustomer.customerId,
      items: [{ sku: 'MAT-100', qty: 1 }]
    });
    expect(order.status).toBe(201);
  });
});

javascript
describe('Enterprise Test Data Strategy', () => {
  // 主数据设置 - 可在测试套件间复用
  const masterDataFixture = {
    async setup() {
      // 在SAP中创建客户(数据源)
      const customer = await sapClient.call('BAPI_CUSTOMER_CREATE', {
        PI_COPYREFERENCE: { SALESORG: '1000', DISTR_CHAN: '10' },
        PI_PERSONALDATA: { FIRSTNAME: 'Test', LASTNAME: `Customer-${Date.now()}` }
      });
      await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });

      // 等待同步到下游系统
      await waitFor(async () => {
        const wms = await wmsApi.get(`/customers/${customer.CUSTOMERNO}`);
        return wms.status === 200;
      }, { timeout: 60000 });

      return { customerId: customer.CUSTOMERNO };
    },

    async teardown(customerId) {
      // 标记客户为删除状态(SAP不支持硬删除)
      await sapClient.call('BAPI_CUSTOMER_CHANGEFROMDATA', {
        CUSTOMERNO: customerId,
        PI_PERSONALDATA: { DELETION_FLAG: 'X' }
      });
      await sapClient.call('BAPI_TRANSACTION_COMMIT', { WAIT: 'X' });
    }
  };

  let testCustomer;

  beforeAll(async () => {
    testCustomer = await masterDataFixture.setup();
  });

  afterAll(async () => {
    await masterDataFixture.teardown(testCustomer.customerId);
  });

  it('uses properly replicated test customer', async () => {
    const order = await api.post('/orders', {
      customerId: testCustomer.customerId,
      items: [{ sku: 'MAT-100', qty: 1 }]
    });
    expect(order.status).toBe(201);
  });
});

Environment Strategy

环境策略

Enterprise Environment Matrix

企业环境矩阵

EnvironmentPurposeDataSAP ClientAccess
Sandbox (SBX)Developer explorationSample data100Open
Development (DEV)Feature developmentSynthetic200Dev team
Integration (INT)Cross-system testingControlled sets300QE + Dev
Quality (QAS)Release validationProduction-like400QE only
Pre-Production (PRE)Final verificationMasked production copy500Release team
Production (PRD)Live systemReal data600Operations
javascript
// Environment-aware test configuration
const envConfig = {
  INT: {
    sapClient: '300',
    sapHost: 'sap-int.company.com',
    wmsHost: 'wms-int.company.com',
    middlewareHost: 'esb-int.company.com',
    testDataStrategy: 'synthetic', // Create and teardown
    maxParallelTests: 5
  },
  QAS: {
    sapClient: '400',
    sapHost: 'sap-qas.company.com',
    wmsHost: 'wms-qas.company.com',
    middlewareHost: 'esb-qas.company.com',
    testDataStrategy: 'reserved-sets', // Pre-allocated test data
    maxParallelTests: 3
  }
};

function getTestConfig() {
  const env = process.env.TEST_ENVIRONMENT || 'INT';
  return envConfig[env];
}

环境用途数据SAP客户端访问权限
沙箱(SBX)开发者探索示例数据100开放
开发(DEV)功能开发合成数据200开发团队
集成(INT)跨系统测试受控数据集300测试+开发
质量(QAS)发布验证类生产数据400仅测试
预生产(PRE)最终验证脱敏生产副本500发布团队
生产(PRD)生产系统真实数据600运维团队
javascript
// 感知环境的测试配置
const envConfig = {
  INT: {
    sapClient: '300',
    sapHost: 'sap-int.company.com',
    wmsHost: 'wms-int.company.com',
    middlewareHost: 'esb-int.company.com',
    testDataStrategy: 'synthetic', // 创建与清理
    maxParallelTests: 5
  },
  QAS: {
    sapClient: '400',
    sapHost: 'sap-qas.company.com',
    wmsHost: 'wms-qas.company.com',
    middlewareHost: 'esb-qas.company.com',
    testDataStrategy: 'reserved-sets', // 预分配测试数据
    maxParallelTests: 3
  }
};

function getTestConfig() {
  const env = process.env.TEST_ENVIRONMENT || 'INT';
  return envConfig[env];
}

Enterprise Quality Gates

企业质量门禁

QCSD Flags for Enterprise Systems

企业系统QCSD标记

javascript
const enterpriseFlags = {
  HAS_MIDDLEWARE: true,           // ESB/middleware in the flow
  HAS_SAP_INTEGRATION: true,     // SAP RFC/BAPI/IDoc/OData calls
  HAS_AUTHORIZATION: true,       // SoD and role-based access
  HAS_CROSS_SYSTEM_DATA: true,   // Data replicated across systems
  HAS_ASYNC_PROCESSING: true,    // IDoc, message queue, batch jobs
  HAS_LEGACY_PROTOCOL: true      // SOAP, RFC, flat-file, EDI
};
javascript
const enterpriseFlags = {
  HAS_MIDDLEWARE: true,           // 流程中包含ESB/中间件
  HAS_SAP_INTEGRATION: true,     // SAP RFC/BAPI/IDoc/OData调用
  HAS_AUTHORIZATION: true,       // SoD与基于角色的访问
  HAS_CROSS_SYSTEM_DATA: true,   // 跨系统复制数据
  HAS_ASYNC_PROCESSING: true,    // IDoc、消息队列、批处理作业
  HAS_LEGACY_PROTOCOL: true      // SOAP、RFC、平面文件、EDI
};

Release Readiness Criteria

发布就绪性标准

javascript
describe('Enterprise Release Readiness', () => {
  it('passes all enterprise quality gates', async () => {
    const gates = [
      {
        name: 'Cross-System Data Consistency',
        check: async () => {
          const results = await runDataReconciliation(['MAT-100', 'MAT-200']);
          return results.every(r => r.consistent);
        }
      },
      {
        name: 'IDoc Processing Success Rate',
        check: async () => {
          const stats = await sapClient.call('IDOC_STATUS_SUMMARY', { PERIOD: 'LAST_24H' });
          const successRate = stats.SUCCESS / stats.TOTAL;
          return successRate >= 0.99; // 99% threshold
        }
      },
      {
        name: 'Middleware Error Rate',
        check: async () => {
          const errors = await middlewareMonitor.getErrorCount({ period: '24h' });
          return errors < 10; // Less than 10 errors in 24h
        }
      },
      {
        name: 'SoD Violations',
        check: async () => {
          const violations = await sodAnalyzer.scan({ scope: 'changed-roles' });
          return violations.critical === 0;
        }
      },
      {
        name: 'E2E Order Flow',
        check: async () => {
          const result = await runE2EOrderFlow();
          return result.allStepsCompleted && result.duration < 120000; // Under 2 minutes
        }
      }
    ];

    for (const gate of gates) {
      const passed = await gate.check();
      expect(passed).toBe(true);
    }
  });
});

javascript
describe('Enterprise Release Readiness', () => {
  it('passes all enterprise quality gates', async () => {
    const gates = [
      {
        name: 'Cross-System Data Consistency',
        check: async () => {
          const results = await runDataReconciliation(['MAT-100', 'MAT-200']);
          return results.every(r => r.consistent);
        }
      },
      {
        name: 'IDoc Processing Success Rate',
        check: async () => {
          const stats = await sapClient.call('IDOC_STATUS_SUMMARY', { PERIOD: 'LAST_24H' });
          const successRate = stats.SUCCESS / stats.TOTAL;
          return successRate >= 0.99; // 99%阈值
        }
      },
      {
        name: 'Middleware Error Rate',
        check: async () => {
          const errors = await middlewareMonitor.getErrorCount({ period: '24h' });
          return errors < 10; // 24小时内错误少于10个
        }
      },
      {
        name: 'SoD Violations',
        check: async () => {
          const violations = await sodAnalyzer.scan({ scope: 'changed-roles' });
          return violations.critical === 0;
        }
      },
      {
        name: 'E2E Order Flow',
        check: async () => {
          const result = await runE2EOrderFlow();
          return result.allStepsCompleted && result.duration < 120000; // 少于2分钟
        }
      }
    ];

    for (const gate of gates) {
      const passed = await gate.check();
      expect(passed).toBe(true);
    }
  });
});

Best Practices

最佳实践

Do This

推荐做法

  • Map the full E2E flow before writing any tests
  • Test each integration boundary separately AND end-to-end
  • Use SAP-aware test data management (create, use, teardown with BAPIs)
  • Validate data consistency across all systems after each integration event
  • Include IDoc status monitoring in your test assertions
  • Test authorization (SoD) as part of every enterprise release gate
  • Use service virtualization for systems that are hard to provision
  • 在编写任何测试前先梳理完整的端到端流程
  • 分别测试每个集成边界,同时进行端到端测试
  • 使用支持SAP的测试数据管理(通过BAPI创建、使用、清理)
  • 在每个集成事件后验证所有系统间的数据一致性
  • 在测试断言中包含IDoc状态监控
  • 将权限验证(SoD)作为每个企业发布门禁的一部分
  • 对难以部署的系统使用服务虚拟化

Avoid This

避免做法

  • Testing SAP only through the UI (Fiori/SAP GUI) without API-level tests
  • Ignoring IDoc error statuses (51, 56) and only checking happy path
  • Sharing test data between teams without reservation mechanisms
  • Testing enterprise flows only in sandbox environments
  • Skipping BAPI_TRANSACTION_COMMIT after create/update BAPIs
  • Assuming cross-system data is immediately consistent (allow for async propagation)
  • Deploying without verifying SoD compliance for changed authorization roles

  • 仅通过UI(Fiori/SAP GUI)测试SAP,而不进行API级测试
  • 忽略IDoc错误状态(51、56),仅测试正常流程
  • 无预留机制的情况下在团队间共享测试数据
  • 仅在沙箱环境中测试企业流程
  • 创建/更新BAPI后跳过BAPI_TRANSACTION_COMMIT
  • 假设跨系统数据会立即一致(需考虑异步同步时间)
  • 未验证变更权限角色的SoD合规性就部署

Agent-Assisted Enterprise Testing

Agent辅助企业测试

typescript
// SAP RFC/BAPI function testing
await Task("SAP BAPI Validation", {
  bapis: ['BAPI_SALESORDER_CREATEFROMDAT2', 'BAPI_SALESORDER_GETDETAIL'],
  testScenarios: ['valid-input', 'missing-required', 'invalid-customer', 'commit-rollback'],
  validateReturnStructure: true
}, "qe-sap-rfc-tester");

// IDoc processing validation
await Task("IDoc Flow Validation", {
  idocType: 'ORDERS05',
  direction: 'inbound',
  testStatuses: ['53-success', '51-application-error', '56-syntax-error'],
  validateSapDocument: true
}, "qe-sap-idoc-tester");

// OData contract testing
await Task("OData Service Contract Test", {
  serviceUrl: '/sap/opu/odata/sap/API_SALES_ORDER_SRV',
  validateMetadata: true,
  testCrud: true,
  testFilters: ['$filter', '$expand', '$orderby', '$top', '$skip'],
  checkBackwardCompatibility: true
}, "qe-odata-contract-tester");

// SOAP service validation
await Task("SOAP Service Validation", {
  wsdl: 'services/OrderService.wsdl',
  operations: ['CreateOrder', 'GetOrderStatus'],
  testWsSecurity: true,
  testFaultCodes: true
}, "qe-soap-tester");

// Middleware flow validation
await Task("Middleware Integration Test", {
  flow: 'order-to-cash',
  stages: ['web-api', 'esb-routing', 'sap-rfc', 'wms-api'],
  testDLQ: true,
  testCompensation: true,
  validateCorrelationIds: true
}, "qe-middleware-validator");

// Message broker testing
await Task("Message Broker Validation", {
  broker: 'ibm-mq',
  queues: ['orders.inbound', 'orders.sap', 'orders.wms', 'orders.dlq'],
  testOrdering: true,
  testRetry: true
}, "qe-message-broker-tester");

// Segregation of Duties analysis
await Task("SoD Conflict Analysis", {
  scope: 'changed-roles',
  ruleSet: 'sap-standard',
  criticalTransactions: ['ME21N', 'ME29N', 'MIRO', 'FB60'],
  reportFormat: 'matrix'
}, "qe-sod-analyzer");

typescript
// SAP RFC/BAPI函数测试
await Task("SAP BAPI Validation", {
  bapis: ['BAPI_SALESORDER_CREATEFROMDAT2', 'BAPI_SALESORDER_GETDETAIL'],
  testScenarios: ['valid-input', 'missing-required', 'invalid-customer', 'commit-rollback'],
  validateReturnStructure: true
}, "qe-sap-rfc-tester");

// IDoc处理验证
await Task("IDoc Flow Validation", {
  idocType: 'ORDERS05',
  direction: 'inbound',
  testStatuses: ['53-success', '51-application-error', '56-syntax-error'],
  validateSapDocument: true
}, "qe-sap-idoc-tester");

// OData契约测试
await Task("OData Service Contract Test", {
  serviceUrl: '/sap/opu/odata/sap/API_SALES_ORDER_SRV',
  validateMetadata: true,
  testCrud: true,
  testFilters: ['$filter', '$expand', '$orderby', '$top', '$skip'],
  checkBackwardCompatibility: true
}, "qe-odata-contract-tester");

// SOAP服务验证
await Task("SOAP Service Validation", {
  wsdl: 'services/OrderService.wsdl',
  operations: ['CreateOrder', 'GetOrderStatus'],
  testWsSecurity: true,
  testFaultCodes: true
}, "qe-soap-tester");

// 中间件流程验证
await Task("Middleware Integration Test", {
  flow: 'order-to-cash',
  stages: ['web-api', 'esb-routing', 'sap-rfc', 'wms-api'],
  testDLQ: true,
  testCompensation: true,
  validateCorrelationIds: true
}, "qe-middleware-validator");

// 消息代理测试
await Task("Message Broker Validation", {
  broker: 'ibm-mq',
  queues: ['orders.inbound', 'orders.sap', 'orders.wms', 'orders.dlq'],
  testOrdering: true,
  testRetry: true
}, "qe-message-broker-tester");

// 职责分离分析
await Task("SoD Conflict Analysis", {
  scope: 'changed-roles',
  ruleSet: 'sap-standard',
  criticalTransactions: ['ME21N', 'ME29N', 'MIRO', 'FB60'],
  reportFormat: 'matrix'
}, "qe-sod-analyzer");

Agent Coordination Hints

Agent协同提示

Memory Namespace

内存命名空间

aqe/enterprise-integration/
  flows/              - E2E flow definitions and test results
  sap/
    rfc-results/      - RFC/BAPI test outcomes
    idoc-results/     - IDoc processing validation
    odata-contracts/  - OData $metadata snapshots and diffs
  middleware/
    routing/          - ESB routing test results
    transforms/       - Transformation validation
  cross-system/
    reconciliation/   - Data consistency reports
    master-data/      - Master data sync validation
  authorization/
    sod-reports/      - SoD conflict analysis results
    role-testing/     - Role and permission test results
  quality-gates/      - Enterprise release gate results
aqe/enterprise-integration/
  flows/              - 端到端流程定义与测试结果
  sap/
    rfc-results/      - RFC/BAPI测试结果
    idoc-results/     - IDoc处理验证结果
    odata-contracts/  - OData $metadata快照与差异
  middleware/
    routing/          - ESB路由测试结果
    transforms/       - 转换验证结果
  cross-system/
    reconciliation/   - 数据一致性报告
    master-data/      - 主数据同步验证结果
  authorization/
    sod-reports/      - SoD冲突分析结果
    role-testing/     - 角色与权限测试结果
  quality-gates/      - 企业发布门禁结果

Fleet Coordination

集群协同

typescript
const enterpriseFleet = await FleetManager.coordinate({
  strategy: 'enterprise-integration',
  agents: [
    'qe-sap-rfc-tester',          // SAP function module testing
    'qe-sap-idoc-tester',         // IDoc processing validation
    'qe-odata-contract-tester',   // OData/Fiori service testing
    'qe-soap-tester',             // SOAP/ESB endpoint testing
    'qe-message-broker-tester',   // Message broker flows
    'qe-middleware-validator',     // Middleware routing/transformation
    'qe-sod-analyzer'             // Authorization and SoD
  ],
  topology: 'hierarchical'
});

await enterpriseFleet.execute({
  flow: 'order-to-cash',
  phases: [
    { name: 'contract-validation', agents: ['qe-odata-contract-tester', 'qe-soap-tester'] },
    { name: 'integration-testing', agents: ['qe-sap-rfc-tester', 'qe-sap-idoc-tester', 'qe-middleware-validator'] },
    { name: 'e2e-validation', agents: ['qe-message-broker-tester'] },
    { name: 'authorization-check', agents: ['qe-sod-analyzer'] }
  ]
});

typescript
const enterpriseFleet = await FleetManager.coordinate({
  strategy: 'enterprise-integration',
  agents: [
    'qe-sap-rfc-tester',          // SAP函数模块测试
    'qe-sap-idoc-tester',         // IDoc处理验证
    'qe-odata-contract-tester',   // OData/Fiori服务测试
    'qe-soap-tester',             // SOAP/ESB端点测试
    'qe-message-broker-tester',   // 消息代理流程测试
    'qe-middleware-validator',     // 中间件路由/转换验证
    'qe-sod-analyzer'             // 权限与SoD测试
  ],
  topology: 'hierarchical'
});

await enterpriseFleet.execute({
  flow: 'order-to-cash',
  phases: [
    { name: 'contract-validation', agents: ['qe-odata-contract-tester', 'qe-soap-tester'] },
    { name: 'integration-testing', agents: ['qe-sap-rfc-tester', 'qe-sap-idoc-tester', 'qe-middleware-validator'] },
    { name: 'e2e-validation', agents: ['qe-message-broker-tester'] },
    { name: 'authorization-check', agents: ['qe-sod-analyzer'] }
  ]
});

Related Skills

相关技能

  • api-testing-patterns - REST/GraphQL API testing fundamentals
  • contract-testing - Consumer-driven contract testing with Pact
  • middleware-testing-patterns - ESB, routing, transformation, DLQ
  • wms-testing-patterns - Warehouse management system testing
  • chaos-engineering-resilience - Fault injection for enterprise systems
  • database-testing - Database integrity and migration testing
  • security-testing - Security and authorization testing

  • api-testing-patterns - REST/GraphQL API测试基础
  • contract-testing - 基于Pact的消费者驱动契约测试
  • middleware-testing-patterns - ESB、路由、转换、死信队列测试
  • wms-testing-patterns - 仓库管理系统测试
  • chaos-engineering-resilience - 企业系统故障注入测试
  • database-testing - 数据库完整性与迁移测试
  • security-testing - 安全与权限测试

Remember

注意事项

Enterprise integration testing is about verifying that independently correct systems work correctly together. No system is an island. Test each integration boundary with protocol-appropriate tools, validate cross-system data consistency, and always include authorization and SoD checks. The biggest risks are in the seams between systems, not within them.
With Agents: Use specialized agents for each integration type (RFC, IDoc, OData, SOAP, messaging). Orchestrate them hierarchically: contract validation first, then integration testing, then E2E flows, then authorization. The enterprise fleet catches cross-system inconsistencies that single-system testing misses entirely.
企业集成测试的核心是验证各自独立的系统协同工作是否正确。没有系统是孤立的。使用适合协议的工具测试每个集成边界,验证跨系统数据一致性,并始终包含权限与SoD检查。最大的风险存在于系统之间的衔接处,而非系统内部。
借助Agent: 为每种集成类型(RFC、IDoc、OData、SOAP、消息)使用专用Agent。按层级编排:先进行契约验证,再进行集成测试,然后是端到端流程测试,最后是权限验证。企业Agent集群能够发现单系统测试完全遗漏的跨系统不一致问题。