it-swarm-eu.dev

Testování jednotek pro C++ kód - Nástroje a metodika

Pracuji na velkém c ++ systému, který je již několik let ve vývoji. V rámci úsilí o zlepšení kvality stávajícího kódu jsme se podíleli na rozsáhlém dlouhodobém projektu refaktoringu.

Znáte dobrý nástroj, který mi může pomoci při psaní testů jednotek v jazyce C++? Možná něco podobného Junit nebo Nunit?

Může někdo dát nějaké dobré rady o metodice psaní testů jednotek pro moduly, které byly napsány bez testování jednotky?

134
Sakin

Použití testů jednotek na starší kód bylo velmi důvodEfektivní práce s Legacy Code byla napsána. Michael Feathers je autorem - jak je uvedeno v jiných odpovědích, byl zapojen do tvorby jak CppUnit a CppUnitLite .

alt text

78
Joe Schneider

Společnost Google nedávno vydala vlastní knihovnu pro aplikace C++, nazývané Google Test.

Projekt na Google Code

38
agnul

Podívejte se na vynikající srovnání mezi několika dostupných apartmá. Autor tohoto článku později vyvinul UnitTest ++ .

Co se mi na tom obzvláště líbí (kromě skutečnosti, že dobře zvládá výjimky atd.) Je, že existuje velmi omezené množství „administrace“ kolem testovacích případů a definice testovacích přípravků. 

30
andreas buykx

Boost má testovací knihovnu která obsahuje podporu pro testování jednotek. Možná to stojí za to se podívat ven.

24
Jonas

Noel Llopis of Games From Within je autorem Exploring C++ Unit Testing Framework Jungle , komplexní (ale nyní datované) hodnocení různých C++ Unit Testing frameworků, stejně jako kniha o programování her .

On používal CppUnitLite na nějakou dobu, opravovat různé věci, ale nakonec spojil síly s jinou jednotkou testovat knihovního autora a produkoval UnitTest ++ . Používáme zde UnitTest ++ a zatím se mi to moc líbí. Má (pro mě) přesnou rovnováhu síly s malým půdorysem. 

Použil jsem domácí řešení, CxxTest (který vyžaduje Perl), a boost :: test. Když jsem tady v mé současné práci implementoval testování jednotek, do značné míry se dostal do UnitTest ++ vs boost :: test. 

Opravdu se mi líbí většina posilovacích knihoven, které jsem použil, ale IMHO, boost :: test je příliš těžký. Zvláště se mi nelíbilo, že to vyžaduje, aby jste (AFAIK) realizovali hlavní program testovacího svazku pomocí boost :: testového makra. Vím, že to není "čistý" TDD, ale někdy potřebujeme způsob, jak spustit testy od vyřazení GUI aplikace, například když je na příkazovém řádku předán speciální testovací příznak a boost :: test tento typ nepodporuje scénáře. 

UnitTest ++ byl nejjednodušší testovací rámec pro nastavení a používání, se kterým jsem se setkal v mé (omezené) praxi. 

21
Brian Stewart

Používám vynikající Boost.Test knihovna ve spojení s mnohem méně známým, ale oh-tak-úžasné Turtle knihovna: falešný objekt knihovna založená na posílení.

Protože příklad kódu mluví lépe než slova, představte si, že byste chtěli otestovat objekt calculator, který funguje na rozhraní view (tj. Úvodní příklad Turtle):

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

Podívejte se, jak snadno a podrobně je to, že deklarujete očekávání na falešném objektu? Je zřejmé, že test není úspěšný, pokud nejsou splněna očekávání.

17
icecrime

Právě jsem tlačil vlastní rámec, CATCH , venku. Je to stále ve vývoji, ale věřím, že již překonává většinu ostatních rámců. Různí lidé mají různá kritéria, ale snažil jsem se pokrýt většinu pozemků bez přílišných kompromisů. Podívejte se na mé položka blogu pro taster. Moje pět nejlepších funkcí je:

  • Pouze záhlaví
  • Automatická registrace funkčních a metodických testů
  • Rozkládá standardní výrazy C++ na LHS a RHS (takže nepotřebujete celou rodinu makier).
  • Podpora vnořených sekcí v rámci funkčního příslušenství
  • Testy názvů pomocí přirozeného jazyka - jsou generovány názvy funkcí/metod

Má také vazby Objective-C.

14
philsquared

CxxTest je lehká, snadno použitelná a cross platformová platforma JUnit/CppUnit/xUnit pro C++.

9
David Sykes
7
Jorge Ferreira

UnitTest ++ , malý a jednoduchý.

7
yrp

Já jsem v současné době hledá jednotkový test a falešný rámec, který může být použit v naší společnosti pro dlouho žil kód-base. Jak víte, seznam jednotek testovacích rámců pro c + + je dlouhý, tak jsem použil některé filtry, abych to snížil na plnou ruku, kterou lze podrobněji prozkoumat. Prvním kritériem filtru bylo, že musí být zdarma. Druhým kritériem byla projektová činnost. Také jsem hledal zesměšňovací rámce, protože je potřebujete, pokud chcete psát jednotkové testy.

