| Crates.io | axum-test |
| lib.rs | axum-test |
| version | 18.1.0 |
| created_at | 2023-01-17 23:07:08.733101+00 |
| updated_at | 2025-09-05 12:32:47.213624+00 |
| description | For spinning up and testing Axum servers |
| homepage | |
| repository | https://github.com/JosephLenton/axum-test |
| max_upload_size | |
| id | 761391 |
| size | 512,826 |
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.
| Feature | On by default | |
|---|---|---|
all |
off | Turns on all 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. |
old-json-diff |
off | Switches back to the old Json diff behaviour before Axum 18. If you find yourself needing this, then please raise an issue to let me know why. |
The current version of Axum Test requires at least Axum v0.8.3.
Here is a list of compatability with prior versions:
| Axum Version | Axum Test Version |
|---|---|
| 0.8.4+ (latest) | 18 (latest) |
| 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 |
You can find examples of writing tests in the /examples folder. These include tests for:
Querying your application on the TestServer supports all of the common request building you would expect.
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:
A big thanks to all of these who have helped!
Made with contrib.rocks