C ++ birim test çerçevelerinin karşılaştırılması [kapalı]


300

C ++ birim test çerçeveleri için önerilerle ilgili birkaç soru olduğunu biliyorum, ancak tüm cevaplar sadece çerçevelerden birini önerdiklerinden ancak bir (özellik) karşılaştırması hakkında herhangi bir bilgi sağlamadığından yardımcı olmadı.

En ilginç çerçevelerin CppUnit, Boost ve yeni Google test çerçevesi olduğunu düşünüyorum. Henüz kimse karşılaştırma yapmadı mı?



Daha çok sevdiğim kendi IOC tabanlı test çerçevem ​​var, çünkü sadece diğerlerinin yaptıkları şeyin bir klonu değil, diğerlerinin tüm sorunlarını bulduğum şeyi ele alıyor. Test senaryolarını makro kullanarak değil, bir sınıftan türeterek yazabilirsiniz. Makrolar yalnızca size yansıma sağladığı için iddialarda kullanılırlar. Test istatistiklerinin özelleştirilmiş çıktısı. Ne test ettiğinizi, ne sıklıkta ve hangi parametrelerle seçeceğinizi belirlemek için IOC komut dosyalarından çalıştırın.
CashCow

ve kendi bakış açımı eklediğimde, diğer herkesin aynı anda çalışmasına gerek kalmadan çalıştırabildiğim için geliştirme açısından harika. Bu yüzden kodumun çalıştığını biliyorum.
CashCow

Yanıtlar:


99

Bu soruya bakınBiraz tartışma için .

Makaleleri tavsiye ediyorlar: C ++ Birim Test Çerçevesi Ormanını Keşfetmek , By Noel Llopis. Ve daha yeni: C ++ Test Birimi Çerçeveleri

En googletest'i diğer çerçevelerle karşılaştıran bir makale bulamadım.


Yazdığım gibi: tüm cevaplar sadece çerçevelerden birini tavsiye eder, ancak çerçeveyi diğeriyle karşılaştırmaz.
hizmetçi

Makaleden de memnun değil misiniz?
Gishu

7
Bir eleştiri: makale iyi olsa da, 2004'ten ve Google Test'i içermiyor.
richq

2
İlk bağlantıda iki karşılaştırma göreceksiniz. Google'ın yeni çerçevesi dışında, çoğu bilgi hala geçerlidir. (Ve CppUnit en ilginç değil, kullanmak için çok sakar)
Luc Hermitte

1
bağlantıları düzeltti ve daha yakın bir karşılaştırmayla cevabı genişletti
Sam Saffron

120

Yeni bir oyuncu olsa da oldukça güzel olan Google Test ( Google C ++ Testing Framework olarak da bilinir ).

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Ana Özellikler:

  • Taşınabilir
  • Ölümcül ve ölümcül olmayan iddialar
  • Kolay bildirimler bilgilendirici mesajlar :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test , testlerinizi otomatik olarak algılar ve bunları çalıştırmak için numaralandırmanızı gerektirmez
  • İddia kelime dağarcığınızı genişletmeyi kolaylaştırın
  • Ölüm testleri (bkz. Gelişmiş kılavuz)
  • SCOPED_TRACE altyordam döngüler için
  • Hangi testleri yapacağınıza karar verebilirsiniz
  • XML test raporu oluşturma
  • Fikstür / Sahte / Şablonlar ...

3
Özellikle googlemock çerçevesinde bulunabilen alay özellikleri ile diğer bazı çerçeveler üzerinde google testini kullanmaktan gerçekten keyif alıyorum.
Mike

8
Tüm bu özellikleri (bazıları henüz herkese açık olmasa da) ve daha fazlasını yeni test çerçevem ​​CATCH'de sunuyorum. Bağlantı için cevabıma bakın.
philsquared

2
Google C ++ Mocking çerçevesiyle birleştirmek, birim testi C ++ kodu için gerçekten güçlü xUnit test çerçevesini yapar.
ratkok

5
@CashCow Derlemeyle çalıştırmak, test algılamasından farklı bir şeydir. Derlemeyle çalıştırmak derleme sisteminize bağlıdır. Deney tespit aracı sen yok olması sadece testler yöntemleri oluşturmak, başka sınıftaki tüm testleri listelemek için ve bu kadar.
Wernight

Yine de makrolarının aşırı kullanımından ve TEST gibi bir şeyle çatışabilecek ortak kelimeler kullanan gerçeğinden hoşlanmıyorum. GTEST daha iyi olurdu, çatışması daha az olasıdır.
CashCow

112

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. Proje Github'da düzenleniyor


Lütfen eklemeyi CHECK_FLASEve REQUIRE_FLASEmakroları düşünün .
Emile Cormier

6
Bence en iyi çerçeve.
CoffeDeveloper

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

@ einpoklum Yakalama terk edilmedi - içerik oluşturucu kütüphanenin 2. sürümü üzerinde çalışıyor. doctest, bazı bonus tasarım kararları ile Catch 1'in yeniden uygulanmasıdır
onqtam

