2015-05-11 15 views
9

Mam skrzynkę z kodem produkcyjnym w katalogu src i testy integracji w katalogu tests. Kod produkcyjny wykorzystuje makra log.Jak zainicjować rejestrator do testów integracji?

Chciałbym init globalny rejestrator podczas uruchamiania testów integracyjnych (np env_logger::init().unwrap();) Istnieje kilka testów i kolejność test nie jest określony, więc nie wiem, w którym test powinien umieścić polecenia zainicjowany.

Czy mogę to ładnie zrobić? Być może przez przesłonięcie funkcji testu?

Odpowiedz

5

Nie ma dobrego sposobu na zrobienie tego rodzaju rzeczy w tej chwili.

Można napisać makro, które wstawia wywołanie inicjujące przed każdym testem, ale jest tak blisko, jak jest.

1

Na razie można po prostu ponownie zainicjować rejestrator u góry każdego testu i zignorować błąd. To nie jest ładne rozwiązanie, ale działa i jest całkowicie bezpieczne.

let _ = env_logger::init(); 

// your test code... 
4

Można użyć czegoś takiego:

use std::sync::{Once, ONCE_INIT}; 

static INIT: Once = ONCE_INIT; 

/// Setup function that is only run once, even if called multiple times. 
fn setup() { 
    INIT.call_once(|| { 
     env_logger::init().unwrap(); 
    }); 
} 

Następnie wystarczy zadzwonić setup() na początku każdego testu.

Pierwotnie na podstawie this blogpost.

0

Zaobserwowałem, że cargo test przeprowadziłem testy w kolejności alfabetycznej, więc wymyśliłem bardzo brudny hack, aby zainicjować rejestrator.

  1. Zrobiłem moduł o nazwie aaa_testing znajdujący się wewnątrz korzenia skrzyni.
  2. Wewnątrz modułu napisałem inicjator rejestratora.

    #[test] 
    fn initialize_logger() { 
        env_logger::init(); 
    } 
    

Tak zrobiłem stworzyć test, który będzie zawsze przejdzie, ale jeśli chcesz mieć test inicjalizacji rejestratora można zrobić assert!(env_logger::try_init().is_ok());


Shepmaster podkreślić, że cargo test wykonuje testy asynchronicznie i może uniemożliwić rejestrację pierwszych kilku testów. Aby temu zapobiec, testy można uruchomić w tym samym wątku. (Może to spowodować problemy z wydajnością, więc ta odpowiedź nie powinien być stosowany, jeśli potrzebujesz wielu wątków do testowania projektu.)

Jeśli chcesz kontrolować liczbę jednoczesnych przypadków testowych działa, przechodzą opcję --test-threads do plików binarnych testowych:

cargo test -- --test-threads=1 
+0

jest to bardzo zły pomysł, ponieważ ciężarowy biegnie równolegle testy domyślnie. To prawdopodobnie wprowadzi próbny brak płynności w kilku pierwszych testach przeprowadzanych w tym samym czasie. – Shepmaster

+0

Huh, nie wiedziałem o tym, nie są one dla mnie równoległe. Dzięki za napiwek. Ok Dowiedziałem się z 'ładunku testowego --help', że liczba wątków testowych to liczba procesorów, które mam. Zaktualizuję odpowiedź, aby to zauważyć. –

+0

[Domyślnie działają równolegle] (https://doc.rust-lang.org/stable/book/second-edition/ch11-02-running-tests.html#running-tests-in-parallel-or- po kolei), więc jeśli nie wyłączyłeś tego wyraźnie, to nadal będzie to miało wpływ na testy. – Shepmaster

Powiązane problemy