C++ Unit Tests

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

C++ Unit Tests

Beitrag 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
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: C++ Unit Tests

Beitrag 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.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Thoran
Establishment
Beiträge: 227
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: C++ Unit Tests

Beitrag 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
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: C++ Unit Tests

Beitrag von kimmi »

Wir / ich mache(n) Unittests mit cppunit. Meine Render-testsuite habe ich von hand zusammen geklöppelt.

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: C++ Unit Tests

Beitrag von Aramis »

Google Test ist sehr, sehr angenehm.

cppunit funktioniert auch ganz gut, ist aber eher klobig.
Benutzeravatar
Thoran
Establishment
Beiträge: 227
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: C++ Unit Tests

Beitrag von Thoran »

Google Test kannte ich bisher gar nicht, muß ich mir mal anschauen. Danke für den Hinweis.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: C++ Unit Tests

Beitrag 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.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: C++ Unit Tests

Beitrag 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.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: C++ Unit Tests

Beitrag 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.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: C++ Unit Tests

Beitrag von Artificial Mind »

Man kann schon einzelne Tests oder auch Test-Cases (mehrere gruppierte Tests) einzeln laufen lassen.
Antworten