ワンクリックで
write-test
编写或修改测试用例、添加新测试文件、MockTransport/MockTlsServer 集成时触发。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
编写或修改测试用例、添加新测试文件、MockTransport/MockTlsServer 集成时触发。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
写入新模块文档、重构模块、或用户要求分析模块时触发。
Bug 修复或对接问题排查确认有效后,将经验记录到知识库。
修改 PMR 分配器、内存池配置、热路径容器、对象生命周期管理代码后触发。
编写或修改性能基准测试、分析 benchmark 结果、优化热路径性能时触发。
新增或修改 enable_shared_from_this 类、co_spawn 调用、shared_ptr 捕获的 lambda、co_await 后的成员访问时触发。
新增或修改原子操作、异步定时器、无锁通道、跨线程状态同步、CAS 竞争相关代码时触发。
SOC 職業分類に基づく
| name | write-test |
| description | 编写或修改测试用例、添加新测试文件、MockTransport/MockTlsServer 集成时触发。 |
编写测试、修复测试失败、添加新测试文件、使用 MockTransport/MockTlsServer 时。
构造: TestRunner("Tag")
断言: Check(cond, "msg") — 通过 LogPass,失败 LogFail
日志: LogPass("msg") — 递增 passed_
LogFail("msg") — 递增 failed_
退出: Summary() → int — 0=全通过, 1=有失败(内部调用 trace::shutdown)
头文件: tests/common/TestRunner.hpp
继承 psm::transport::transmission,内部持有 net::io_context。
注入数据: inject_read(vector<byte>{...})
inject_read(byte_ptr, size)
捕获写入: written_data() → const memory::vector<std::byte>&
清空捕获: clear_written_data()
注入错误: set_read_error(ec) — 一次性,下次 async_read_some 返回
set_write_error(ec) — 一次性,下次 async_write_some 返回
状态查询: is_closed() / is_cancelled()
驱动异步: get_io_context().poll() — 非阻塞推进
get_io_context().run() — 阻塞直到所有协程完成
头文件: tests/common/MockTransport.hpp
关键行为:
ioc.poll() 或 ioc.run() 才能被读协程感知async_read_some 通过 100μs 定时器轮询挂起fault::code::eof启动: co_spawn(ioc, mock_tls_server::run(acceptor, max_conn), detached)
行为: 自动生成 Ed25519 自签证书,TLS 1.3 only,握手后 echo 回显
头文件: tests/common/MockTlsServer.hpp
#include "common/TestRunner.hpp"
// ... 其他 include
namespace
{
psm::testing::TestRunner runner("ModuleName");
}
int main()
{
SetConsoleOutputCP(CP_UTF8); // Win32 UTF-8 输出
psm::memory::system::enable_pooling();
psm::trace::init({});
// 运行测试协程...
return runner.Summary();
}
auto test_something(net::io_context& ioc)
-> net::awaitable<void>
{
// 服务端协程
auto server = [&]()
-> net::awaitable<void>
{
// accept / MockTransport / 协议处理
};
// 客户端协程
auto client = [&]()
-> net::awaitable<void>
{
// 发送请求 / 验证响应
};
net::co_spawn(ioc, server(), net::detached);
net::co_spawn(ioc, client(), net::detached);
}
约 25% 的测试(主要是协议集成测试)使用独立模式,适合需要精细控制 ioc.run() 生命周期的场景:
#include "common/MockTransport.hpp"
// ... 其他 include
namespace
{
std::int32_t passed = 0;
std::int32_t failed = 0;
void LogPass(std::string_view msg)
{
++passed;
psm::trace::info("PASS: {}", msg);
}
void LogFail(std::string_view msg)
{
++failed;
psm::trace::error("FAIL: {}", msg);
}
}
int main()
{
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
psm::memory::system::enable_pooling();
psm::trace::init({});
// 每个测试函数内部创建自己的 io_context 并 run()
TestBasicHandshake();
TestAuthFailure();
psm::trace::shutdown();
return failed > 0 ? 1 : 0;
}
两种模式的选择:
io_contextioc.run() 周期)在 tests/CMakeLists.txt 中添加:
forward_add_test(TestName, TestName.cpp)
forward_add_test 自动:
${PROJECT_NAME}_static_library-static 链接选项shared_ptr<bool> 传递结果,禁止全局变量ioc.poll()(非阻塞单步推进)或 ioc.run()(完整执行)TestBasicGetRequest),与生产代码 snake_case 区分coroutine-audit 规范)set_read_error / set_write_error / 意外关闭)ioc.run() 完成后所有协程应自然退出,不得残留挂起协程-g1 -Os(最小调试信息 + 体积优化)tests/concurrency/server + tests/concurrency/client服务端: accept → 创建 transport → 协议 handler → handshake → echo 客户端: connect → 发送原始协议字节 → 验证响应字节 验证: shared_ptr 传递结果到 main() 层
构造输入 → 调用 parse/serialize → Check 输出字段 → 验证边界(空输入、截断输入)
构造 JSON string → deserialize → Check 各字段默认值和解析值 → 验证 enabled() 逻辑