Подтвердить что ты не робот

Выполняются ли встроенные интеграционные тесты одновременно или последовательно?

Я пишу интеграционные тесты для работы с базой данных. В начале каждого теста я очищаю хранилище и создаю некоторые данные.

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

Я проверил базу данных и обнаружил, что документы, созданные в разных тестах, имеют примерно одинаковое время создания, даже когда я добавляю задержку для каждого теста (с std::thread::sleep_ms(10000)).

Можете ли вы прояснить, как выполняются тесты интеграции, и возможно ли запустить их в порядке?

4b9b3361

Ответ 1

Встроенная среда тестирования работает по умолчанию. Он разработан, чтобы предложить полезную, но простую поддержку для тестирования, которая охватывает многие потребности, и многие функции могут/должны быть протестированы с каждым тестом независимо от других. (Будучи независимыми, их можно запускать параллельно.)

Тем не менее, он прослушивает переменную среды RUST_TEST_THREADS, например. RUST_TEST_THREADS=1 cargo test будет запускать тесты в одном потоке. Однако, если вы хотите, чтобы эта функциональность для ваших тестов всегда, вам может быть интересно не использовать #[test], или, по крайней мере, не напрямую.

Наиболее гибким способом является поддержка cargo для тестов, которые полностью определяют их собственную структуру, через Cargo.toml:

[[test]]
name = "foo"
harness = false

При этом cargo test будет компилировать и запускать tests/foo.rs как двоичный файл. Это может гарантировать, что операции будут упорядочены /reset соответственно.

В качестве альтернативы, возможно, для такой структуры, как stainless, необходимы необходимые функции. (Я не использовал его, поэтому не уверен.)