it-swarm-tr.com

C++ kodu için birim testi - Araçlar ve metodoloji

Birkaç yıldır geliştirilmekte olan büyük bir c ++ sistemi üzerinde çalışıyorum. Mevcut kodun kalitesini iyileştirme çabasının bir parçası olarak, uzun ve uzun vadeli refactoring projelerine imza attık.

C++ 'da birim testleri yazmama yardımcı olacak iyi bir araç biliyor musunuz? Belki Junit veya Nunit'e benzer bir şey?

Birisi akıl testi olmadan yazılan modüller için ünite testi yazma metodolojisi hakkında birileri tavsiye verebilir mi?

134
Sakin

Eski kodlara birim testleri uygulamak, very nedeni _ ​​ Eski Kod ile Etkili Çalışmak idi. Michael Feathers yazarı - diğer cevaplarda da belirtildiği gibi, hem CppUnit hem de CppUnitLite 'in oluşturulmasında yer aldı.

alt text

78
Joe Schneider

Google, kısa bir süre önce Google Test adlı C++ uygulamalarını test eden kendi kütüphanesini çıkardı.

Google Kodundaki Proje

38
agnul

Müsait birkaç süit arasında mükemmel bir kıyaslama yapın. Bu makalenin yazarı daha sonra UnitTest ++ geliştirdi.

Bu konuda özellikle sevdiğim şey (istisnaları vs. iyi şekilde ele almasının dışında), test senaryoları ve test fikstürlerinin tanımında çok sınırlı miktarda 'yönetim' olduğu. 

30
andreas buykx

Boost bir Test kütüphanesine sahiptir bu ünite testi için destek içerir. Kontrol etmeye değer olabilir.

24
Jonas

Noel Llopis İçeriden Oyunlar, C++ Birim Test Çerçevesini Keşfetme Jungle , çeşitli C++ Birim Test çerçevelerinin kapsamlı bir (ama şimdi tarihli) değerlendirmesinin yanı sıra oyun programlaması üzerine bir kitap .

CppUnitLite'ı uzun süre kullandı, çeşitli şeyleri düzeltti, ama sonunda başka bir birim test kütüphanesi yazarı ile güçlerini birleştirdi ve UnitTest ++ 'ı üretti. Burada UnitTest ++ kullanıyoruz ve şimdiye kadar çok seviyorum. (Bana) tam olarak küçük bir ayak izi ile tam güç dengesine sahip. 

Ev yapımı çözümler kullandım, CxxTest (Perl gerektirir) ve boost :: test. Burada şu anki işimde birim testini uyguladığımda, UnitTest ++ vs boost :: test'e çok az geldi. 

Kullandığım çoğu kitaplıktan gerçekten hoşlanıyorum, ancak IMHO, artırma :: testi biraz fazla ağırdı. Özellikle, bir boost :: test makrosu kullanarak test bandının ana programını uygulamanızın (AFAIK) yapılmasından hoşlanmadım. Bunun "saf" TDD olmadığını biliyorum, ancak bazen komut satırına özel bir test bayrağı girildiğinde bir GUI uygulamasıyla test yapmak için bir yola ihtiyacımız var ve boost :: test bu türü destekleyemiyor Senaryo 

UnitTest ++, (sınırlı) deneyimimde karşılaştığım kurulum ve kullanımı en basit test çerçevesiydi. 

21
Brian Stewart

Mükemmel Boost.Test kütüphanesini çok daha az bilinen ancak oh-so-awesome Turtle library ile birlikte kullanıyorum: artırmaya dayalı sahte bir nesne kütüphanesi.

Bir kod örneği kelimelerden daha iyi konuşursa, calculator arabiriminde çalışan bir view nesnesini test etmek istediğinizi hayal edin:

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Sahte nesneye beklentiyi açıklamanın ne kadar kolay ve ayrıntılı olduğunu görün? Açıkçası, beklentiler karşılanmazsa test başarısız olur.

17
icecrime

