C ++ kodu için birim testi - Araçlar ve yöntem [kapalı]


134

Birkaç yıldır geliştirilmekte olan büyük bir c ++ sistemi üzerinde çalışıyorum. Mevcut kodun kalitesini artırma çabasının bir parçası olarak, uzun vadeli büyük bir yeniden düzenleme projesi yürüttük.

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

Herhangi biri, birim testi göz önünde bulundurulmadan yazılan modüller için birim testleri yazma metodolojisi hakkında iyi tavsiyeler verebilir mi?


Yanıtlar:


83

Eski kodlara birim testleri uygulamak , Eski Kod ile Etkili Çalışma'nın yazılmasının sebebiydi . Michael Tüyler yazar - diğer yanıtlar belirtildiği gibi, her ikisinin oluşturulması dahil oldu cppunit ve CppUnitLite .

alternatif metin


4
Bir küçük resim eklendi - oy verildi. Kitap, herhangi bir araçtan daha fazla yardımcı olur.
Gishu

2
CPPUnit'in test yazmayı kolaylaştırabileceğini düşünüyorum. CPPUnit kullanıyoruz, ama memnun değilim. Her test için iki dosyayı güncellemem gerekiyor ve bence, bir test şöyle yazılmalı: 'TEST ("testname") {ASSERT (1 == 1);}' Öte yandan kitap herkes için bir zorunluluktur, sadece eski kodla çalışanlar için değil, aynı zamanda onu
yaratanlar

9
Ne zamandan beri c ++ eski ?!
Nils

9
BT, C ++ 'ın eski olmadığı anlamına gelmez - doğru hatırlarsam, bu kitap, eski bir projeyi, yok veya çok az birim testi olmayan bir proje olarak tanımlar. Bu tür projeler, birim testleri yazma / zorlama eğilimi gösterir, çünkü test güdümlü geliştirme, kod tabanını hiçbir zaman etkilemediği için bunları yazmak önemsizdir.
Arafangion

7
@Nils: Kitabın Amazon yorumcularından biri olarak, "eski kod, birim testleri olmayan koddur", bu da tam olarak bu soruyla ilgilidir.
David Johnstone

40

Google kısa süre önce Google Test adı verilen C ++ uygulamalarını birim test etmek için kendi kitaplığını yayınladı.

Google Code ile ilgili proje


1
VC ++ ile kullanmak mümkün

Oldukça iyi görünüyor, özellikle her iddiaya açıklama eklemek zorunda. Aşağı tarafta, şahsen gerçekten sınıflara benzemeyen makrolar yerine Unit Test sınıfına sahip olmayı tercih ediyorum.
Wernight

3
başka bir güzel nokta alaycı olasılıklar: code.google.com/p/googlemock
Philipp

Testlerin çalışması için tonlarca makro ve sihirli dosya gerektiren CPPUNIT'ten bu kadar güzel buluyorum
paulm

30

Mevcut çeşitli süitler arasında mükemmel bir karşılaştırma yapın . Bu makalenin yazarı daha sonra UnitTest ++ geliştirdi .

Bu konuda özellikle sevdiğim şey (istisnaları vb. İyi ele alması dışında), test senaryoları ve test armatürleri tanımının etrafında çok sınırlı miktarda 'yönetim' olmasıdır.


2
Temel hatamız bu değil mi? Mevcut projeler hakkında iyi bir kavrayışa sahiptir - ancak bunları geliştirmek yerine kendi başına başlar.
peterchen

@peterchen: evet; Ancak daha sonra UnitTest ++ o kadar küçük ve hafiftir ki ayrı bir proje olma değerine sahiptir - hazırlanmak ve çalıştırmak çok kolaydır.
TimStaley

24

Boost, birim testi için destek içeren bir Test kütüphanesine sahiptir. Kontrol etmeye değer olabilir.


4
Bu mükemmel araç setini önerebilirim.
Rob

1
Evet, destek yoludur. Tepegöz yok, sadece test et ve git! Aslında kurtarmaya geldiğimde umutsuzluk içinde kendi çerçevem ​​üzerinde çalışıyordum. Teşekkür ederim boost (her şey için!)
daramarak

Giriş yazdığım bir makaleye göz atabilirsiniz Boost Unit Testing beroux.com/english/articles/boost_unit_testing
Wernight

21

