mcpField
C
contract-testing

contract-testing

github.com/proffesor-for-testing测试与质量520125 次安装今天更新
代码仓库

关于 contract-testing

contract-testing 是用于 API 和微服务契约测试的技能,涵盖消费者定义期望、提供方验证及部署前的变更检查。它强调以消费者实际需求为准,并结合语义化版本管理和 CI/CD 阻止破坏性变更。

主要功能

  1. 01定义消费者驱动的契约
  2. 02验证提供方是否满足契约
  3. 03检测破坏性 API 变更
  4. 04按语义化版本规则管理 API
  5. 05在 CI/CD 中阻止不兼容部署

适用场景

  1. 01测试微服务之间的通信契约
  2. 02验证第三方 API 集成
  3. 03协调分布式团队的接口变更
  4. 04在部署前发现不兼容变更

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill contract-testing

安装后在 Claude Code 中输入/contract-testing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

config.json
evals/
contract-testing.yaml
references/
agent-commands.md
provider-states.md
schemas/
output.json
scripts/
validate-config.json

详细介绍

契约测试

<default_to_action> 测试 API 契约或微服务时:

  1. 明确消费者的预期(消费者实际需要什么)
  2. 验证提供方是否满足契约(Pact 验证)
  3. 在部署前检测破坏性变更(CI/CD 集成)
  4. 对 API 进行语义化版本控制(破坏性变更 = 主版本号递增)
  5. 为受支持的版本维护向后兼容性

契约测试快速步骤:

  • 消费者:定义预期的请求/响应对
  • 提供方:根据所有消费者契约进行验证
  • CI/CD:阻止会破坏契约的部署
  • 版本控制:记录受支持的版本和弃用信息

成功的关键因素:

  • 消费者拥有契约(由他们定义所需内容)
  • 提供方必须在部署前通过所有消费者契约
  • 破坏性变更需要协调,不能让人措手不及 </default_to_action>

快速参考卡

适用场景
  • 微服务通信
  • 第三方 API 集成
  • 分布式团队协作
  • 防止破坏性变更
消费者驱动的契约流程
Consumer → Defines Expectations → Contract
                    ↓
Provider → Verifies Contract → Pass/Fail
                    ↓
CI/CD → Blocks Breaking Changes
破坏性变更与非破坏性变更
变更类型是否有破坏性?Semver
删除字段✅ 是主版本
重命名字段✅ 是主版本
更改类型✅ 是主版本
添加可选字段❌ 否次版本
添加新端点❌ 否次版本
修复错误❌ 否补丁版本
工具
工具最适用场景
Pact消费者驱动的契约
OpenAPI/SwaggerAPI 优先设计
JSON Schema模式验证
GraphQL模式优先契约

消费者契约(Pact)

// Consumer defines what it needs
const { Pact } = require('@pact-foundation/pact');

describe('Order API Consumer', () => {
  const provider = new Pact({
    consumer: 'CheckoutUI',
    provider: 'OrderService'
  });

  beforeAll(() => provider.setup());
  afterAll(() => provider.finalize());

  it('creates an order', async () => {
    await provider.addInteraction({
      state: 'products exist',
      uponReceiving: 'a create order request',
      withRequest: {
        method: 'POST',
        path: '/orders',
        body: { productId: 'abc', quantity: 2 }
      },
      willRespondWith: {
        status: 201,
        body: {
          orderId: like('order-123'),  // Any string matching pattern
          total: like(19.99)           // Any number
        }
      }
    });

    const response = await orderClient.create({ productId: 'abc', quantity: 2 });
    expect(response.orderId).toBeDefined();
  });
});

提供方验证

// Provider verifies it fulfills all consumer contracts
const { Verifier } = require('@pact-foundation/pact');

describe('Order Service Provider', () => {
  it('fulfills all consumer contracts', async () => {
    await new Verifier({
      provider: 'OrderService',
      providerBaseUrl: 'http://localhost:3000',
      pactUrls: ['./pacts/checkoutui-orderservice.json'],
      stateHandlers: {
        'products exist': async () => {
          await db.products.create({ id: 'abc', price: 9.99 });
        }
      }
    }).verifyProvider();
  });
});

破坏性变更检测

// Agent detects breaking changes
await Task("Contract Validation", {
  currentContract: 'openapi-v2.yaml',
  previousContract: 'openapi-v1.yaml',
  detectBreaking: true,
  calculateSemver: true,
  generateMigrationGuide: true
}, "qe-api-contract-validator");

// Output:
// Breaking changes found: 2
// - Removed field: order.discount
// - Type change: order.total (number → string)
// Recommended version: 3.0.0 (major bump)

CI/CD 集成

name: Contract Tests
on: [push]

jobs:
  consumer-tests:
    steps:
      - run: npm run test:contract
      - name: Publish Pacts
        run: npx pact-broker publish ./pacts --broker-base-url $PACT_BROKER

  provider-verification:
    needs: consumer-tests
    steps:
      - name: Verify Provider
        run: npm run verify:contracts
      - name: Can I Deploy?
        run: npx pact-broker can-i-deploy --pacticipant OrderService --version $VERSION

Agent 协作提示

记忆命名空间
aqe/contract-testing/
├── contracts/*           - Current contracts
├── breaking-changes/*    - Detected breaking changes
├── versioning/*          - Version compatibility matrix
└── verification-results/* - Provider verification history
Fleet 协作
const contractFleet = await FleetManager.coordinate({
  strategy: 'contract-testing',
  agents: [
    'qe-api-contract-validator',  // Validation, breaking detection
    'qe-test-generator',          // Generate contract tests
    'qe-security-scanner'         // API security
  ],
  topology: 'sequential'
});

Agent CLI 与高级模式

有关 v3 Agent 专用命令(aqe contract ...)、GraphQL 契约、事件契约和 Pact Broker 集成,请参阅 references/agent-commands.md。

相关技能


请牢记

消费者拥有契约。 他们定义所需内容;提供方必须满足这些需求。破坏性变更需要递增主版本号并进行协调。CI/CD 会阻止破坏契约的部署。消费者驱动的契约使用 Pact,API 优先设计使用 OpenAPI。

使用 Agent: Agent 会验证契约、检测破坏性变更并提供语义化版本建议,还会生成迁移指南。使用 Agent 可大规模维护契约合规性。

注意事项

  • 运行前必须配置 Pact broker URL;否则 Agent 会生成测试,但会静默跳过验证
  • 消费者测试在本地通过,却在 CI 中失败,通常是因为未设置提供方状态;务必验证双方
  • 在响应中添加必需字段属于破坏性变更,即使提供方测试通过也不例外,因为消费者并未预期该字段
  • Agent 可能会根据 API 文档而不是实际消费者的使用情况生成契约;契约必须反映消费者的真实需求
  • GraphQL 契约测试需要考虑模式拼接;片段可能引用其他服务中的类型

评论

支持 Markdown