Макрос атрибута test
#[test]
macros и rt.Помечает асинхронную функцию для выполнения средой выполнения, подходящей для тестирования. Этот макрос помогает настроить Runtime, не требуя от пользователя напрямую использовать Runtime или Builder.
Примечание: этот макрос намеренно сделан простым и предназначен для приложений, которым не требуется сложная настройка. Если предоставляемых возможностей недостаточно, рассмотрите возможность использования Builder, предоставляющего более мощный интерфейс.
Многопоточная среда выполнения
Чтобы использовать многопоточную среду выполнения, макрос можно настроить следующим образом
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
async fn my_test() {
assert!(true);
}Параметр worker_threads задаёт количество рабочих потоков. По умолчанию используется количество процессоров в системе.
Примечание: для многопоточной среды выполнения требуется флаг возможности rt-multi-thread.
Среда выполнения в текущем потоке
По умолчанию тестовая среда выполнения является однопоточной. Для каждого теста создаётся отдельная среда выполнения в текущем потоке.
#[tokio::test]
async fn my_test() {
assert!(true);
}Использование
Задать имя среды выполнения
#[tokio::test(name = "my-test-runtime")]
async fn my_test() {
assert!(true);
}Эквивалентный код без использования #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.name("my-test-runtime")
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}Использование многопоточной среды выполнения
#[tokio::test(flavor = "multi_thread")]
async fn my_test() {
assert!(true);
}Эквивалентный код без использования #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}Использование среды выполнения в текущем потоке
#[tokio::test]
async fn my_test() {
assert!(true);
}Эквивалентный код без использования #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}Задать количество рабочих потоков
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn my_test() {
assert!(true);
}Эквивалентный код без использования #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_multi_thread()
.worker_threads(2)
.enable_all()
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}Настроить запуск среды выполнения с приостановленным временем
#[tokio::test(start_paused = true)]
async fn my_test() {
assert!(true);
}Эквивалентный код без использования #[tokio::test]
#[test]
fn my_test() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.start_paused(true)
.build()
.unwrap()
.block_on(async {
assert!(true);
})
}Обратите внимание, что для start_paused требуется включённая возможность test-util.
Переименовать пакет
use tokio as tokio1;
#[tokio1::test(crate = "tokio1")]
async fn my_test() {
println!("Hello world");
}Настроить поведение при необработанной панике
Доступны параметры shutdown_runtime и ignore. Подробнее см. в описании Builder::unhandled_panic.
Этот параметр совместим только со средой выполнения current_thread.
#[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;
}
Эквивалентный код без использования #[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;
})
}
Примечание: этот параметр зависит от нестабильного API Tokio. Сведения о том, как включить нестабильные возможности Tokio, см. в документации по нестабильным возможностям.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/attr.test.html