Munaf Khatri:测试:为 PostgreSQL、Supabase 和 Neon 自动生成单元、集成与数据泄漏测试

Munaf Khatri:测试:为 PostgreSQL、Supabase 和 Neon 自动生成单元、集成与数据泄漏测试

💡 原文英文,约4000词,阅读约需15分钟。
📝

内容提要

UnitAutogen 为 PostgreSQL、Supabase 和 Neon 自动生成 pgTAP 测试,测试由代码和模式确定性推导,而非 AI 编写。它提供三类测试:单元测试验证单个函数或触发器各分支行为并自动生成模拟数据;集成测试从根函数出发,覆盖其调用的函数和触发的触发器;数据泄漏测试检查多租户、多用户及 PII 泄漏,涵盖 RLS 策略、列授权、SECURITY DEFINER 函数、视图和触发器。工具还生成覆盖率与安全报告,可集成 CI。免费版含单元测试,团队版增加集成测试,企业版含安全覆盖与 PII 审计。

🔎

延伸解读

确定性生成与AI编写的本质区别

文章强调UnitAutogen的测试并非由语言模型编写,而是从代码和模式确定性推导,每个预期值都通过实际运行例程获得。这意味着同一模式每次生成的测试字节级一致,变更可像代码差异一样审查。相比之下,AI编写的测试基于模式生成文本而不运行函数,无法验证预期值。这种确定性方法还确保只有通过真实数据库的测试才被保留,无法证明的分支会报告原因而非显示为通过。

三类测试覆盖不同层面的风险

单元测试针对单个函数或触发器,验证各分支行为并自动生成模拟数据;集成测试从根函数出发,覆盖其调用的函数和触发的触发器,能发现单元测试各自通过但链条整体出错的问题;数据泄漏测试则检查多租户、多用户及PII泄漏,涵盖RLS策略、列授权、SECURITY DEFINER函数、视图和触发器。三类测试分别对应逻辑正确性、调用链一致性和数据边界安全,形成从局部到整体的测试层次。

安全覆盖测试针对绕过RLS的对象

文章指出,RLS策略只过滤直接访问,而SECURITY DEFINER函数、以所有者权限运行的视图和触发器可能按设计绕过策略。因此安全覆盖运行会以两个不同身份调用每个客户端角色可访问的SECURITY DEFINER函数,读写每个视图,并测试受保护表上的触发器,报告是否越界。每个发现都附带表、命令、数据路径和最小修复变更,并可配置为在CI中因泄漏而失败。

生成测试的局限与适用边界

文章明确说明,生成的测试记录代码当前行为,而非验证业务正确性。如果函数按设计计算错误折扣,测试仍会通过,因为数据库确实按代码执行。测试的价值在于锁定当前行为,使意外变更以失败测试显现。安全与PII报告是可供审查的证据,但不是认证,且仅覆盖数据库层;应用代码、Edge Functions和网络配置需要独立测试。此外,运行应指向一次性数据库副本,避免生产环境。

❓

Q&A

UnitAutogen 生成的测试是 AI 写的吗?

不是。UnitAutogen 的测试由代码和模式确定性推导,而非 AI 编写。它从例程代码和模式推导每个测试,并通过在数据库中运行真实例程来读取每个期望值。相同模式每次运行产生逐字节相同的测试,因此测试套件的变更可以作为差异进行审查。

UnitAutogen 提供哪几类测试?

UnitAutogen 提供三类测试:单元测试验证单个函数或触发器各分支行为并自动生成模拟数据;集成测试从根函数出发,覆盖其调用的函数和触发的触发器;数据泄漏测试检查多租户、多用户及 PII 泄漏,涵盖 RLS 策略、列授权、SECURITY DEFINER 函数、视图和触发器。

数据泄漏测试具体检查哪些内容?

数据泄漏测试检查多租户泄漏(一个客户用户读取或修改另一客户的行)、多用户泄漏(一个用户访问另一用户的行或低权限角色访问受限行)以及 PII 泄漏(个人身份信息通过错误消息文本离开数据库)。测试涵盖 RLS 策略、列授权、SECURITY DEFINER 函数、视图和触发器。

如何在 Supabase 项目中使用 UnitAutogen?

在 Supabase 项目中使用 UnitAutogen 时,通过 --supabase 标志集成。运行 supabase start 后,执行 unitautogen --supabase --schema public,然后运行 supabase test db。生成的测试写入 supabase/tests/seccover/ 目录,supabase test db 会自动查找该目录。第二次运行只替换生成的文件,保留手写测试。

UnitAutogen 的免费版和付费版有什么区别?

免费版(Community Edition)包含单元测试、触发器测试和覆盖率。Team 版增加集成测试。Enterprise 版增加安全覆盖(security coverage)和 PII 审计。付费版使用相同的二进制文件,只需在旁边放置许可证文件。

生成的测试能保证业务逻辑正确吗?

不能。生成的测试记录代码当前的行为。如果函数按设计错误地计算折扣,测试套件仍会通过,因为数据库完全按照代码执行。测试套件的价值在于固定当前行为,使非预期的变更以测试失败的形式显现。安全与 PII 报告是团队可以展示给审查者的证据,但不是认证,且仅覆盖数据库层。

🏷️

标签

➡️

继续阅读