Confronto tra framework di test unitari C ++ [chiuso]


300

So che ci sono già alcune domande relative ai consigli per i framework di test unitari C ++, ma tutte le risposte non sono state utili in quanto raccomandano solo uno dei framework ma non forniscono alcuna informazione su un confronto (funzionalità).

Penso che i framework più interessanti siano CppUnit, Boost e il nuovo framework di test di Google. Qualcuno ha ancora fatto un confronto?



Ho il mio framework di test basato sul CIO che mi piace di più perché non è solo un clone di ciò che fanno tutti gli altri, ma affronta ciò che trovo tutti i problemi degli altri. Scrivi casi di test derivando da una classe, non usando le macro. Le macro utilizzate solo per le asserzioni in quanto ti danno la riflessione. Output personalizzato delle statistiche dei test. Esegui dallo script IOC in modo da scegliere cosa testare, quanto spesso e con quali parametri.
CashCow,

ed è geniale dal punto di vista dello sviluppo poiché quando aggiungo il mio test posso eseguirlo senza dover eseguire tutti gli altri contemporaneamente. Quindi so che il mio codice funziona.
CashCow,

Risposte:


99

Vedi questa domanda per qualche discussione.

Raccomandano gli articoli: Exploring the C ++ Unit Testing Framework Jungle , di Noel Llopis. E il più recente: C ++ Test Unit Frameworks

Non ho ancora trovato un articolo che paragona il googletest agli altri framework.


Come ho scritto: tutte le risposte raccomandano solo uno dei framework ma non confrontano il framework con un altro.
cameriera,

Neanche tu sei soddisfatto dell'articolo?
Gishu,

7
Una critica: l'articolo, sebbene buono, è del 2004 e non include Google Test.
richq,

2
Nel primo link vedrai due confronti. Ad eccezione del nuovo framework di Google, la maggior parte delle informazioni sono (sono?) Ancora rilevanti. (E CppUnit non è il più interessante, è troppo goffo da usare)
Luc Hermitte,

1
risolto i collegamenti e ampliato la risposta con un confronto più recente
Sam Saffron,

120

Un nuovo giocatore è Google Test (noto anche come Google C ++ Testing Framework ) che è piuttosto carino.

#include <gtest/gtest.h>

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

Caratteristiche principali:

  • Portatile
  • Affermazioni fatali e non fatali
  • Messaggi informativi di asserzioni facili :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test rileva automaticamente i tuoi test e non richiede di enumerarli per eseguirli
  • Semplifica l' estensione del vocabolario delle asserzioni
  • Test di morte (vedi guida avanzata)
  • SCOPED_TRACE per i cicli di subroutine
  • Puoi decidere quali test eseguire
  • Generazione di report di test XML
  • Calendario / Mock / Modelli ...

3
Mi piace molto usare google test su alcuni degli altri framework, in particolare con le sue capacità di derisione che si possono trovare nel framework googlemock.
Mike,

8
Fornisco tutte queste funzionalità (anche se alcune non sono ancora pubbliche) e altro nel mio nuovo framework di test, CATCH. Vedi la mia risposta per il link.
philsquared il

2
la combinazione con Google C ++ Mocking framework lo rende un framework di test xUnit davvero potente per il codice C ++ di unit test.
Ratkok,

5
@CashCow L'esecuzione con la build è qualcosa di diverso dal rilevamento dei test. L'esecuzione con build dipende dal sistema di build. Il rilevamento dei test significa che non è necessario elencare tutti i test in un'altra classe, basta creare i metodi di test e il gioco è fatto.
Wernight,

Non mi piace il loro uso eccessivo di macro e il fatto che usano parole comuni come TEST che potrebbero scontrarsi con qualcosa. GTEST sarebbe migliore, meno probabile che si scontrasse.
CashCow,

112

Ho appena spinto il mio framework, CATCH , là fuori. È ancora in fase di sviluppo, ma credo che superi già la maggior parte degli altri framework. Persone diverse hanno criteri diversi, ma ho cercato di coprire gran parte del terreno senza troppi compromessi. Dai un'occhiata al mio post sul blog collegato per un assaggio. Le mie cinque caratteristiche principali sono:

  • Solo intestazione
  • Registrazione automatica di test basati su funzioni e metodi
  • Decompone le espressioni C ++ standard in LHS e RHS (quindi non è necessaria un'intera famiglia di assert macro).
  • Supporto per sezioni nidificate all'interno di un dispositivo basato su funzioni
  • Test dei nomi con linguaggio naturale: vengono generati nomi di funzioni / metodi

Ha anche attacchi Objective-C. Il progetto è ospitato su Github


Si prega di considerare l'aggiunta CHECK_FLASEe le REQUIRE_FLASEmacro.
Emile Cormier,

6
Il miglior quadro secondo me.
CoffeDeveloper,

3
doctest è la mia reimplementazione di Catch con un'enorme attenzione alla velocità di compilazione - controlla le FAQ per vedere come differiscono
onqtam

@einpoklum Catch non viene abbandonato: il creatore sta lavorando alla versione 2 della libreria. doctest è una sorta di reimplementazione di Catch 1 con alcune decisioni di progettazione bonus
onqtam

2
Sono davvero in perdita quando si confrontano tutti i framework di test (uno dei quali ora devo scegliere). Scriveresti la tua risposta confrontando e confrontando doctest con Catch e altre offerte?
einpoklum,

53

Boost Test Library è un'ottima scelta soprattutto se stai già utilizzando Boost.

// 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%
}

