2015-05-11 29 views
9

Ben tests dizinde src dizin ve entegrasyon testlerinde üretim koduyla bir sandık var. Üretim kodu log makrolarını kullanır.Entegrasyon testleri için kaydedici nasıl başlatılır?

(örn env_logger::init().unwrap();) entegrasyon testleri çalıştırırken ben küresel bir logger init istiyorum

Orada çeşitli testler ve deneme sırası tanımlı değil, bu yüzden hangi testi içinde ben initialize komutunu koymalıyız bilmiyorum.

Bunu güzelce yapabileceğimin bir yolu var mı? Belki de main işlevlerini geçersiz kılarak işlev?

cevap

5

yerleşik şu anda bu tür şeyleri yapmak için iyi bir yol yoktur.

Her test öncesinde başlatma çağrısı çeşit ekler bir makro yazabilir, ama orada olduğu kadar yakındır.

1

Şimdilik, sadece her testin üstündeki logger yeniden başlatmak ve hatayı göz ardı edebilirsiniz. Güzel bir çözüm değil ama işe yarıyor ve tamamen güvenli.

let _ = env_logger::init(); 

// your test code... 
4

Böyle bir şey kullanabilirsiniz:

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(); 
    }); 
} 

Sonra sadece her testin başında setup() diyoruz.

Başlangıçta this blogpost dayalı.

0

Ben alfabetik sıraya göre testler cargo test gözlenen ettik, bu yüzden logger başlatmak için bir çok kirli kesmek tasarladı.

  1. Kasanın kökü içinde bulunan aaa_testing adlı bir modül yaptım.
  2. Modül içinde kaydedici başlatıcıyı yazdım.

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

Evet hep geçecek bir test yarattı, ancak logger başlatılıyor için bir test yapmak istiyorsanız, bir assert!(env_logger::try_init().is_ok());


Shepmaster dikkat çekti yapabilirsiniz cargo test, sınamaları eşzamansız olarak çalıştırır ve ilk birkaç sınamayı güvenilmez duruma getirebilir. Bunu önlemek için, testler aynı iş parçacığı içinde çalıştırılabilir. (Bu, projeyi test için birden fazla konu gerekiyorsa, nedenle bu cevap kullanılmamalıdır performans sorunlarına neden olur.) Eğer eşzamanlı çalışan test vakalarının sayısını kontrol etmek istiyorsanız, --test-threads seçeneği geçmesi

Test binarylerine: Yük varsayılan olarak paralel testler çalıştığından,

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

Bu çok kötü bir fikirdir. Bu, muhtemelen aynı zamanda yürütülen ilk birkaç test için test pulluğunu tanıtacak. – Shepmaster

+0

Huh, Bunu bilmiyordum, onlar benim için paralel değiller. İpucu için teşekkürler. Ok 'Kargo testi - yardım' 'dan test ipliklerinin sayısının sahip olduğum CPU sayısı olduğunu öğrendim. Bunu not etmek için cevabı güncelleyeceğim. –

+0

[Varsayılan olarak paralel çalışırlar] (https://doc.rust-lang.org/stable/book/second-edition/ch11-02-running-tests.html#running-tests-in-parallel-or- ardışık olarak), bu yüzden bunu açıkça devre dışı bırakmadıkça, yine de testleri etkileyecektir. – Shepmaster

İlgili konular