用途:指导为 Axum 应用编写快速、确定性的测试。两种方式都不绑定真实网络端口:tower::ServiceExt::oneshot 属于零额外 crate 方案,Router 本身实现 tower::Service<Request<Body>>,可直接调用;axum-test 的 TestServer 是更顺手的封装,提供 .json()、.add_header() 等链式构造与 assert_status_ok、assert_json、assert_text 等断言。两者不能互相替代,所有测试都应基于同一个共享 app() 构造函数,以免测试漂移偏离真实接线。
主要能力:oneshot 适合处理器级单元测试与原始 Request/Response 控制,无 crate 版本耦合,0.7 与 0.8 行为一致;TestServer 适合可读性强的集成测试、cookie 持久化与 WebSocket(需真实 HTTP 传输)。axum-test 20.0.0 依赖 axum ^0.8.8,Axum 0.7 项目需固定更早版本。
必要用法:oneshot 需引入 axum::body::Body、axum::http、http_body_util::BodyExt、tower::{Service, ServiceExt},用 #[tokio::test] 标注;读取响应体走 into_body().collect().await.unwrap().to_bytes()。原始 JSON 请求必须设置 Content-Type: application/json,否则 Json 提取器返回 415(MissingJsonContentType)。oneshot 会消耗服务,多请求需 app.into_service() 配合 ready(&mut app).await?.call(req).await。tests/ 下每个文件是独立 crate,只能访问公共 API,因此 app() 必须从 src/lib.rs 以 pub 导出。
限制:资料未提供真实网络、性能指标、收费或平台支持等信息;测试相关依赖版本需按自身 Axum 版本核对,其余细节暂未提供。