Derived Modular Arch
概念

Testing

DMA 项目中单元、集成与 e2e 测试的 colocation 位置。

DMA 定义测试相对模块的 放置 规则,但不选 runner、覆盖率阈值或测试金字塔。一条规则:测试紧挨它保护的代码。

单元测试 — colocate

文件 *.test.ts(或 *.spec.ts)——与实现同文件夹:

features/checkout/
├── checkout.store.ts
├── checkout.store.test.ts      # store — internal
└── public/
    └── checkout-page.tsx

services/cart/public/
├── cart.ts
└── cart.test.ts                # service public API

shared/lib/
├── format-currency.ts
└── format-currency.test.ts

dma check 也会扫描测试文件——*.test.ts / *.spec.ts 中的导入与生产代码进入同一张导入图。规则相同:public-apifeature-to-featurelayer-direction 等。

直接测什么

代码通过什么测
内部 store、composable模块内相对导入
services/*/public/*导入 public 文件
shared/lib/*导入 helper

不要做什么

  • 测试里导入 其他模块的内部——门槛与生产一样会失败。通过 public/ 测,或在模块内用相对导入 colocate 测试。
  • 整个项目的根级 __tests__/——重构时测试不会跟着模块走。

组件测试

SFC / React 组件测试——colocate 在组件旁:

features/catalog/public/
├── catalog-page.tsx
└── catalog-page.test.tsx       # optional

Runner 自选:Vitest + Testing Library、@vue/test-utils@testing-library/svelte。DMA 示例里可运行的测试多为纯 TS(stores、services、lib)——无 DOM harness。

集成 / 路由测试

薄的组合根(app/routes/)——需要时可放接线检查。更常见——应用根单独文件夹:

apps/web/
├── src/
├── e2e/                        # Playwright, Cypress
└── playwright.config.ts

E2E 不在 features/ 内 colocate——它们跨多个模块和路由。

Monorepo

单元测试留在应用包(apps/web/src/...)。Workspace package 的测试——在 package 内。dma check 每个 root 分析一张图(应用或发现的 package);monorepo 内图不合并。见 Monorepo

仓库中的示例

示例运行器Colocate
vite-reactViteststores、cart、lib 旁的 *.test.ts
next-appBun teststores + format-currency
sveltekit-routesViteststores、cart、lib
astro-pagesBun teststores、cart、lib
vue-viteViteststores、composables、cart

下一步

On this page