2
Tüm test çerçevelerini (şimdi seçmek zorunda olduğum) karşılaştırırken gerçekten bir kayıptayım. Catch ve diğer tekliflerle doctest'i karşılaştırarak ve kıyaslayarak kendi cevabınızı yazar mısınız?
einpoklum

53

Boost Test Library özellikle Boost kullanıyorsanız çok iyi bir seçimdir.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Destekler:

  • Otomatik veya manuel test kaydı
  • Birçok iddia
  • Koleksiyonların otomatik karşılaştırması
  • Çeşitli çıktı biçimleri ( XML dahil )
  • Fikstür / Şablonlar ...

Not: Başlamanıza yardımcı olabilecek bir makale yazdım: C ++ Birim Testi Çerçevesi: Bir Boost Test Eğitimi


Boost testini kullanıyordum ve sürüm arasında önemli ölçüde değiştiği görünüyordu. API değiştiğinde testleri düzeltmek için daha fazla zaman harcamak (ve paralarını) harcamak zorunda kalmadan müşterime birim testi satmak zordu, test olması gereken kodu düzeltmekten daha zordu. Sonunda onu terk ettim ve kendim yazdım - bu yaklaşık 5 yıl önceydi.
Bileşen 10


16

Son zamanlarda özellikle Google Test ve Boost Test Kitaplığı'na alternatif olarak xUnit ++ yayınladım ( karşılaştırmaları görüntüleyin ). XUnit.Net'i biliyorsanız, xUnit ++ için hazırsınız.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Ana Özellikler:

  • İnanılmaz derecede hızlı: testler aynı anda yapılır .
  • Taşınabilir
  • Otomatik test kaydı
  • çok onaylama türü (Boost'un xUnit ++ üzerinde hiçbir şeyi yoktur)
  • Koleksiyonları karşılaştırır yerel olarak .
  • Bildiri üç olarak gelir düzeyde gelir:
    • ölümcül hatalar
    • ölümcül olmayan hatalar
    • uyarılar
  • Kolay onaylama kaydı:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Test kaydı:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Fikstür
  • Veriye dayalı testler (Teoriler)
  • Hangi testleri yapacağınızı seçin göre :
    • Özellik eşleme
    • Alt dize eşleşmesinin adı
    • Test Paketleri

2
Soru karşılaştırma istiyor. IMO, çerçeveniz ve en azından iki popüler olan arasındaki farkları sunmak hayati önem taşır : googletest ve Boost. Özellikle, bu ikisine alternatif olarak xUnit ++ 'ın reklamını yaparsanız. Güncellenirse +1 olacak :)
mloskot

Yeterince adil. :) Zaten var karşılaştırma tablosunu üzerinde wiki , ama doğrudan cevabım farkların birkaç Özetle çalışacağız.
moswald

1
Sadece wiki tablosunu doğrudan bağlamaya karar verdim, hepsini listelemek için özeti karıştırıyordu.
moswald

bağlantı benim için çalışıyor, teşekkürler! +1
mloskot

1
projeniz durduruldu mu? Son taahhüt 09/2015'e kadar uzanıyor ... Her neyse, harika bir cevap. Teşekkürler.
zertyz

5

CppUTest - sahte kütüphaneler ile çok güzel, hafif çerçeve. Daha yakından bakmaya değer.


4

CPUnit ( http://cpunit.sourceforge.net ), Google Test'e benzer, ancak daha az macos'a (varsayımlar işlevlerdir) dayanan ve makroların olağan makro tuzaklarından kaçınmak için önek eklendiği bir çerçevedir. Testler şöyle görünür:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Onlar otomatik kayıt, bu yüzden bundan daha fazla gerekmez. Sonra sadece derlemek ve çalıştırmak. Bu çerçeveyi Java'yı programlamak için biraz zaman harcamak zorunda kalanlar için JUnit kullanmaya çok benziyorum. Çok hoş!



2

API Sanity Checker - C / C ++ kütüphaneleri için test çerçevesi:

Paylaşılan bir C / C ++ kütüphanesi için temel birim testlerinin otomatik oluşturucusu. Başlıklardaki bildirimlerin analizi yoluyla parametreler için makul (çoğu, ama ne yazık ki hepsi değil) giriş verileri üretebilir ve API'deki her işlev için basit ("akıl sağlığı" veya "sığ" -kalite) test örnekleri oluşturabilir. Dosyalar.

Oluşturulan testlerin kalitesi, basit kullanım durumlarında kritik hataların yokluğunu kontrol etmeyi sağlar. Araç, oluşturulan testleri oluşturup yürütebilir ve çökmeleri (segfaultlar), iptalleri, her türlü yayılan sinyali, sıfır olmayan program dönüş kodunu ve program asılı tespit edebilir.

CppUnit, Boost ve Google Test ile karşılaştırıldığında benzersiz özellikler:

  • Test verilerinin ve giriş argümanlarının otomatik oluşturulması (karmaşık veri türleri için bile)
  • Armatürler ve şablonlar yerine modern ve yeniden kullanılabilir özel tipler
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.