بنقرة واحدة
write-test
编写或修改测试用例、添加新测试文件、MockTransport/MockTlsServer 集成时触发。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
编写或修改测试用例、添加新测试文件、MockTransport/MockTlsServer 集成时触发。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
写入新模块文档、重构模块、或用户要求分析模块时触发。
Bug 修复或对接问题排查确认有效后,将经验记录到知识库。
修改 PMR 分配器、内存池配置、热路径容器、对象生命周期管理代码后触发。
编写或修改性能基准测试、分析 benchmark 结果、优化热路径性能时触发。
新增或修改 enable_shared_from_this 类、co_spawn 调用、shared_ptr 捕获的 lambda、co_await 后的成员访问时触发。
新增或修改原子操作、异步定时器、无锁通道、跨线程状态同步、CAS 竞争相关代码时触发。
| 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() 逻辑