cargo естественно, обеспечивает простой способ запуска всех ваших тестов!
$ cargo test
Вы должны увидеть примерно такой результат:
$ cargo test
Compiling blah v0.1.0 (file:///nobackup/blah)
Finished dev [unoptimized + debuginfo] target(s) in 0.89 secs
Running target/debug/deps/blah-d3b32b97275ec472
running 3 tests
test test_bar ... ok
test test_baz ... ok
test test_foo_bar ... ok
test test_foo ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Вы также можете запустить тесты, чьё имя соответствует шаблону:
$ cargo test test_foo
$ cargo test test_foo
Compiling blah v0.1.0 (file:///nobackup/blah)
Finished dev [unoptimized + debuginfo] target(s) in 0.35 secs
Running target/debug/deps/blah-d3b32b97275ec472
running 2 tests
test test_foo ... ok
test test_foo_bar ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out
Одно слово предостережения: Cargo может выполнять несколько тестов одновременно, поэтому убедитесь, что они не участвуют в гонках друг с другом. Например, если они все выводят в файл, вы должны заставить их записывать в разные файлы.
Иногда обычной сборки, предоставляемой cargo, недостаточно. Возможно вашему крейту нужны некоторые предварительные условия, прежде чем он успешно скомпилируется, например кодогенерация или предварительно должен скомпилироваться какой-то нативный код. Для решения этой проблемы, мы имеем скрипты сборки, которые cargo может запустить.
Для добавления скрипта сборки в ваш пакет, вы можете указать его в Cargo.toml следующим образом:
[package]
...
build = "build.rs"
Иначе по умолчанию cargo будет искать файл build.rs в директории проекта.
Скрипт сборки - это просто другой файл на Rust, который будет скомпилирован и вызван до компиляции чего-либо другого в пакете. Следовательно он может быть использовать для выполнения предварительных условий вашего крейта.
Через переменные окружения cargo предоставляет скрипту входные параметры описанные здесь, которые могут быть использованы.
Скрипт возвращает значения через stdout. Все напечатанные строки записываются в target/debug/build/
Больше информации и примеров можно найти в спецификации cargo.
Атрибуты — это метаданные, применяемые к какому-либо модулю, контейнеру или их элементу. Благодаря атрибутам можно:
• задать условия компиляции кода
• задать имя, версию и тип (библиотека или исполняемый файл) контейнера
• отключить проверки (lints)
• включить возможности компилятора (макросы, глобальный импорт и другое)
• линковаться с внешней библиотекой
• пометить функции как модульные тесты
• пометить функции, которые будут частью теста производительности
Когда атрибуты применяются ко всему контейнеру, их синтаксис будет #![crate_attribute], а когда они применяются к модулю или элементу модуля, их синтаксис станет #[item_attribute] (обратите внимание на отсутствие !).
Атрибуты могут принимать аргументы с различным синтаксисом:
• #[attribute = "value"]
• #[attribute(key = "value")]
• #[attribute(value)]
Атрибуты могут иметь несколько значений и быть разделены несколькими строками:
#[attribute(value, value2)]
#[attribute(value, value2, value3,
value4, value5)]
Компилятор предоставляет
fn used_function() {}
// `#[allow(dead_code)]` — атрибут, который убирает проверку на неиспользуемый код
#[allow(dead_code)]
fn unused_function() {}
fn noisy_unused_function() {}