Seite 1 von 1

C++ Unit Tests

Verfasst: 14.08.2012, 16:17
von Artificial Mind
Hallo liebe Community,

ich wollte mal fragen, welche C++ Unit Test Frameworks ihr benutzt und ob ihr da Empfehlungen abgeben könnt.
Insbesondere suche ich nach einem auch für kommerzielle Projekte kostenlosen Framework, welches sich auch mit CMake-Projekten komfortabel benutzen lässt.
Wenn möglich, sollte es lightweight sein.

Persönlich habe ich bisher nur Boost Tests eingesetzt, allerdings ist Boost schon eine ziemlich große Abhängigkeit (welche sich auch unschön auf Compile-Zeit auswirkt) und deswegen falls möglich zu vermeiden.

Cheers
Mind

Re: C++ Unit Tests

Verfasst: 14.08.2012, 16:33
von kaiserludi
Wir nutzen seit eh und je http://de.wikipedia.org/wiki/CppUnit. Ob das jetzt besonders gut oder schlecht ist, kann ich nicht sagen, da ich nie was anderes eingesetzt habe.
Die ganzen Makros sind nicht gerade hübsch, aber die Lib macht, was sie soll, ist plattformunabhängig und unter LGPL, kann also gratis und auch fürs Testen von kommerziellem Code benutzt werden.
Viele unserer Unittests haben fürchterlich viel Copy-and-Paste Code-Redundanz drin, aber ich vermute, dass liegt eher an den Kollegen, die sie implementiert haben, als an CppUnit.

Re: C++ Unit Tests

Verfasst: 15.08.2012, 09:46
von Thoran
Interessantes Thema, nachdem ich auch Unittests mit CMakes CTest machen wollte. Ich hatte mir mal das CppUnit-Framework installiert und die Doku ausgedruckt, bin aber noch nicht dazu gekommen sie zu lesen. Von daher, kaiserludi, wäre es schön wenn du deine Erfahrung teilen könntest. Z.b. Aufwand zum Schreiben eines Testtreibers. Aufwand der Einbindung in CTest.

Thoran

Re: C++ Unit Tests

Verfasst: 15.08.2012, 16:58
von kimmi
Wir / ich mache(n) Unittests mit cppunit. Meine Render-testsuite habe ich von hand zusammen geklöppelt.

Gruß Kimmi

Re: C++ Unit Tests

Verfasst: 21.08.2012, 04:06
von Aramis
Google Test ist sehr, sehr angenehm.

cppunit funktioniert auch ganz gut, ist aber eher klobig.

Re: C++ Unit Tests

Verfasst: 21.08.2012, 09:37
von Thoran
Google Test kannte ich bisher gar nicht, muß ich mir mal anschauen. Danke für den Hinweis.

Re: C++ Unit Tests

Verfasst: 23.08.2012, 15:59
von kaiserludi
Thoran hat geschrieben:Interessantes Thema, nachdem ich auch Unittests mit CMakes CTest machen wollte. Ich hatte mir mal das CppUnit-Framework installiert und die Doku ausgedruckt, bin aber noch nicht dazu gekommen sie zu lesen. Von daher, kaiserludi, wäre es schön wenn du deine Erfahrung teilen könntest. Z.b. Aufwand zum Schreiben eines Testtreibers. Aufwand der Einbindung in CTest.

Thoran
So sieht bei uns ein typischer Testcase aus:

Code: Alles auswählen

