Игнорируйте часть функции во время тестов

#rust

Вопрос:

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

Есть ли способ заставить длительно работающую функцию работать при обычном использовании, но не при тестировании hello_world функции?

Детская площадка Ржавчины

 fn main() {
    hello_world();
}

fn hello_world() {
    println!("Hello, world!");

    // Can I ignore this when testing?
    long_running_function();
}

fn long_running_function() {
    for i in 1..100000 {
        println!("{}", i);
    }
}

#[test]
fn hello_world_test() {
    hello_world();
}
 

Ответ №1:

Вы можете использовать #[cfg(not(test))] :

 #[cfg(not(test))]
long_running_function();
 

Или макроэквивалент:

 if !cfg!(test) {
    long_running_function();
}
 

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

 #[cfg(not(test))]
fn long_running_function() {
    for i in 1..100000 {
        println!("{}", i);
    }
}

#[cfg(test)]
fn long_running_function() {
    // not so long code
}
 

В противном случае вы всегда можете передать логическое значение hello_world() и создать условие на основе этого логического значения.

Комментарии:

1. #[cfg(not(test))] обведите определение longfunction и напишите альтернативный макет для тестирования. Я думаю, что это чище, чем иметь макрос вокруг вызова.

2. @Simson хорошая мысль! Я добавлю это к ответу