Maksimum Ünite Testi etkinliği için C ++ Ünite Testi kodu nasıl düzenlenmelidir?


47
  • Bu soru, Birim Test Çerçeveleri ile ilgili değildir .
  • Bu soru Ünite Testleri yazmakla ilgili değil .
  • Bu soru UT kodunun nereye yazılacağı ve nasıl / ne zaman / nerede derlenip çalıştırılacağı ile ilgilidir.

In Legacy Kodu Etkin Çalışma Michael Tüyler iddia

iyi birim testleri ... hızlı koş

ve şu

Çalıştırmak için saniyenin 1 / 10'unu alan birim testi yavaş birim testidir.

Bence bu tanımlar anlamlı. Ayrıca, bir Birim Testler seti ve Ayrı Daha Uzun Süren Bir Kod Testleri seti tutmanız gerektiğini ima ederler , ancak sanırım (çok) hızlı bir şekilde çalışıyorsa, Birim Testini çağırmak için ödediğiniz fiyat. .

Açıkçası sorun C ++ ise "run" o senin Birim Testi ( ler ), etmelisin:

  1. Kodunuzu düzenleyin (hangi döngüye girdiğinize bağlı olarak üretim veya Birim Testi)
  2. derleme
  3. bağlantı
  4. Başlangıç Birim Test çalıştırılabilir ( ler )

Düzenleme (garip yakın oylamadan sonra) : Ayrıntılara girmeden önce, buradaki noktayı özetlemeye çalışacağım:

C ++ Ünite Testi kodu etkin bir şekilde düzenlenebilir, böylece hem (test) kodunu düzenlemek hem de test kodunu çalıştırmak etkili olur?


Bu durumda ilk sorun , Ünite Test kodunu nereye koyacağınıza karar vermektir , böylece:

  • ilgili üretim kodu ile birlikte düzenlemek ve görüntülemek "doğal" dır.
  • şu anda değiştirdiğiniz birim için derleme döngüsünü başlatmak kolay / hızlıdır

İkinci , ilgili problem daha sonra neler geribildirim anlık böylece derlemek.

Aşırı seçenekler:

  • Her Birim-Test-Test-Birimi ayrı bir cpp dosyasında yaşar ve bu cpp dosyası ayrı bir şekilde derlenir + ayrı ayrı bir araya getirilir (test ettiği kaynak kod birim dosyasıyla birlikte), daha sonra bu bir Birim Testini çalıştırır.
    • (+) Bu, tek Test Ünitesi için başlatma (derleme + bağlantı!) Süresini en aza indirir.
    • (+) Test süper hızlı çalışıyor, çünkü yalnızca bir üniteyi test ediyor.
    • (-) Tüm süitin yürütülmesi bazilyonlarca işlem başlatmaya ihtiyaç duyacaktır. Yönetmek için bir sorun olabilir.
    • (-) Sürecin başlangıcındaki yükler görünür hale gelecektir
  • Diğer taraf ise - hala - her test için bir cpp dosyası olacaktı, ancak tüm test cpp dosyaları (test ettikleri kod ile birlikte!) Bir çalıştırılabilir (bir proje başına / proje başına / seçiminizi seçmek) ile bağlantılı.
    • (+) Derleme zamanı hala TAMAM olacaktır, çünkü sadece değiştirilen kod derlenecektir.
    • (+) Çalıştırmak için yalnızca bir exe olduğundan, tüm paketi çalıştırmak kolaydır.
    • (-) Herhangi bir nesnenin her bir yeniden derlemesi bir yeniden bağlantıyı tetikleyeceğinden süitin bağlantısı yaşlanacaktır.
    • (-) (?) Tüm Ünite Testleri hızlı ise, zaman tamam olmalıdır , ancak takım elbise çalıştırmak için daha uzun sürer .

Peki, gerçek dünya C ++ Birim Testleri nasıl yapılır? Bunları yalnızca gece / saatte çalıştırıyorsam, ikinci bölüm gerçekten önemli değil, ilk bölüm, UT kodunu üretim koduna nasıl "bağlayacağımı" yani geliştiricilerin her ikisini de içinde tutmaları "doğal" odak daima bence önemli. (Eğer geliştiriciler odakta UT koduna sahipse, onu çalıştırmak isterler ki bu bizi ikinci bölüme geri getirir.)

Gerçek dünya hikayeleri ve deneyim takdir!

