Читаем Rust на примерах полностью

/// # Ok(()) // возвращается из try_main

/// # }

/// # fn main() { // начало `main` которая выполняет `unwrap()`

/// # try_main().unwrap(); // вызов `try_main` и извлечение результата

/// # // так что в случае ошибки этот тест запаникует

/// # }

pub fn try_div(a: i32, b: i32) -> Result {

if b == 0 {

Err(String::from("Деление на 0"))

} else {

Ok(a / b)

}

}

<p id="Смотрите_также_71"><strong><a l:href="#Смотрите_также_71">Смотрите также:</a></strong></p>

   • RFC505 по стилю документации

   • Рекомендации для API по документационному тестированию

<p id="Интеграционное_тестирование"><strong><a l:href="#Интеграционное_тестирование">Интеграционное тестирование</a></strong></p>

Модульные тесты тестируют по одному модулю изолированно: они малы и могут проверить не публичный код. Интеграционные тесты являются внешними для вашего пакета и используют только его открытый интерфейс, таким же образом, как и любой другой код. Их цель в том, чтобы проверить, что многие части вашей библиотеки работают корректно вместе.

Cargo ищет интеграционные тесты в каталоге tests после каталога src.

Файл src/lib.rs:

// Предположим, что наш пакет называется `adder`, для теста он будет внешним кодом.

pub fn add(a: i32, b: i32) -> i32 {

a + b

}

Файл с тестом: tests/integration_test.rs:

// мы тестируем extern crate, как и любой другой код.

extern crate adder;

#[test]

fn test_add() {

assert_eq!(adder::add(3, 2), 5);

}

Запустить тесты можно командой cargo test:

$ cargo test

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Running target/debug/deps/integration_test-bcd60824f5fbfe19

running 1 test

test test_add ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Doc-tests adder

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Каждый файл с исходным кодом в директории tests компилируется в отдельный пакет. Один из путей использовать некоторый общий код между интеграционными тестами - создать модуль с публичными функциями и импортировать их в тестах.

Файл tests/common.rs:

pub fn setup() {

// некоторый код для настройки, создание необходимых файлов/каталогов, запуск серверов.

}

Файл с тестом: tests/integration_test.rs

// мы тестируем extern crate, как и любой другой код.

extern crate adder;

// импорт общего модуля.

mod common;

#[test]

fn test_add() {

// использование общего кода.

common::setup();

assert_eq!(adder::add(3, 2), 5);

}

Модули с общим кодом следуют обычным правилам модулей. Общий модуль можно создать как tests/common/mod.rs.

<p id="dev_dependencies"><strong><a l:href="#dev_dependencies">dev-dependencies</a></strong></p>

Иногда возникает необходимость иметь зависимости только для тестов (примеры, бенчмарки). Такие зависимости добавляются в Cargo.toml в секцию [dev-dependencies]. Эти зависимости не распространяются как зависимости на другие пакеты, которые зависят от этого пакета.

Одним из таких примеров является пакет расширяющий стандартный макрос assert!. Файл Cargo.toml:

# при стандартной сборке проекта данная зависимость не будет использоваться.

[dev-dependencies]

pretty_assertions = "0.4.0"

Файл src/lib.rs:

// внешний пакет используется только для тестирования

#[cfg(test)]

#[macro_use]

extern crate pretty_assertions;

pub fn add(a: i32, b: i32) -> i32 {

a + b

}

#[cfg(test)]

mod tests {

use super::*;

#[test]

fn test_add() {

assert_eq!(add(2, 3), 5);

}

}

<p id="Смотрите_также_72"><strong><a l:href="#Смотрите_также_72">Смотрите также:</a></strong></p>

Документация Cargo по указанию зависимостей.

<p id="Небезопасные_операции"><strong><a l:href="#Небезопасные_операции">Небезопасные операции</a></strong></p>
Перейти на страницу:

Похожие книги

Писать нельзя молчать
Писать нельзя молчать

Неужели ты опять отложишь мечту – написать книгу? Опять занят и считаешь затею глупостью? А ведь чтобы сотворить историю нужно совсем немного: капелька поддержки на старте, чуток теории в процессе и безудержная энергия творчества, которую я помогу тебе разбудить. Или вспомнить.Мир живёт историями, и каждый может стать увлекательным рассказчиком. В этой книге я дам ответы на самые животрепещущие вопросы писателя-новичка. Эта книга для тех, кто:• Хочет писать истории, но откладывает дело в долгий ящик;• Писал раньше, но разуверился в своих силах;• Боится показаться глупым мечтателем в глазах близких;• Боится совершить ошибки;• Просто застрял и не знает, как воплотить свою идею;• Давно пишет, но не может довести до конца ни одну историю;• Не знает, как найти свою аудиторию, как с ней общаться;• Хочет почерпнуть вдохновение от общения с коллегой по писательскому делу.Эта книга написана без лишнего пафоса и с конкретными шагами на внедрение. Все, что остается, это сесть поудобнее и приступить к чтению.В формате PDF A4 сохранен издательский макет книги.

Юрий Михайлович Окунев , Юрий Окунев

Хобби и ремесла / Учебные пособия, самоучители / Дом и досуг