Sadece kendi çerçevemi bastım, CATCH , orada. Halen geliştirilme aşamasındadır, ancak zaten pek çok başka çerçeveyi aştığına inanıyorum. Bir çeşnicibaşı. En iyi beş özelliğim:

  • Sadece başlık
  • Fonksiyon ve metot bazlı testlerin otomatik kaydı
  • Standart C++ ifadelerini LHS ve RHS'ye ayrıştırır (böylece tam bir assert makro ailesine ihtiyacınız yoktur).
  • İşlev tabanlı bir fikstür içindeki iç içe bölümler için destek
  • Doğal dil kullanılarak yapılan ad testleri - fonksiyon/yöntem adları

Aynı zamanda Objective-C bağları vardır.

14
philsquared

CxxTest , C++ için hafif, kullanımı kolay ve çapraz platformlu bir platformdur.

9
David Sykes
7
Jorge Ferreira

UnitTest ++ , küçük ve basit.

7
yrp

Şu anda şirketimizde uzun ömürlü bir kod tabanı için kullanılabilecek bir birim test ve sahte çerçeve arıyorum. Bildiğiniz gibi birim sınama çerçevelerinin listesi for c ++ uzun sürdüğü için, daha yakından bakılabilecek bir kısma indirgemek için bazı filtreler uyguladım. İlk filtre kriteri, ücretsiz olması gerektiğiydi. İkinci kriter proje faaliyeti idi. Ayrıca, alaycı çerçeveler aradım çünkü birim testleri yazmak istiyorsanız bir tanesine ihtiyacınız var.

Aşağıdaki listeye göre (yaklaşık olarak) aktiviteye göre sıraladım, en üstteki aktivite ile geldim:

  • GoogleTest/GoogleMock: Çok sayıda katılımcı ve Google tarafından kullanılıyor. Bu muhtemelen bir süre burada kalacak ve güncellemeler alacak. Özel kod tabanım için en hızlı trene atlamak umuduyla bu birleşime geçeceğim.

  • BoostTest + Turtle: Sık sık güncellenmedi, ancak test çerçevesi artırmanın bir parçası olduğu için sürdürülmesi gerekiyor. Öte yandan kaplumbağa esas olarak bir kişi tarafından sağlanıyor, ancak bu durumda kırılmayan bir aktivite var. Ölü değil. .. Bu kombinasyonla neredeyse tüm deneyimlerimi yaptım, çünkü daha önce yaptığım işyerinde boost kütüphanesini kullandık. özel kodum için kullan.

  • CppUTest: Test etme ve alay etme sağlar. Bu proje 2008'den 2015'e kadar aktif olmuştur ve oldukça yeni bir faaliyete sahiptir. Bu bulgu biraz şaşırtıcıydı çünkü web’de arama yaparken daha az etkinliğe sahip birçok proje daha sık ortaya çıktı (2013’te son güncellemesini yapan CppUnit gibi). Daha derine bakmadım, bu yüzden ayrıntılar hakkında hiçbir şey söyleyemem .Düzenleme (16.12.2015): Yakın zamanda bunu denedim ve bu çerçeveyi biraz sakar buldum ve "C- şık ", özellikle sahte sınıfları kullanırken. Ayrıca, diğer çerçevelerden daha küçük çeşitlilikte iddialara sahip görünüyordu. Bence asıl gücü saf C projeleriyle kullanılabileceği.

  • QTest: Qt çerçevesiyle birlikte verilen test kütüphanesi. Bakım bir süre garantili olmalı, ancak onu destekleyici bir kütüphane olarak kullanıyorum, çünkü test kaydı IMO'yu diğer çerçevelerde daha sakar kılıyor. Anladığım kadarıyla, sizi test fikstürü başına bir test exe yaptırmaya zorlar. Ancak Qt-Gui kodu test edilirken test yardımcı fonksiyonları iyi kullanılabilir. Alay yok.

  • Catch: Son aktivitesi var, ancak çoğunlukla bir kişi tarafından geliştiriliyor. Bu çerçeve hakkında güzel olan şey, testin içine yeniden kullanılabilir fikstür kodu yazmanıza izin veren alternatif fikstür yaklaşımıdır. Ayrıca test isimlerini tüm isimler olarak yazma eğiliminde olduğunuzda test isimlerini dizeler olarak ayarlamanıza izin verir. Bu tarzın sökülüp googleTest ;-) içine konulmasını diledim.