İçerideki Oyunlardan Noel Llopis , çeşitli C ++ Birim Testi çerçevelerinin kapsamlı (ancak şimdi tarihli) bir değerlendirmesinin yanı sıra oyun programlama hakkında bir kitap olan C ++ Birim Test Çerçevesi Ormanını Keşfetmenin yazarıdır .

CppUnitLite'yi bir süre için kullandı, çeşitli şeyleri düzeltti, ancak sonunda başka bir birim test kütüphanesi yazarı ile güçlerini birleştirdi ve UnitTest ++ üretti . UnitTest ++ kullanıyoruz ve şimdiye kadar çok beğendim. (Bana göre) küçük bir ayak izi ile tam doğru güç dengesine sahip.

Evde büyüyen çözümler, CxxTest (Perl gerektirir) ve boost :: test kullandım. Mevcut işime burada birim testi uyguladığımda, hemen hemen UnitTest ++ vs boost :: test'e indi.

Kullandığım çoğu destek kütüphanesini gerçekten seviyorum, ancak IMHO, boost :: testi biraz fazla ağır. Özellikle bir destek :: test makrosu kullanarak test kayışının ana programını uygulamanızı (AFAIK) gerektirmediğini sevmedim. Ben "saf" TDD olmadığını biliyorum, ama bazen bir GUI uygulaması ile gelen testleri çalıştırmak için bir yol gerekir, örneğin komut satırında özel bir test bayrağı geçirilir ve boost :: test bu türü destekleyemez senaryo.

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


17

Çok daha az bilinen ama oh-so-awesome Kaplumbağa kütüphanesi ile birlikte mükemmel Boost.Test kütüphanesini kullanıyorum : güçlendirmeye dayalı bir sahte nesne kütüphanesi.

Bir kod örneği kelimelerden daha iyi konuştuğundan calculator, bir viewarabirimde çalışan bir nesneyi test etmek istediğinizi düşünün (yani, Turtle'ın tanıtım örneği):

// 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 nesne için beklentiyi beyan etmenin ne kadar kolay ve ayrıntılı olduğunu görün? Açıkçası, beklentiler karşılanmazsa test başarısız olur.


14

Kendi çerçevemi, CATCH'ý oraya ittim . Hala geliştirilme aşamasındadır, ancak diğer çerçevelerin çoğunu aştığına inanıyorum. Farklı insanların farklı kriterleri var ama çok fazla ödün vermeden çoğu zemini örtmeye çalıştım. Tadım için bağlantılı blog girişime bir göz atın. İlk beş özelliğim:

  • Yalnızca başlık
  • İşlev ve yöntem tabanlı testlerin otomatik kaydı
  • Standart C ++ ifadelerini LHS ve RHS'ye ayrıştırır (bu nedenle bir dizi onaylama makro ailesine ihtiyacınız yoktur).
  • İşlev tabanlı bir fikstür içindeki iç içe geçmiş bölümler için destek
  • Doğal dil kullanılarak ad testleri - işlev / yöntem adları oluşturulur

Ayrıca Objective-C bağlamaları vardır.


4
doctest derleme hızı büyük bir odaklanma ile Catch benim yeniden uygulanması - nasıl farklı görmek için SSS kontrol
onqtam

9

CxxTest C ++ için hafif, kullanımı kolay ve çapraz platform JUnit / CppUnit / xUnit benzeri bir çerçevedir.




6

Şu anda uzun ömürlü bir kod tabanı için şirketimizde kullanılabilecek bir birim test ve sahte çerçeve arıyorum. Bildiğiniz gibi , birim test çerçeveleri listesi c ++ için uzun, bu yüzden daha yakından bakılabilir bir el dolu azaltmak 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 birine ihtiyacınız var.

Aşağıdaki listeye (yaklaşık olarak), etkinliklere göre, en üstteki etkinliklere göre sıralanmış olarak geldim:

  • GoogleTest / GoogleMock: Birçok katkıda bulunan ve Google'ın kendisi tarafından kullanılan. Bu muhtemelen bir süre burada olacak ve güncellemeler alacak. Özel kod tabanım için en hızlı trene atlamak umuduyla bu kombinasyona geçeceğim.

  • BoostTest + Turtle: Sık sık güncellenmez, ancak test çerçevesi takviyenin bir parçasıdır, bu yüzden sürdürülmesi gerekir. Öte yandan, kaplumbağa esas olarak bir adam tarafından korunur, ancak aktivitesine yeniden girer, bu yüzden ölü değildir. Bu kombinasyonla neredeyse tüm test deneyimimi yaptım çünkü önceki işimde destek kütüphanesini zaten kullandık ve şu anda özel kodum için kullanıyorum.

  • CppUTest: Test etme ve alay etme sağlar. Bu proje 2008'den 2015'e kadar aktiftir ve oldukça yeni bir faaliyete sahiptir. Bu bulgu biraz şaşırtıcıydı, çünkü web'de arama yaparken (2013'te son güncellemesini yapan CppUnit gibi) çok daha az etkinliğe sahip birçok proje daha sık ortaya çıkıyor. Daha derinlemesine bakmadım, bu yüzden detaylar hakkında hiçbir şey söyleyemem. Edit (16.12.2015): Son zamanlarda bunu denedim ve özellikle sahte sınıfları kullanırken bu çerçeveyi biraz sakar ve "C-şık" olarak buldum. Ayrıca, diğer çerçevelerden daha az çeşitli iddialara sahip gibi görünüyordu. Bence asıl gücü saf C projeleriyle kullanılabilmesidir.

  • QTest: Qt çerçevesi ile birlikte gelen test kitaplığı. Bakım bir süre garanti edilmelidir, ancak bunu destekleyici bir kütüphane olarak kullanıyorum, çünkü test kaydı IMO diğer çerçevelerden daha beceriksiz. Anladığım kadarıyla, sizi test fikstürü başına bir test exe'ye sahip olmaya zorlar. Ancak Qt-Gui kodunu test ederken test yardımcısı işlevleri iyi olabilir. Alayları yok.

  • Yakalama: Son aktivitesi vardır, ancak esas olarak bir adam tarafından geliştirilir. Bu çerçeveyle ilgili 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 adlarını dizeler olarak ayarlamanıza izin verir, bu da tüm cümleleri test adı olarak yazma eğiliminde olduğunuzda güzeldir. Ben bu stil sökük ve googleTest ;-) koymak istiyorum

