2012-04-20 4 views
13

Ich bin auf der Suche nach einem guten Weg zum Unit-Test meiner Template-Methoden, Klassen und Funktionen in C++. Ich habe das Gefühl, dass es nicht ausreicht, nur mit einem einzigen Typ zu testen, und es fühlt sich nicht richtig an, nur die Komponententests zu duplizieren und die Typen zu ersetzen.Was ist eine gute Möglichkeit, Templat-basierte C++ - Methoden/Klassen/Funktionen zu testen?

Um genauer zu sein, arbeite ich an einer Matrix-Klasse und Boost-Unit-Test-Framework verwenden. Die Matrix soll mit verschiedenen Typen arbeiten. Es wird hauptsächlich für Grundtypen verwendet, möchte aber auch Betonarten unterstützen.

Hinweis, ich mache das zu Lernzwecken, weshalb ich keine vorhandene Matrix-Implementierung verwende.

+4

"Es fühlt sich nicht richtig an, nur die Komponententests zu duplizieren und die Typen zu ersetzen." Warum? Wenn Sie testen möchten, ob es auch mit anderen Typen funktioniert, können Sie das nicht tun, ohne es mit anderen Typen zu testen. – PlasmaHH

Antwort

12

Boost-Test hat ein Makro BOOST_AUTO_TEST_CASE_TEMPLATE, das einen Test für eine Vorlage für jeden Typ in einer boost :: mpl :: list ausführt.

template<typename T> 
T Add(T lh, T rh) 
{ 
    return lh + rh; 
} 

typedef boost::mpl::list<int, float> test_types; 

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types) 
{ 
    T result = Add(T(1), T(2)); 
    BOOST_CHECK_EQUAL(T(3), result); 
} 

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

0

Der Sinn des Komponententestens besteht darin, jeden Zweig Ihres Codes abzudecken. Wenn das Testen mit verschiedenen Typen verschiedene Zweige abdeckt, dann ist es sinnvoll, typspezifische Komponententests hinzuzufügen, ansonsten ist es nur copy-n-paste.

0

Wenn Sie eine Vorlage testen, müssen Sie die Vorlagenklasse mit allen möglichen Typen testen, oder bis Sie denken, dass es ausreicht. Es gibt keine Möglichkeiten.

Ihre Klasse könnte mit int arbeiten, aber für float fehlschlagen.

Wenn die Vorlage nicht für bestimmte Typen verwendet werden soll, fügen Sie in Ihrem Code eine statische Anweisung hinzu.

3

Ich stimme mit josuegomes und VJovic. Ich denke, eine Möglichkeit zur Minimierung der Codeverdopplung besteht darin, eine Template-Funktion mit Ihrer Komponententestlogik zu erstellen und diese dann mit den verschiedenen Typargumenten aufzurufen. Auf diese Weise können Sie alle Ihre Matrix-Unit-Testlogik an einer Stelle platzieren, während Sie für jeden gewünschten Typ die Template-Testfunktion einmal aufrufen.

Es könnte jedoch Overkill sein, dies zu tun. Ich denke, es hängt von der Menge der Logik in Ihren Tests ab.

Verwandte Themen