Sahte Altyapıları

Sahte çerçevelerin sayısı, test çerçevelerinin sayısından çok daha küçüktür, ancak burada son etkinliğe sahip olduğumu tespit ettik.

  • Hippomock: 2008 unitl'den itibaren aktif ancak düşük yoğunluklu.

  • FakeIt: 2013 unitl'den itibaren aktif ancak bir kişi tarafından daha fazla veya daha az geliştirildi.

Sonuç

Kod tabanınız uzun vadedeyse, BoostTest + Turtle ile GoogleTest + GoogleMock arasında seçim yapın. Sanırım bu ikisinin uzun süreli bakımı olacak. Yalnızca kısa ömürlü bir kod tabanınız varsa, Nice sözdizimine sahip Catch öğesini deneyebilirsiniz. O zaman ek olarak alaycı bir çerçeve seçmeniz gerekir. Visual Studio ile çalışıyorsanız, BoostTest ve GoogleTest için test çalıştırıcısı bağdaştırıcılarını indirebilirsiniz; bu, testleri VS'ye entegre edilmiş olan test çalıştırıcısı GUI ile çalıştırmanıza izin verir.

5
Knitschi

Ayrıca yakından ilgili "c ++ birim test aracını/çerçevesini seçme", here

3
TonJ

Ayrıca şablon tabanlı bir çerçeve olan TUT , Template-Unit-Test de vardır. Sözdizimi garip (bazıları şablona kötüye kullanma denir), ancak asıl avantajı hepsinin bir tekli başlık dosyası içinde olmasıdır. 

Burada TUT ile yazılmış ünite testi örneği bulacaksınız. 

3
philant

CppUTest , C ve C++ ünite testleri için mükemmel, hafif bir çerçevedir.

2
ratkok

CPPunit'i denedim ve kullanıcı dostu değil.

Bildiğim tek alternatif, C++ sınıflarınızı C++ sınıflarınızı sarmak ve birim sınamalarını .NET birim sınama çerçevelerinden (NUnit, MBUnit vs.) biriyle yazmak için kullanmak.

2
Dror Helper

Visual Studio 2008 SP1 kullanıyorsanız, birim sınamalarını yazmak için MSTest kullanmanızı şiddetle tavsiye ederim. Ben daha sonra alaycı yazmak için Google alay kullanın. IDE ile entegrasyon idealdir ve bir testin eklenmesi için üç yer düzenleme açısından CPPunit'in ek yüküne izin verir ve taşımaz.

1
Jared

Cfix'e bir göz atın ( http://www.cfix-testing.org ), Windows C/C++ gelişimi için uzmanlaşmıştır ve hem kullanıcı modu hem de çekirdek modu birim testini destekler.

1
Johannes Passing

ObjectMentor'dan Michael Feathers, hem CppUnit hem de CppUnitLite'ın geliştirilmesinde etkili oldu.

Şimdi tavsiye eder CppUnitLite

1
Seb Rose

Bence VisualAssert VS entegrasyonunda harika bir iş çıkarıyor. VS den testleri çalıştırıp hata ayıklamanızı sağlar ve testleri çalıştırmak için bir çalıştırılabilir dosya oluşturmanız gerekmez.

1
Ohad Horesh

CUnitWin32 'ye bakınız. MS Visual C için yazılmıştır. Bir örnek içerir.

1
Dushara

Fruktoz göz atın: http://sourceforge.net/projects/fructose/

Yalnızca başlık dosyaları içeren ve bu nedenle taşınabilir olan çok basit bir çerçevedir.

0
rik

Typemock İzolatör ++ ile MS Testi kullanıyorum. Bir şans ver!

0
Sam