Přišel jsem s následujícím seznamem (přibližně) seřazeným podle aktivity, nejvyšší aktivity nahoře:

  • GoogleTest/GoogleMock: Mnoho přispěvatelů a používaných společností Google. To bude pravděpodobně nějaký čas a dostávat aktualizace. Pro svou soukromou kódovou základnu přejdu na tuto kombinaci v naději, že skočím na nejrychlejší vlak.

  • BoostTest + Turtle: Není aktualizováno tak často, ale testovací rámec je součástí podpory, takže by měl být zachován. Želva na druhé straně je udržována hlavně jedním chlapem, ale má odporovou aktivitu, takže to není mrtvé. V současné době ho používám pro svůj soukromý kód.

  • CppUTest: Poskytuje testování a zesměšňování. Tento projekt je aktivní od roku 2008 do roku 2015 a má poměrně velkou nedávnou aktivitu. Tento nález byl trochu překvapivý, protože mnoho projektů s výrazně menší aktivitou se objevuje častěji při vyhledávání na webu (jako CppUnit, který měl v roce 2013 poslední aktualizaci). Nedívám se do toho hlouběji, takže o detailech nemůžu nic říct. Edit (16.12.2015): Nedávno jsem to vyzkoušel a zjistil, že tento rámec je trochu neohrabaný a "ne." C-stylový “, zejména při použití falešných tříd. Také to vypadalo, že má menší rozmanitost tvrzení než jiné rámce. Myslím, že jeho hlavní silou je, že může být používán s čistými C projekty.

  • QTest: Testovací knihovna, která je dodávána s Qt frameworkem. Maintanance by měla být zaručena na nějakou dobu, ale používám ji spíše jako podpůrnou knihovnu, protože testovací registrace je IMO více neohrabaná než v jiných rámcích. Pokud tomu rozumím, nutí vás mít jeden test-exe na testovací přípravek. Testovací pomocné funkce však mohou být vhodné při testování Qt-Gui kódu. Nemá žádné posměšky.

  • Úlovek: Má nedávnou aktivitu, ale hlavně je vyvinut jedním chlapem. Pěkná věc na tomto rámci je alternativní přístup, který umožňuje zapisovat opakovaně použitelný upínací kód do samotného testu. To také umožňuje nastavit názvy testů jako řetězce, který je Nice, když máte tendenci psát celé věty jako názvy testů. Chci, aby byl tento styl roztrhaný a vložen do googleTestu ;-)

Mock Framework

Počet falešných rámců je mnohem menší než počet testovacích rámců, ale zde jsou ty, které jsem zjistil, že mají nedávnou aktivitu.

  • Hippomock: Aktivní od roku 2008 nyní, ale pouze s nízkou intenzitou.

  • FakeIt: Aktivní od roku 2013 nyní, ale více či méně vyvinutý jedním chlapem.

Závěr

Pokud je vaše kódová základna dlouhodobě zapnutá, vyberte mezi možnostmi BoostTest + Turtle a GoogleTest + GoogleMock. Myslím, že ti dva budou mít dlouhodobou údržbu. Pokud máte pouze krátký kód, můžete vyzkoušet Catch, který má pěknou syntaxi. Pak budete muset navíc vybrat zesměšňovací rámec. Pokud pracujete s Visual Studio, můžete si stáhnout test-runner adaptéry pro BoostTest a GoogleTest, které vám umožní spouštět testy s GUI testovacího běhu, který je integrován do VS.

5
Knitschi

Viz také odpovědi na úzce související otázku "volba testovacího nástroje/rámce c ++ jednotky", zde

3
TonJ

Tam je také TUT , Template-Unit-Test, šablony-založený rámec. Jeho syntaxe je nepříjemná (někteří ji nazývají zneužívání šablony), ale její hlavní výhodou je, že je to vše v souboru single header

Najdete zde příklad jednotkového testu napsaného pomocí TUT zde. 

3
philant

CppUTest je vynikající, lehký rámec pro testování C a C++ jednotek.

2
ratkok

Snažil jsem se CPPunit a není to příliš uživatelsky přívětivý.

Jediná alternativa, kterou znám, je použití C++ .NET k zabalení vašich tříd C++ a psaní testů jednotek pomocí jednoho z testovacích frameworků .NET (NUnit, MBUnit atd.)

2
Dror Helper

Pokud používáte Visual Studio 2008 SP1, doporučuji použít MSTest pro zápis testů jednotky. I pak použít Google mock pro psaní mocks. Integrace s IDE je ideální a umožňuje a nenosí režii CPPunitu z hlediska editace tří míst pro přidání jednoho testu.

1
Jared

Podívejte se na cfix ( http://www.cfix-testing.org ), specializuje se na vývoj Windows C/C++ a podporuje testování uživatelského režimu i režimu jádra.

1
Johannes Passing

Michael Feathers z ObjectMentor byl nástrojem pro vývoj jak CppUnit, tak CppUnitLite.

Nyní doporučuje CppUnitLite

1
Seb Rose

Myslím, že VisualAssert dělá skvělou práci ve VS integraci. To vám umožní spouštět a ladit testy z VS a nemusíte vytvářet spustitelný soubor, abyste mohli spustit testy.

1
Ohad Horesh

Podívejte se na CUnitWin32 . Je napsán pro MS Visual C. Obsahuje příklad.

1
Dushara

Podívejte se na fruktózu: http://sourceforge.net/projects/fructose/

Je to velmi jednoduchý rámec, který obsahuje pouze záhlaví souborů, a tak snadno přenosný.

0
rik

Používám MS Test s Typemock Isolator ++ . Pokusit se!

0
Sam