2016-06-07 3 views
7

У меня есть файл с некоторыми критериями и тестами и вы хотите протестировать стабильную, бета-версию и ночную. Однако либо я не использую эталонный тест, а стабильную/бета-жалобу. Есть ли способ скрыть все эталонные части при использовании стабильной/бета-версии?Игнорировать тесты при использовании стабильной/бета-версии

В качестве примера следующий код из book:

#![feature(test)] 

extern crate test; 

pub fn add_two(a: i32) -> i32 { 
    a + 2 
} 

#[cfg(test)] 
mod tests { 
    use super::*; 
    use test::Bencher; 

    #[test] 
    fn it_works() { 
     assert_eq!(4, add_two(2)); 
    } 

    #[bench] 
    fn bench_add_two(b: &mut Bencher) { 
     b.iter(|| add_two(2)); 
    } 
} 

Я использую rustup и хотел бы один и тот же файл, чтобы работать со всеми сборками, называя что-то вроде:

rustup run nightly cargo bench --bin bench --features "bench" 
rustup run nightly cargo test --bin bench --features "bench" 
rustup run beta cargo test --bin bench 
rustup run stable cargo test --bin bench 

Я смог скрыть #![feature(test)] с #![cfg_attr(feature = "bench", feature(test))]. Могу ли я сделать что-то похожее на остальные эталонные части? Что такое хороший ресурс для флагов функций?

+0

Вы пробовали поставить тесты в свой собственный файл (в папке 'bench')? –

+2

Папка «скамейки» работает, по крайней мере, для библиотек. Я не уверен, как я могу использовать его вместе с, например, функции из 'bin/bench.rs'. Я также обнаружил запись '# [cfg (feature =" bench ")]' перед всем, что связано с эталоном, с флагом "' --features "bench". –

ответ

11

В моих проектах я устанавливаю тесты в отдельном модуле, как и для тестов. Затем я создаю функцию Cargo, которая позволяет им. В этом отрывке, я использовал имя функции unstable, но вы можете использовать все, что вы хотели:

Cargo.toml

# ... 

[features] 
unstable = [] 

# ... 

SRC/lib.rs

#![cfg_attr(feature = "unstable", feature(test))] 

#[cfg(test)] 
mod tests { 
    #[test] 
    fn a_test() { 
     assert_eq!(1, 1); 
    } 
} 

#[cfg(all(feature = "unstable", test))] 
mod bench { 
    extern crate test; 
    use self::test::Bencher; 

    #[bench] 
    fn a_bench(b: &mut Bencher) { 
     let z = b.iter(|| { 
      test::black_box(|| { 
       1 + 1 
      }) 
     }); 
    } 
} 

В строке #[cfg(all(feature = "unstable", test))] говорится только компилировать следующий элемент, если функция установлена ​​и мы все равно компилируем в тестовом режиме. Аналогично, #![cfg_attr(feature = "unstable", feature(test))] включает только флаг функции test, когда включена функция unstable.

Приведен пример in the wild.

5

Есть ли способ скрыть все эталонные части при использовании стабильной/бета-версии?

Да, и вы можете сделать это автоматически с помощью build script, поэтому нет необходимости указывать --features при выполнении груза. В скрипте сборки вы можете обнаружить версию компилятора Rust и определить функцию (например, "nightly"). Затем в исходном коде вы можете сгруппировать свои тесты и включить их, если эта функция была определена.

Cargo.toml

[package] 
build = "build.rs" 

[features] 
nightly = [] 

[build-dependencies] 
rustc_version = "0.1.*" 

build.rs

extern crate rustc_version; 

use rustc_version::{version_meta, Channel}; 

fn main() { 
    if version_meta().channel == Channel::Nightly { 
     println!("cargo:rustc-cfg=feature=\"nightly\""); 
    } 
} 

src/lib.rs

#![cfg_attr(all(feature = "nightly", test), feature(test))] 

#[cfg(all(feature = "nightly", test))] 
extern crate test; 

pub fn add_two(a: i32) -> i32 { 
    a + 2 
} 

#[cfg(test)] 
mod tests { 
    // tests 
} 

#[cfg(all(feature = "nightly", test))] 
mod benchs { 
    use test::Bencher; 
    // benchs 
} 
7

Cargo поддерживает каталог скамейки для контрольных тестов. Если вы поместите их туда, вы можете просто никогда не запускать «скамейку для груза» на бета-версии/стабильном режиме и запускать ее только в ночное время.

+0

Замечания по вопросу: * Папка «скамейки» работает, по крайней мере, для библиотек. Я не уверен, как я могу использовать его вместе с, например, функции из 'bin/bench.rs' * - возможно, вы понимаете, что это значит и может его решить? – Shepmaster

+0

Обычно эталонные тесты предназначены для определенных функций, а не для двоичных файлов. Поэтому я не думаю, что это выполнимо. –

Смежные вопросы