/**
* Test of <PhotonPeer::Connect>.
* +
*/
void PhotonUnitTest::testPhotonPeerConnect(void)
{
	//! Check connection for correct IP address with explicit correct port (EG_PORT_xxx).
	JString Url = PhotonUnitTest::getServerAddress(true);
	bool connectResult = peer1->connect(Url);
	CPPUNIT_ASSERT(connectResult);
	JString Msg = L"Connect To Correct Server with explicit port (" + Url + ")";
	checkStatusForPeer1(Msg, SC_CONNECT);

	peer1->disconnect();
	checkStatusForPeer1(L"Disconnect From Correct Server (with port)", SC_DISCONNECT);

	//! Check connection for incorrect IP address.
	Url = L"328.0.0.1";
	Msg = L"Connect To Incorrect IP address (" + Url + ")";
	connectResult = peer1->connect(Url);
	CPPUNIT_ASSERT(!connectResult);

	//! Check connection for correct, but not responding, IP
	Url = L"google.com";
	connectResult = peer1->connect(Url);
	CPPUNIT_ASSERT(connectResult);
	Msg = L"Connect To Incorrect Server (" + Url + ")";
	checkStatusForPeer1(Msg, SC_TIMEOUT_DISCONNECT);

	//! Check connection for correct IP address with incorrect MIN port (0000).
	// port 0 is a special case: this port is interpreted as syntax error (for no number found, the lib is remaining on init-value, which is 0) in port-part of the string by PhotonPeerConnect and so function-call will return an error and we do not have to wait for a timeout like for other ports
	JString serverIPCorrectPortIncorrectMinValue = PhotonUnitTest::getServerAddress(false) + ":0000";
	Msg = L"Connect To Incorrect Server (" + serverIPCorrectPortIncorrectMinValue + ")";
	connectResult = peer1->connect(serverIPCorrectPortIncorrectMinValue);
	CPPUNIT_ASSERT(!connectResult);

	//! Check connection for correct IP address with incorrect MAX port (65535).
	JString serverIPCorrectPortIncorrectMaxValue = PhotonUnitTest::getServerAddress(false) + ":65535";
	connectResult = peer1->connect(serverIPCorrectPortIncorrectMaxValue);
	CPPUNIT_ASSERT(connectResult);
	Msg = L"Connect To Incorrect Server (" + serverIPCorrectPortIncorrectMinValue + ")";
	checkStatusForPeer1(L"Connect To Incorrect Server", SC_TIMEOUT_DISCONNECT);
}
Der wird dann so aufgerufen:

Code: Alles auswählen

suite->addTest(new CppUnit::TestCaller<PhotonUnitTest>("\n\n testPhotonPeerConnect", &PhotonUnitTest::testPhotonPeerConnect));
Das wars, ein neuer Testcase wurde hinzugefügt.

Keine Ahnung, was du mit Testtreiber meinst und wie aufwendig es ist, dass in CTest einzubinden, kann ich nicht sagen. Wir haben die Unittests als Visual Studio Projekt, welches die zu testenden Libs einbindet und eine executable erzeugt, aufgesetzt.

Re: C++ Unit Tests

Verfasst: 23.08.2012, 23:36
von Artificial Mind
Also ich habe mir jetzt Google Test angeguckt und eingebaut und der große Vorteil ist halt, dass man die Tests nichtmal registrieren muss, da sie sich selbst global registrieren.

Re: C++ Unit Tests

Verfasst: 23.08.2012, 23:40
von kaiserludi
Artificial Mind hat geschrieben:Also ich habe mir jetzt Google Test angeguckt und eingebaut und der große Vorteil ist halt, dass man die Tests nichtmal registrieren muss, da sie sich selbst global registrieren.
Hört sich für mich eher nach einem Nachteil an, da man dann ja alle Testcases, die man nicht duchlaufen lassen will, auskommentieren muss, statt nur die Registrierungszeilen, wenn man z.B. gerade debuggt, warum ein Testcase fehlschlägt und dann natürlich entsprechend nicht bei jedem Testlauf erstmal alle Tests davor durchlaufen lassen will.

Re: C++ Unit Tests

Verfasst: 23.08.2012, 23:46
von Artificial Mind
Man kann schon einzelne Tests oder auch Test-Cases (mehrere gruppierte Tests) einzeln laufen lassen.