Skip to main content

enterprise-integration-testing

Use when testing enterprise integrations across SAP, middleware, WMS, or backend systems, validating E2E enterprise flows, testing SAP-specific patterns (RFC, BAPI, IDoc, OData, Fiori), or enforcing cross-system quality gates.

소스 정보

저장소
proffesor-for-testing/agentic-qe
최근 소스 활동
2026년 9월 27일 15:26
감지된 SKILL.md 언어
영어
스타
494
포크
98

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

파일 탐색기
4 개 파일

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
enterprise-integration-testing
description
Use when testing enterprise integrations across SAP, middleware, WMS, or backend systems, validating E2E enterprise flows, testing SAP-specific patterns (RFC, BAPI, IDoc, OData, Fiori), or enforcing cross-system quality gates.
category
enterprise-integration
priority
high
tokenEstimate
2000
agents
["qe-soap-tester","qe-message-broker-tester","qe-sap-rfc-tester","qe-middleware-validator","qe-sap-idoc-tester","qe-odata-contract-tester","qe-sod-analyzer"]
implementation_status
optimized
optimization_version
1
last_optimized
2026-02-04T00:00:00.000Z
dependencies
["api-testing-patterns","contract-testing","chaos-engineering-resilience"]
quick_reference_card
true
tags
["enterprise","sap","esb","middleware","integration","e2e","order-to-cash"]
trust_tier
3
validation
{"schema_path":"schemas/output.json","validator_path":"scripts/validate-config.json","eval_path":"evals/enterprise-integration-testing.yaml"}
# Enterprise Integration Testing ## Browser engine UI-level enterprise integration checks (SAP Fiori launchpad smoke tests, admin UI validation) should use the **qe-browser** fleet skill. RFC/BAPI/IDoc/OData/SOAP testing continues to use the dedicated `qe-soap-tester`, `qe-sap-rfc-tester`, `qe-sap-idoc-tester`, and `qe-odata-contract-tester` agents. See `.claude/skills/qe-browser/SKILL.md`. <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> ## 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 ### Enterprise Integration Types | Integration | Protocol | Agent | Typical Use | |-------------|----------|-------|-------------| | SAP RFC/BAPI | RFC | qe-sap-rfc-tester | Real-time SAP function calls | | SAP IDoc | ALE/EDI | qe-sap-idoc-tester | Asynchronous document exchange | | SAP OData | REST/OData | qe-odata-contract-tester | Fiori apps, external APIs | | SOAP/ESB | SOAP/HTTP | qe-soap-tester | Legacy service integration | | Message Broker | AMQP/JMS | qe-message-broker-tester | Async messaging (MQ, Kafka) | | Middleware | Various | qe-middleware-validator | Routing, transformation | | Authorization | SAP Auth | qe-sod-analyzer | SoD conflicts, role testing | ### Critical Test Scenarios | Scenario | Must Test | Example | |----------|----------|---------| | E2E Order Flow | Full order lifecycle | Web order -> SAP Sales Order -> WMS Pick -> Ship -> Invoice | | Data Consistency | Cross-system match | SAP inventory = WMS inventory | | IDoc Processing | Inbound/outbound | Purchase order IDoc -> SAP PO creation | | Authorization | SoD compliance | User cannot create AND approve PO | | Error Recovery | Compensation | Failed payment -> reverse inventory reservation | | Master Data Sync | Replication accuracy | Material master in SAP = Product in WMS | ### Tools - **SAP**: SAP GUI, Transaction codes (SE37, WE19, SEGW), Eclipse ADT - **Middleware**: IBM IIB/ACE, MuleSoft, SAP PI/PO/CPI - **Testing**: SoapUI, Postman, qe-browser (via Vibium for Fiori/web UIs), custom harnesses - **Monitoring**: SAP Solution Manager, Splunk, Dynatrace - **Data**: SAP LSMW, SECATT, eCATT ### Agent Coordination - `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 --- ## 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 }); }); }); ``` ### 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 }); }); ``` --- ## SAP-Specific Testing Patterns ### RFC/BAPI Testing ```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 ```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'); }); }); ``` ### OData Service Testing ```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(
GitHub에서 보기
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다. GitHub에서 보기