Skip to main content

为支付服务添加单元测试

为支付处理构建一套测试编写实践手册,由 Devin 使用全面的单元测试覆盖扣款流程、退款逻辑和 webhook 处理程序。
AuthorCognition
Category代码质量
Features实践手册
1

编写支付场景专用测试手册

A playbook 会将你团队的测试规范固化下来,让 Devin 编写测试的方式与工程师保持一致。支付相关代码有其独特考量——幂等性、货币精度、网关重试、符合 PCI 要求的 mocking 等——因此,一个专注支付场景的 playbook 能捕捉到通用 playbook 会遗漏的问题。选项 1:自己编写 playbook。 前往 Settings > Playbooks > Create playbook 并定义你的规范:选项 2:让 Advanced Devin 为你创建 playbook。Advanced Devin 描述你的测试规范,它会为你生成一个完整的 playbook:然后将你目前最好的一个测试文件(例如 src/services/__tests__/UserService.test.ts)添加为一条 Knowledge 条目,这样 Devin 就能获得一个你团队风格的具体示例。
2

定位未经测试的支付代码

在让 Devin 针对特定文件之前,先找出你的支付模块中存在哪些覆盖率薄弱环节。让 Devin 运行你的覆盖率工具,并找出问题最严重的部分:Devin 会在其终端中运行测试套件,解析覆盖率报告,并给出一份按优先级排序的列表:
File                                | Lines | Uncovered functions
------------------------------------|-------|------------------------------
src/services/PaymentService.ts      |  34%  | processCharge, issueRefund, handleWebhook
src/services/SubscriptionService.ts |  41%  | renewSubscription, cancelTrial, proratePlan
src/services/InvoiceService.ts      |  52%  | generateInvoice, applyPromoCode, calculateTax
src/services/PayoutService.ts       |  58%  | initiateTransfer, reconcileSettlement
3

让 Devin 为 PaymentService 编写测试用例

新建一个新会话,附加你的支付测试 playbook(你会看到一个蓝色胶囊提示已附加),然后告诉 Devin 要针对哪个模块编写测试:Devin 会阅读该模块,学习你现有测试的模式和写法,按照你的 playbook 编写一份完整的测试文件,并运行它:
PASS src/services/__tests__/PaymentService.test.ts
  PaymentService
    processCharge
      ✓ charges a valid credit card and returns a receipt (14ms)
      ✓ uses integer cents to avoid floating-point errors (6ms)
      ✓ rejects duplicate charges with the same idempotency key (5ms)
      ✓ retries on Stripe gateway timeout up to 3 times (18ms)
      ✓ throws InsufficientFundsError for declined cards (4ms)
    issueRefund
      ✓ refunds full amount for a completed charge (8ms)
      ✓ refunds partial amount in cents when specified (6ms)
      ✓ prevents refund exceeding the original charge amount (3ms)
      ✓ throws AlreadyRefundedError on duplicate refund attempts (4ms)
    handleWebhook
      ✓ processes charge.succeeded events and updates order status (7ms)
      ✓ processes charge.refunded events and credits the customer (6ms)
      ✓ verifies Stripe webhook signature before processing (3ms)
      ✓ ignores unrecognized event types without error (2ms)

Coverage: 94% lines | 91% branches | 100% functions
Devin 会创建一个 PR(pull request),并在描述中附上测试文件和覆盖率摘要。
4

依次处理剩余的支付模块

审查第一个拉取请求(pull request,PR)。如果 mock 策略或断言风格不太合适,在将 playbook 应用于更多模块之前先对其进行更新——这一轮反馈可以避免你在多个 PR 中反复修正同样的问题。然后按照你的覆盖缺口清单逐项推进:为了更快推进,可以使用 Advanced Devin 启动并行会话——每个支付模块一个会话——全部遵循同一套 playbook。或者 安排 每周定期会话,自动查找任何低于覆盖率阈值的支付模块并为其生成测试。