2009-04-22 3 views
2

Ich habe sowohl CppUnit als auch boost::test für C++ Unittesting verwendet. Im Allgemeinen bevorzuge ich boost::test, hauptsächlich weil die automatischen Testmakros den Aufwand minimieren, um Tests einzurichten. Aber eine Sache vermisse ich wirklich von CppUnit: Die Fähigkeit, Ihre eigenen "Beschützer" zu registrieren, deren Instanzen automatisch alle Lauftests durchlaufen. (Technisch installieren Sie einen Test "Listener", und das kann jeden Test in einem Schutzbereich umhüllen).Entspricht CppUnit-Schutz für boost :: test?

Ich habe diese unschätzbaren in der Vergangenheit für die Überwachung von Unittests für unerwartete Nebenwirkungen gefunden (z. B. Prüfcode hat die Floating-Point-Unit-State-Flags nicht geändert). Ich kann kein Äquivalent in der boost::testdocumentation sehen, obwohl BOOST_FIXTURE_TEST_CASE vielleicht am nächsten kommt.

Haben Sie Vorschläge, wie Sie die gleichen Vorteile wie die CppUnit-Protektoren in boost::test erzielen?

(Ich habe noch nicht wirklich in die Implementierung boost::test geschaut, aber wenn es etwas wie CppUnit ist, muss es etwas sehr ähnliche Beschützer selbst verwenden).

Antwort

2

Ich habe nie CppUnit verwendet, also nicht sicher, wie Protektoren funktionieren. Suchen Sie nach etwas, das einzelne Tests oder die gesamte Testsuite umschließt?

Für die ehemalige, könnten Sie Leuchten wie Sie erwähnen, aber wie ich es verstehe, Armaturen sollten als "außerhalb" des Tests betrachtet werden. Sie richten alles ein, was der Test benötigt und säubern ihn anschließend. Jede tatsächliche Fehlerprüfung sollte im Test selbst stattfinden, kann aber leicht mit RAII implementiert werden. Definieren Sie einfach eine Klasse, die überprüft, was Sie in ihrem Destruktor benötigen, und erstellen Sie dann zu Beginn des Tests eine lokale Instanz. Da es zuerst aufgebaut wird, wird es zuletzt zerstört, so dass es leicht überprüfen kann, ob der Test keinen unerwarteten Zustand verändert hat.

Wenn Sie es wünschen, dies zu überprüfen, nachdem alle die Tests durchgeführt haben, werden Sie wahrscheinlich wollen global fixtures

+0

CppUnit Hörer/Protektoren geben Sie die Bequemlichkeit der RAH-scoped Tests in (oder um) jeden Test, aber ohne mühsam eine Zeile Code zu jedem Test hinzufügen. Danke für die Hinweise auf globale Fixtures ... wenn es nur etwas Entsprechendes gäbe, wo der ctor/dtor für jeden Testlauf aufgerufen wurde, wäre das perfekt, aber ohne dass er alle meine BOOST_AUTO_TEST_CASE mit BOOST_FIXTURE_TEST_CASE global ersetzt und Protektor-ähnliches Gebilde erstellt Checks in das mitgelieferte Gerät scheint die beste Wette. – timday

+0

Ah, ich denke, ich verstehe es. Sie möchten, dass dieses RAII-Objekt um jeden einzelnen Testfall in jeder Testsuite gewickelt wird, ohne es für jeden Test explizit angeben zu müssen? Meine beste Wette wäre ein einfaches Wrapper-Makro, das auf BOOST_FIXTURE_TEST_CASE erweitert wird, wobei Ihr Schutzobjekt in die erste Zeile eingefügt wird. – jalf

+0

Interessante Idee klingt jedoch wie eine nützliche Ergänzung. Fühlen Sie sich frei, es den Autoren der Boost-Bibliothek vorzuschlagen;) – jalf