| Crates.io | axum-test |
| lib.rs | axum-test |
| version | 18.7.0 |
| created_at | 2023-01-17 23:07:08.733101+00 |
| updated_at | 2026-01-19 00:13:02.144217+00 |
| description | For spinning up and testing Axum servers |
| homepage | |
| repository | https://github.com/JosephLenton/axum-test |
| max_upload_size | |
| id | 761391 |
| size | 1,127,541 |
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 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. |
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. |
| 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. |
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 |
You can find examples of writing tests in the /examples folder. These include tests for:
a WebSocket ping pong application which sends requests up and down
example snapshot tests using Insta
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
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:
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
A big thank you to all of these who have helped!
Made with contrib.rocks