#[test]
Expand description
Marks async function to be executed by runtime, suitable to test environment.
This macro helps set up a Runtime
without requiring the user to use
Runtime or
Builder directly.
Note: This macro is designed to be simplistic and targets applications that do not require a complex setup. If the provided functionality is not sufficient, you may be interested in using Builder, which provides a more powerful interface.
§Multi-threaded runtime
To use the multi-threaded runtime, the macro can be configured using
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
async fn my_test() {
assert!(true);
}
The worker_threads
option configures the number of worker threads, and
defaults to the number of cpus on the system.
Note: The multi-threaded runtime requires the rt-multi-thread
feature
flag.
§Current thread runtime
The default test runtime is single-threaded. Each test gets a separate current-thread runtime.
#[tokio::test]
async fn my_test() {
assert!(true);
}
§Usage
§Using the multi-thread runtime
#[tokio::test(flavor = "multi_thread")]
async fn my_test() {
assert!(true);
}
Equivalent code not using #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}
§Using current thread runtime
#[tokio::test]
async fn my_test() {
assert!(true);
}
Equivalent code not using #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}
§Set number of worker threads
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn my_test() {
assert!(true);
}
Equivalent code not using #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_multi_thread()
.worker_threads(2)
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}
§Configure the runtime to start with time paused
#[tokio::test(start_paused = true)]
async fn my_test() {
assert!(true);
}
Equivalent code not using #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.start_paused(true)
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}
Note that start_paused
requires the test-util
feature to be enabled.
§Rename package
use tokio as tokio1;
#[tokio1::test(crate = "tokio1")]
async fn my_test() {
println!("Hello world");
}
§Configure unhandled panic behavior
Available options are shutdown_runtime
and ignore
. For more details, see
Builder::unhandled_panic
.
This option is only compatible with the current_thread
runtime.
#[cfg(tokio_unstable)]
#[tokio::test(flavor = "current_thread", unhandled_panic = "shutdown_runtime")]
async fn my_test() {
let _ = tokio::spawn(async {
panic!("This panic will shutdown the runtime.");
}).await;
}
Equivalent code not using #[tokio::test]
#[cfg(tokio_unstable)]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.unhandled_panic(UnhandledPanic::ShutdownRuntime)
.build()
.unwrap()
.block_on(async {
let _ = tokio::spawn(async {
panic!("This panic will shutdown the runtime.");
}).await;
})
}
Note: This option depends on Tokio’s unstable API. See the documentation on unstable features for details on how to enable Tokio’s unstable features.