89 stable releases (16 major)
Uses new Rust 2024
| new 18.4.1 | Dec 1, 2025 |
|---|---|
| 18.3.0 | Nov 22, 2025 |
| 18.2.1 | Oct 29, 2025 |
| 18.0.0-rc3 | May 12, 2025 |
| 2.0.0 | Jan 17, 2023 |
#5 in HTTP server
452,036 downloads per month
Used in 126 crates
(120 directly)
410KB
9K
SLoC
This runs your application locally, allowing you to query against it with requests. Decode the responses, and assert what is returned.
use axum::Router;
use axum::routing::get;
use axum_test::TestServer;
#[tokio::test]
async fn it_should_ping_pong() {
// Build an application with a route.
let app = Router::new()
.route(&"/ping", get(|| async { "pong!" }));
// Run the application for testing.
let server = TestServer::new(app).unwrap();
// Get the request.
let response = server
.get("/ping")
.await;
// Assertions.
response.assert_status_ok();
response.assert_text("pong!");
}
A TestServer enables you to run an Axum service with a mocked network,
or on a random port with real network reqeusts.
In both cases allowing you to run multiple servers, across multiple tests, all in parallel.
🎁 Crate Features
| Feature | On by default | |
|---|---|---|
all |
off | Turns on all non-deprecated features. |
pretty-assertions |
on | Uses the pretty assertions crate on response assert_* methods. |
yaml |
off | Enables support for sending, receiving, and asserting, yaml content. |
msgpack |
off | Enables support for sending, receiving, and asserting, msgpack content. |
shuttle |
off | Enables support for building a TestServer an shuttle_axum::AxumService, for use with Shuttle.rs. |
typed-routing |
off | Enables support for using TypedPath in requests. See axum-extra for details. |
ws |
off | Enables WebSocket support. See TestWebSocket for details. |
reqwest |
off | Enables the TestServer being able to create Reqwest requests for querying. |
Deprecated
| Feature | On by default | |
|---|---|---|
old-json-diff |
off | Switches back to the old Json diff behaviour before Axum Test 18. If you find yourself needing this, then please raise an issue to let me know why. |
⚙️ Axum Compatibility
The current version of Axum Test requires at least Axum v0.8.7.
Here is a list of compatability with prior versions:
| Axum Version | Axum Test Version |
|---|---|
| 0.8.7+ (latest) | 18.3.0 (latest) |
| 0.8.4 | 18.0.0 |
| 0.8.3 | 17.3 |
| 0.8.0 | 17 |
| 0.7.6 to 0.7.9 | 16 |
| 0.7.0 to 0.7.5 | 14, 15 |
| 0.6 | 13.4.1 |
📺 Examples
You can find examples of writing tests in the /examples folder. These include tests for:
- a simple REST Todo application, and the same using Shuttle
- a WebSocket ping pong application which sends requests up and down
- a simple WebSocket chat application
🚀 Request Building Features
Querying your application on the TestServer supports all of the common request building you would expect.
- Serializing and deserializing Json, Form, Yaml, and others, using Serde
- Assertions on the Json, text, Yaml, etc, that is returned.
- Cookie, query, and header setting and reading
- Status code reading and assertions
Powerful Json assertions
The ability to assert only the shape of the Json returned:
use axum_test::TestServer;
use axum_test::expect_json;
use std::time::Duration;
// Your application
let app = Router::new()
.route(&"/user/alan", get(|| async {
// ...
}));
let server = TestServer::new(app)?;
server.get(&"/user/alan")
.await
.assert_json(&json!({
"name": "Alan",
// expect a valid UUID
"id": expect_json::uuid(),
// expect an adult age
"age": expect_json::integer()
.in_range(18..=120),
// expect user to be created within the last minute
"created_at": expect_json::iso_date_time()
.within_past(Duration::from_secs(60))
.utc()
}));
Docs:
Also includes
- WebSockets testing support
- Saving returned cookies for use on future requests
- Setting headers, query, and cookies, globally for all requests or on per request basis
- Can run requests using a real web server, or with mocked HTTP
- Automatic status assertions for expecting requests to succeed (to help catch bugs in tests sooner)
- Prettified assertion output
- Typed Routing from Axum Extra
- Reqwest integration
❤️ Contributions
A big thank you to all of these who have helped!
Made with contrib.rocks
Dependencies
~16–32MB
~436K SLoC