Как запустить сервер (процесс) на время интеграционных тестов? - PullRequest
0 голосов
/ 11 июля 2020

Моя проблема в том, что серверный процесс не завершается после последнего интеграционного теста.

В integration.rs у меня:

lazy_static! {
    static ref SERVER: Arc<Mutex<duct::ReaderHandle>> = {
        println!("Starting server");
        Arc::new(Mutex::new(
            cmd!("cargo", "run", "--", "13000")
                .reader()
                .expect("Valid server"),
        ))
    };
}

async fn wait_for_server() {
    lazy_static::initialize(&SERVER);
    // Code to wait
}

#[tokio::test]
async fn integration_test_query_amount() -> Result<()> {
    wait_for_server().await;
    let client = reqwest::Client::new();
    // Etc...
}

Тесты работают, но сервер продолжает работать после завершения вызова cargo test. Есть ли хороший рецепт для запуска и выключения такого сервера?

1 Ответ

1 голос
/ 11 июля 2020

Вы можете создать Drop оболочку для процесса, которая убьет его, когда он выйдет за пределы области видимости. Что-то вроде:

struct KillOnDrop(std::process::Child);

impl Drop for KillOnDrop {
    fn drop(&mut self) {
        self.0.kill()
    }
}

В качестве альтернативы, поскольку похоже, что вы уже используете tokio, tokio::process поддерживает это из коробки .

...