Supporta:

  • Registrazione di test automatici o manuali
  • Molte affermazioni
  • Confronto automatico delle collezioni
  • Vari formati di output (incluso XML )
  • Calendario / Modelli ...

PS: ho scritto un articolo a riguardo che potrebbe aiutarti a iniziare: C ++ Unit Testing Framework: A Boost Test Tutorial


Usavo il test Boost e mi piaceva, tranne che sembrava cambiare significativamente tra una versione e l'altra. È stato abbastanza difficile vendere test unitari al mio cliente senza dover dedicare più tempo (e denaro) a sistemare i test quando l'API è cambiata, piuttosto che a correggere il codice che doveva essere testato. Alla fine l'ho abbandonato e ho scritto il mio - questo è stato circa 5 anni fa.
Componente 10

5
Il collegamento al tutorial è interrotto
mloskot,

2
@mloskot Funziona di nuovo.
Chris Jester-Young,

@mloskot Mi dispiace, ti prego di inviarmi direttamente un'e-mail se vedi che è rotto. È facile da trovare rispetto a un commento. :)
Wernight,

@Wernight Yup, funziona di nuovo. Thx
mloskot


16

Di recente ho rilasciato xUnit ++ , in particolare come alternativa a Google Test e alla libreria Boost Test (vedi i confronti ). Se hai familiarità con xUnit.Net, sei pronto per xUnit ++.

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

Caratteristiche principali:

  • Incredibilmente veloce: i test vengono eseguiti contemporaneamente .
  • Portatile
  • Registrazione test automatica
  • Molti tipi di asserzioni (Boost non ha nulla su xUnit ++)
  • Confronta le raccolte in modo nativo.
  • Le asserzioni sono disponibili in tre livelli:
    • errori fatali
    • errori non fatali
    • avvertenze
  • Registrazione facile di asserzione :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Registrazione di prova :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • infissi
  • Test basati sui dati (Teorie)
  • Seleziona i test da eseguire in base a:
    • Corrispondenza degli attributi
    • Nome matchin sottostringa
    • Test Suites

2
La domanda è chiedere un confronto. IMO, è fondamentale presentare quali sono le differenze tra il tuo framework e, almeno, i due più popolari: googletest e Boost. Soprattutto se pubblicizzi xUnit ++ come alternativa a quei due. Sarà +1 se aggiornato :)
mloskot

Giusto. :) Ho già una tabella di confronto sul wiki , ma cercherò di riassumere alcune delle differenze direttamente nella mia risposta.
moswald,

1
Ho deciso di collegare direttamente la tabella wiki, stava ingombrando il riassunto per elencare tutto fuori.
moswald,

il link funziona per me, grazie! +1
mloskot,

1
il tuo progetto è stato sospeso? L'ultimo commit risale al 09/2015 ... Comunque, ottima risposta. Grazie.
zertyz,


4

CPUnit ( http://cpunit.sourceforge.net ) è un framework simile a Google Test, ma che si basa su meno macos (asserzioni sono funzioni) e in cui le macro sono precedute da prefissi per evitare le consuete insidie ​​delle macro. I test sembrano:

#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.
    }

}

Si registrano automaticamente, quindi non è necessario altro. Quindi è solo compilare ed eseguire. Trovo che usare questo framework sia molto simile all'utilizzo di JUnit, per coloro che hanno dovuto trascorrere del tempo a programmare Java. Molto bella!



2

API Sanity Checker - framework di test per librerie C / C ++:

Un generatore automatico di test unitari di base per una libreria C / C ++ condivisa. È in grado di generare dati di input ragionevoli (nella maggior parte, ma purtroppo non tutti,) per i parametri e comporre casi di test semplici ("sanità mentale" o "superficiale") per ogni funzione nell'API attraverso l'analisi delle dichiarazioni nell'intestazione File.

La qualità dei test generati consente di verificare l'assenza di errori critici in casi d'uso semplici. Lo strumento è in grado di costruire ed eseguire test generati e rilevare arresti anomali (segfault), interruzioni, tutti i tipi di segnali emessi, codice di ritorno del programma diverso da zero e blocco del programma.

Funzionalità uniche rispetto a CppUnit, Boost e Google Test:

  • Generazione automatica di dati di test e argomenti di input (anche per tipi di dati complessi)
  • Tipi specializzati moderni e altamente riutilizzabili invece di dispositivi e modelli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.