关于 ActivityPub 单元测试的一些快速思考

Lobsters Hottest 新闻

摘要

作者分享了为 ActivityPub 机器人框架(ActivityBot,NLnet 资助项目)编写单元测试时遇到的四大难题:用户名与域名校验、消息验证、HTTP 签名的生成与重放,以及与外部服务器的真实互操作测试。

<p><a href="https://lobste.rs/s/gwuebx/some_quick_thoughts_on_unit_testing">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/17 06:51

# 关于 ActivityPub 单元测试的一些思考 来源:https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/ 我要在这里彻底坦诚一把——我从来就没真正理解"测试驱动开发"这个理念。我更倾向于"直接 telnet 到生产环境,管他什么后果"那种人。你看,那样好玩多了,而且我的心脏病医生也建议时不时来点剧烈刺激。 单元测试的本质其实很简单: 1. 给函数喂一些数据 2. 看它怎么响应 喂它好数据,如果它返回 `true`,测试就通过。喂它坏数据,确保它返回 false。小菜一碟。 作为我 NLnet 资助的 ActivityBot 项目(https://shkspr.mobi/blog/2026/08/activitybot-is-the-recipient-of-an-nlnet-grant/)的一部分,我正在为我的机器人框架编写一些正式的测试。我希望其中一些能对做类似事情的其他项目有所帮助。 测试主要有四大类——下面是我编写这些测试时发现的问题。 ## 基本文本验证(https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/#basic-text-validation) 一个基本的测试可能是如何验证一个 ActivityPub 用户名是否有效。通常是类似 `@[email protected]` 这样的格式——我们对此做了哪些假设?它以 `@` 开头,中间还有另一个 `@`,将其分为两部分:用户和服务器。服务器必须是一个有效的域名——但这可以包括非 ASCII 的国际化域名(Internationalised Domain Names)和 Emoji 域名。 那用户部分呢?它只是 A-Z 和 0-9 吗?能包含点号吗?能像电子邮件地址一样包含撇号吗? 基本上,要找到 ActivityPub 各个组件部分的规范有多容易?一点都不容易! ## 消息验证(https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/#message-validation) 一个 WebFinger 响应(https://www.rfc-editor.org/info/rfc7033/)是什么样子的?哪些部分是必须的?它们可以包含什么值? 对于你的项目生成的任何消息,你怎么能确定其他 ActivityPub 服务器能理解它? 同样,当我们从外部服务器收到一个关注(follow)消息时,它应该是什么样子的? 有一些 JSON Schema(https://github.com/steve-bate/fediverse-jsonschema)可以用来验证某些类型的消息。 但是,同样的问题又来了——有*大量*分散在各处的规范。 ## 签名验证(https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/#signature-verification) 正如我之前写过的,HTTP Signatures 很难搞(https://shkspr.mobi/blog/2026/09/a-reasonably-practical-guide-to-validating-rfc-9421-http-signatures-for-activitypub-in-php/)。有两个主要问题。第一个是验证签名。 为了做到这一点,你需要收集一堆签名,然后找到一种方法将它们回放到测试中。所以我正在保存签名,以便之后可以与其他人分享。 第二个问题是*生成*签名。当然,你可以对签名运行测试——但只有一种*真正*的方法来测试它们是否被接受…… ## 与他人通信(https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/#communicating-with-others) 如果你不能与他人通信,他们也不能与你通信,那么测试通过就毫无意义。 有些测试比其他测试更容易。发送签名请求应该是简单且可重复的。但接收消息不容易自动化。它需要能够控制一个外部服务器,并要求该服务器发送消息。 使用 Mastodon API(https://docs.joinmastodon.org/client/intro/)可以发出与你的服务器交互的请求——但前提是它是一个*公开*的服务器。 ## 综合起来(https://shkspr.mobi/blog/2026/10/some-thoughts-on-unit-testing-activitypub/#putting-it-all-together) 我把我所有的测试都放在了网上(https://gitlab.com/edent/activity-bot/-/tree/main/tests?ref_type=heads)。我还在分享一个[消息和签名的集合](https://gitlab.com/edent/activity-bot/-/tree/main/tests/headers?ref_type=heads),你可以在你的测试中使用。 我很想知道你是否觉得它们有用。

相似文章

用智能体集群进行属性测试

Lobsters Hottest

作者展示了如何用 AI 编码代理(agent swarms)构建属性测试基础设施,在不消耗额外 token 的情况下自动发现真实开源项目中的正确性 bug,仅在 Codex、uv、Prometheus、Router 等项目中就发现了数十个已合并修复的缺陷。

@oran_ge: https://x.com/oran_ge/status/2108013105162985561

X AI KOLs Timeline

一篇来自 Next Token 播客第五期的整理文章,讨论 Personal Agent 赛道的现状:OpenAI 的 Dots、Meta 的 Muse、旅行助理 Instinct,以及 ESP32 等硬件如何开始成为 Agent 的身体,并分析这套生态为何在中国难以复制。

@yaohui12138: 上个月接了个 AI Agent 外包项目,踩了个大坑,浪费了10天的时间,今天分享给大家避避坑 客户是做教育的,用企业微信办公,想让 AI Agent 主动给学生发消息 听起来简单,但企业微信对机器人给外部客户群聊发消息有严格限制 我当时…

X AI KOLs Timeline

一位AI开发者分享承接教育客户的企业微信AI Agent外包项目时遇到的坑:企业微信严格限制机器人向外部客户群发消息,传统搜索难以找到具体规则和绕过方案,后通过AnySearch工具获得深度信息。

本文系统梳理了AI Agent架构与工程实践,涵盖控制流、上下文工程、工具设计、记忆、多Agent组织、评测、追踪和安全,基于OpenClaw实现展开,强调Harness(测试验证基础设施)对系统稳定性的关键作用。

X AI KOLs

本文系统梳理了AI Agent架构与工程实践,涵盖控制流、上下文工程、工具设计、记忆、多Agent组织、评测、追踪和安全,基于OpenClaw实现展开,强调Harness(测试验证基础设施)对系统稳定性的关键作用。