Sahte Çerçeveler

Sahte çerçevelerin sayısı, test çerçevelerinin sayısından çok daha azdır, ancak işte son etkinlikte bulduğum olanlar.

  • Hippomock : 2008 biriminden itibaren aktif ancak düşük yoğunlukta.

  • FakeIt : 2013'ten beri aktif, ancak bir adam tarafından az çok geliştirildi.

Sonuç

Kod tabanınız uzun vadede ise, BoostTest + Turtle ve GoogleTest + GoogleMock arasında seçim yapın . Bence bu ikisinin uzun süreli bakımı olacak. Sadece kısa bir kod tabanınız varsa, güzel bir sözdizimi olan Catch'i deneyebilirsiniz . O zaman ek olarak bir alaycı ç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;


3

Yakından ilgili soru "Bir c ++ birim test aracıdır / çerçeve seçimi" da yanıtlarına bakın burada


3

Ayrıca, şablon tabanlı bir çerçeve olan TUT , Şablon-Birim-Test de vardır. Sözdizimi gariptir (bazıları buna şablon kötüye kullanma olarak adlandırılır), ancak asıl avantajı tek bir başlık dosyasında yer almasıdır .

Burada TUT ile yazılmış bir birim test örneği bulacaksınız .


2
Ben sadece basitleştirmek ve hatalarda dosya ve satır numarası bilgileri sağlamak TUT sağlamak işlevi ve test decleration kodu makroları sağlayan bir başlık sadece kütüphane koymak. İşte çıktı ve koddaki farkın örneklerini içeren bir gönderinin bağlantısı ve ayrıca github'daki
Josh Heitzman

2

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

Bildiğim tek alternatif, C ++ sınıflarınızı sarmak ve .NET birim sınama çerçevelerinden (NUnit, MBUnit vb.) Birinde birim testleri yazmak için C ++. NET kullanmaktır.





1

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


Paylaşım için teşekkürler. Kısa bir süre önce test amacıyla cfix kullanmaya başladım. Ben hem başarılı hem de başarısız test vakaları durumunda çağrı yığını görüntülemek için bir yol arıyordu. Bunu başarmanın bir yolu var mı?
tryingToLearn

1

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


1

Sanırım VisualAssert VS entegrasyonunda harika bir iş çıkarıyor. VS'den testleri çalıştırmanıza ve hatalarını ayıklamanıza izin verir ve testleri çalıştırmak için bir yürütülebilir dosya oluşturmanız gerekmez.



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.