Confronto tra CppTest e CppUnit Vorrei andare con CppTest. CppTest ha meno strutture nascoste e IMO più facili da capire e implementare. Mi piace personalmente vedere il punto di ingresso principale . Ho anche incluso Boost Unit Testing Framework. Non è basato su xUnit. Non sono un fan, ma se stai già usando la libreria Boost sarebbe bello da incorporare.
CppTest vs CppUnit
• facilità di creazione di uno unit test e il test Suite. Sia CppUnit che CppTest creano i test unitari dei metodi di classe, con la classe derivata da alcune classi di test fornite dallo strumento . La sintassi per CppTest è leggermente più semplice, , con la registrazione di prova eseguita all'interno del costruttore classe . Nel caso di CppUnit, sono necessarie le macro aggiuntive CPPUNIT_TEST_SUITE e CPPUNIT_TEST_SUITE_ENDS.
• Esecuzione dei test. CppTest semplicemente chiama il metodo run sulla suite di test, mentre CppUnit utilizza una classe TestRunner separata il cui metodo di esecuzione è richiamato per l'esecuzione dei test.
• Estensione della gerarchia di test. In il caso di CppTest, è sempre possibile estendere il precedente test suite creando una nuova classe che eredita da precedente. La nuova classe definirà alcune funzioni aggiuntive che si aggiungono al lotto di prova dell'unità. È sufficiente richiamare il metodo di esecuzione sull'oggetto del nuovo tipo di classe. CppUnit, al contrario, richiede che si usi la macro CPPUNIT_TEST_SUB_SUITE insieme all'ereditarietà della classe per ottenere lo stesso effetto .
• Generazione dell'output formattato. Entrambi CppTest e CppUnit hanno l'abilità per personalizzare l'output. Tuttavia, sebbene CppTest abbia un utile, formattatore di output HTML predefinito , CppUnit no. Tuttavia, CppUnit supporta esclusivamente la formattazione XML. Entrambi supportano il testo e lo stile del compilatore formati.
• Creazione di dispositivi di prova. Per utilizzare i dispositivi di prova , CppUnit richiede che la classe di prova sia derivata da CppUnit :: TestFixture. È necessario fornire le definizioni per l'installazione e le routine di rimozione . Nel caso di CppTest, è necessario fornire le definizioni solo per l'installazione e le routine di rimozione di . Questa è sicuramente la una soluzione migliore, in quanto mantiene semplice il codice client . • Supporto macro utility predefinito . Entrambi CppTest e CppUnit dispongono di un insieme analogo di macro per asserzioni, gestione di float, e così via.
• File di intestazione. CppTest richiede che includa un singolo file di intestazione, mentre il codice client CppUnit deve includere intestazioni multiple , come HelperMacros.h e TextTestRunner.h, a seconda delle funzioni utilizzate.
http://www.ibm.com/developerworks/aix/library/au-ctools3_ccptest/index.html?ca=drs-
CPPTEST
#include “cppTest.h”
class myTestWithFixtures : public Test::Suite {
void function1_to_test_some_code();
void function2_to_test_some_code();
public:
myTestWithFixtures () {
TEST_ADD (function1_to_test_some_code) {...};
TEST_ADD (function2_to_test_some_code) {...};
}
protected:
virtual void setup() { ... };
virtual void tear_down() { ... };
};
int main ()
{
myTestWithFixtures tests;
Test::TextOutput output(Test::TextOutput::Verbose);
return tests.run(output);
}
http://www.ibm.com/developerworks/aix/library/au-ctools3_ccptest/index.html?ca=drs-
CppUnit
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TextTestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
class mystringTest : public CppUnit::TestFixture {
public:
void setUp() { ... };
void tearDown() { ... };
void function1_to_test_some_code() { ... };
void function2_to_test_some_code() { ... };
CPPUNIT_TEST_SUITE(mystringTest);
CPPUNIT_TEST(function1_to_test_some_code);
CPPUNIT_TEST(function2_to_test_some_code);
CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_REGISTRATION(mystringTest);
con le macro fuori
int main()
{
CppUnit::TestSuite* suite = new CppUnit::TestSuite("mystringTest");
suite->addTest(new CppUnit::TestCaller<mystringTest>("checkLength",
&mystringTest::checkLength));
suite->addTest(new CppUnit::TestCaller<mystringTest>("checkValue",
&mystringTest::checkLength));
// client code follows next
CppUnit::TextTestRunner runner;
runner.addTest(suite);
runner.run();
return 0;
}
http://www.ibm.com/developerworks/aix/library/au-ctools2_cppunit/
Boost Unit Testing Framework
#include <boost/test/unit_test.hpp>
using namespace std;
struct CMyFooTestFixture
{
CMyFooTestFixture() { ... } //SetUp
~CMyFooTestFixture() { ... } //TearDown
void function1_to_test_some_code(CMyFoo& foo) { ... };
void function2_to_test_some_code(CMyFoo& foo) { ... };
}
BOOST_FIXTURE_TEST_SUITE(MyFooTest, CMyFooTestFixture);
BOOST_AUTO_TEST_CASE(function1_to_test_some_code)
{
CMyFoo foo;
function1_to_test_some_code(foo);
}
BOOST_AUTO_TEST_CASE(function1_to_test_some_code2)
{
CMyFoo foo;
function1_to_test_some_code(foo);
}
BOOST_AUTO_TEST_SUITE_END();
http://www.beroux.com/english/articles/boost_unit_testing/
Mi piace cppunit come un framework di test unità leggero. :-) –