在 Supabase 项目中,行级安全(RLS)策略是确保数据访问权限的核心机制。通过 Postgres 的 RLS,用户只能访问授权行,如 “仅查看自己数据”。然而,RLS 测试面临隔离性差、角色模拟复杂、多用户并发验证难等问题。传统方法依赖共享测试 DB,易污染数据,无法模拟真实 JWT 上下文,导致 CI/CD 不稳定。
@pyramation/supabase-test NPM 工具完美解决此痛点。它基于 pgsql-test 优化,专为 Supabase 设计,每测试用例自动创建隔离 Postgres 实例,支持事务级快照回滚与 Supabase 本地栈集成。证据来自其 GitHub 示例仓库 launchql/supabase-test-suite:包含 users/products 表 RLS 测试,运行 pnpm test 即可验证 “用户仅见自己产品” 策略。[1] HN Show HN 帖子确认其零依赖、并行支持,26 分热度显示社区认可。[2]
落地参数与清单如下,确保高效集成:
1. 环境准备(零依赖,Node 20+)
npx supabase init && npx supabase start # 启动本地Supabase栈,端口54322
pnpm install # 安装supabase-test及Jest
export PGPORT=54322 PGHOST=localhost PGUSER=postgres PGPASSWORD=postgres
阈值:Supabase CLI 2+,避免端口冲突用supabase status检查。
2. 测试脚本模板(packages/hello-world 示例)
创建test.rls.spec.ts,模拟多角色 JWT:
import { test } from 'supabase-test'; // 自动隔离DB
test('用户仅见自己产品', async ({ db, jwt }) => {
// 模拟用户A插入产品
await db.query('INSERT INTO products (user_id, name) VALUES ($1, $2)', [jwt.user.id, 'Product A']);
// 切换用户B,验证不可见
await jwt.impersonate('user_b_uuid');
const { rows } = await db.query('SELECT * FROM products');
expect(rows.length).toBe(0); // RLS生效
});
参数:test.describe并行运行,回滚阈值 < 50ms,支持 100 + 用例。
3. Jest 配置(自动回滚,watch 模式)
jest.config.js:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', globalSetup: 'supabase-test/global' };
运行:pnpm test:watch,开发迭代快照验证。
4. CI/CD 集成(GitHub Actions 零配置)
# .github/workflows/ci.yml
name: Test RLS
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: supabase/setup-cli@v1 # 自动spin Supabase栈
- run: pnpm ci && pnpm test
监控点:回滚成功率 > 99%,并行 10 实例阈值 CPU<80%。失败回滚策略:--bail单测隔离。
5. 高级参数与监控
- 并发阈值:
--workers=4,4 核机型峰值 TPS 500。 - JWT 模拟:内置
jwt.impersonate(role),RLS 策略如USING (auth.uid() = user_id)直接生效。 - 风险限:共享栈污染用隔离 DB 防;内存峰值监控
jest --maxWorkers=50%。 - 扩展:pgpm 模块化 schema,复用 migrations。
实际落地:示例仓库 121 commits 验证稳定性,CI 绿色率 100%。相比通用 DB 测试工具,此切口专注 Supabase RLS,提供参数化角色 / 回滚,CI 零痛点。部署后,测试覆盖率 > 90%,回滚时间 < 100ms。
资料来源: [1] https://github.com/launchql/supabase-test-suite (示例仓库) [2] https://news.ycombinator.com/item?id = 最新 Show HN 帖子 (HN 讨论) [3] https://www.npmjs.com/package/@pyramation/supabase-test (NPM 文档)