Notlar:

  • Bu soru kasıtlı olarak belirtilmemiş bir platform ve marka / proje sistemi bırakır.
  • Etiketli Sorular UT & C ++ başlamak için harika bir yer, ancak ne yazık ki çok fazla soru ve özellikle de cevaplar ayrıntılara veya belirli çerçevelere çok fazla odaklanmış durumda.
  • Bir süre önce, destek birimi testlerinin yapısı ile ilgili benzer bir soruyu cevapladım . Bu yapının "gerçek", hızlı Birim Testleri için eksik olduğunu buldum. Ve diğer soruyu çok dar buluyorum, bu yüzden bu yeni soru.

6
Başka bir komplikasyon C ++ deyimiyle, zamanı derlemek için olabildiğince fazla hatayı taşıma deyimi ortaya çıkar - iyi bir birim test takımı genellikle, belirli bir kullanımın derlenemediğini test edebilmeyi gerektirir.

3
@ Kapaklar: Lütfen sizi bu soruyu kapatmaya iten tartışmaları sunabilir misiniz?
Luc Touraille,

Bunun neden kapatılması gerektiğini anlamıyorum. :-(Bu forumda değilse, bu soruların cevaplarını nerede arayacağınızı düşünüyorsunuz?

2
@Joe: Derleyicinin bana bunu söyleyeceği zaman bir şeyin derlenip derlenmeyeceğini bulmak için neden birim testine ihtiyacım var?
David Thornley

2
@ David: Eğer emin olmasını istediğimizden dolayı derleme değil . Hızlı örnek, bir girişi kabul eden ve çıktı üreten bir Pipeline<A,B>.connect(Pipeline<B,C>)derleme nesnesi olacaktır, oysa Pipeline<A,B>.connect(Pipeline<C,D>)derlenmemelidir: İlk aşamadaki çıktı türü, ikinci aşamadaki girdi türü ile uyumlu değildir.
sebastiangeiger

Yanıtlar:


6

Tüm birim testlerini (bir modül için) tek bir çalıştırılabilirde gerçekleştirdik. Testler gruplara ayrılmıştır. Test çalıştırıcısının komut satırında bir (test / grup) adı belirterek tek bir test (veya bazı testler) veya bir test grubu yürütebilirim. Yapı sistemi "Yapı" grubunu çalıştırabilir, test departmanı "Hepsi" ni çalıştırabilir. Geliştirici bazı testleri "BUG1234" gibi bir gruba koyabilir ve 1234 üzerinde çalıştığı davanın sorunlu takip numarasıdır.


6

İlk önce, "1) (üretim) kodunuzu ve Birim Testinizi düzenleyin" ile aynı fikirde değilim. Bir seferde yalnızca birini değiştirmelisiniz, aksi halde sonuç değişirse, hangisine neden olduğunu bilemezsiniz.

Birim testlerini ana ağacı gölgeleyen bir dizin ağacına koymak hoşuma gidiyor. Eğer varsa /sources/componentA/alpha/foo.ccve /objects/componentA/beta/foo.oo zaman /UTest_sources/componentA/alpha/test_foo.ccve gibi bir şey istiyorum /UTest_objects/componentA/beta/test_foo.o. Stub / mock nesneler ve testlerin ihtiyaç duyduğu diğer kaynaklar için aynı gölge ağacını kullanıyorum. Bazı son vakalar olacak, ancak bu şema işleri çok kolaylaştırıyor. İyi bir editör makrosu test kaynağını konu kaynağının yanında zahmetsizce çekebilir. İyi bir derleme sistemi (örn. GNUMake), her ikisini de derleyebilir ve testi tek bir komutla çalıştırabilir (örn. make test_foo) Ve bazilyon gibi bir işlemi yönetebilir - sadece son testten bu yana kaynakları değişmiş olan - oldukça kolay Asla bir sorun olarak bu işlemlere başlamanın yükünü bulamadım, O (N)).

Aynı çerçevede, birçok nesneyi birbirine bağlayan ve birçok testi çalıştıran daha büyük ölçekli testler (artık birim testi yok) yapabilirsiniz. İşin püf noktası bu testleri inşa etmek / çalıştırmak için ne kadar zaman alacağına göre sıralamak ve buna göre günlük programınıza göre çalışmaktır. İstediğiniz zaman bir saniye veya daha az testi yapın; on saniye testine başlayın ve gerin; beş dakikalık test ve bir mola; yarım saatlik test ve öğle yemeği için gitmek; altı saatlik test ve eve git. Çok fazla zaman harcıyorsanız, örneğin sadece küçük bir dosyayı değiştirdikten sonra çok büyük bir testi yeniden bağlama, yanlış yapıyorsunuz - bağlantı anında olsaydı bile çağrılmadı.


reklam (1) - evet bu dikkatlice ifade edildi
Martin Ba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.