Тесты паникуют, когда HTTP-сервер запускается после закрытия старого

У меня есть несколько тестов, каждая функция запускает HTTP-сервер iron и закрывает его после завершения теста:

extern crate iron;

use iron::prelude::*;

fn hello_world(_: &mut Request) -> IronResult<Response> {
    Ok(Response::with((iron::status::Ok, "Hello World")))
}

#[test]
fn test1() {
    let mut server = Iron::new(hello_world).http("localhost:3000").unwrap();
    server.close().unwrap();
}

#[test]
fn test2() {
    let mut server = Iron::new(hello_world).http("localhost:3000").unwrap();
    server.close().unwrap();
}

Выполняя cargo test, я получаю:

Running target/debug/lib-f236975fe924352b

running 2 tests
test test1 ... ok
test test2 ... FAILED

failures:

---- test2 stdout ----
thread 'test2' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Error { repr: Os { code: 98, message: "Address already in use" } })', ../src/libcore/result.rs:736



failures:
test2

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured

Похоже, что к началу второго теста порт все еще используется.


person franza    schedule 07.12.2015    source источник
comment
Честно говоря, если возможно, я бы избегал использования сетевого трафика в модульном тесте. Вы не должны тестировать железо, в конце концов, только свой собственный код.   -  person Matthieu M.    schedule 09.12.2015
comment
Полностью с вами согласен, но я никогда не говорил, что пишу модульные тесты. Я пытался реализовать несколько тестовых примеров, которые доказывают, что мой код правильно взаимодействует с iron. Больше похоже на функциональное тестирование или что-то в этом роде.   -  person franza    schedule 10.12.2015


Ответы (1)


Средство запуска тестов Rust по умолчанию параллельно, так что да, я ожидаю, что это произойдет. Я бы выбрал другой номер порта для каждого теста, по крайней мере, для начала, так как это так просто.

person Steve Klabnik    schedule 07.12.2015
comment
Да, это то, что я сделал сразу. Есть ли возможность запускать тесты по одному? - person franza; 08.12.2015
comment
Переменная среды RUST_TEST_THREADS управляет числом, поэтому, если она установлена ​​на 1... - person Steve Klabnik; 08.12.2015
comment
Я только что попробовал RUST_TEST_THREADS=1, но все равно возникают те же ошибки - person franza; 08.12.2015