Я пишу тесты для инструмента командной строки, который позволяет указать пейджер. Я хочу проверить, что инструмент передает правильные аргументы. Я подумал, что напишу однострочный двоичный файл, который проверяет аргументы и завершает работу с ненулевым кодом состояния (плюс некоторый вывод STDERR), если они не правы, а затем помещаю тест в tests/, который запускает этот двоичный файл и проверяет его output, который я могу запустить, как обычно, с помощью cargo test. Эта установка работает, если я помещаю двоичный файл в src/bin, но затем тестовый двоичный файл также устанавливается при использовании cargo install.
Когда я поместил файл .rs для двоичного файла в папку tests/, он просто не был скомпилирован в двоичный файл.
Я попытался поместить его под ящиком в той же рабочей области, но он не был построен при запуске cargo build в корневом ящике… если я не укажу его как элемент по умолчанию, и в этом случае мы вернемся к его установке при использовании cargo install.
Например, данный код выглядит так:
use std::process::Command;
fn run_pager(pager: &str) {
let output = Command::new(&pager)
.env("SOME_VAR", "FOO")
.spawn()
.expect("failed to run pager");
// do something with the command
}
И заглушка test-binary.rs выглядит так:
use std::env;
fn main() {
assert_eq!(env::var("SOME_VAR").unwrap(), "FOO");
// …produce output with special markers…
}
Как я могу записать tests/passes-correct-args.rs:
#[test]
fn runs_pager_with_args() {
// pass `test-binary` to `run_pager` and verify output
}
Это не метод с отступом для тестов tests/. Пожалуйста, просмотрите ссылки, которые я предоставил. «Тесты в ваших файлах src должны быть модульными, а тесты в tests / должны быть тестами в стиле интеграции.»
@MatthieuM., Если он портативный, я могу использовать что угодно. Он должен работать в Windows, Linux и OS X, о которых я знаю. Однако я бы не стал добавлять внешнюю зависимость вроде Python - это много для одного теста. Я полагал, что Rust - единственное, что есть у пользователя.
@hellow, не могли бы вы объяснить, почему это неверно и какой будет правильный метод?
@hellow: Разве это не проверка работы вызова другой программы точно интеграционным тестом?





Сделайте свой тестовый двоичный файл новым проектом Cargo в src, а затем ссылайтесь на него в своих основных проектах как на зависимость разработчика, используя относительный путь.
[dev-dependencies]
test_binary = { path = "src/test_binary", version = "0.1" }
Это звучит многообещающе, но если я сделаю это бинарным ящиком, то этот бинарный файл никогда не будет собран во время компиляции или тестирования основного ящика, а с библиотечным ящиком я получаю только файл .d в target/debug/. Есть ли способ обойти это?
Сохраните бинарный ящик, но добавьте к нему файл lib.rs. Он строится сейчас?
Похоже, это невозможно github.com/rust-lang/cargo/issues/2267. Я думаю, вы могли бы попробовать вызвать компилятор из своих тестов.
Blast ... Я надеялся избежать этого, так как я ничего не знаю о компиляторе, но, думаю, у меня нет выбора в этом случае. (Я пробовал добавить lib.rs в бинарный ящик, прежде чем комментировать. Он просто игнорирует бинарный файл.)
Вам абсолютно необходимо, чтобы программа Rust вызывалась для проверки входных данных, или достаточно простого скрипта (bash / python)?