2015-02-23 1 views
6

Ich habe eine Matrix-Klasse geschrieben und überprüft, dass die Multiplikation von Matrizen inkompatibler Größen mit C++ - Ausnahmen nicht zulässig ist. Ich habe Komponententests geschrieben, um dieses Verhalten zu überprüfen, und sie erwarten, dass eine Ausnahme ausgelöst wird.Komponententest für Kompilierungsfehler mit C++

Jetzt ändere ich die Matrixgröße von einer Laufzeitvariablen zu einem Template-Parameter. Wenn ich das richtig machen kann, wird der Code, der versuchen wird, Matrizen mit falschen Größen zu multiplizieren, nicht einmal kompiliert.

Es scheint, dass diese Komponententests jetzt redundant sind. Da ich jedoch nicht weiß, wie ich meinen Code in Zukunft ändern werde und was nicht, möchte ich noch Tests dafür implementieren. Wenn ich vorher erwartet habe, dass meine Tests bestimmte Ausnahmen an bestimmten Stellen auslösen, möchte ich nun, dass mein Test bestimmte Kompilierungsfehler an bestimmten Stellen auslöst.

Was ist der beste Weg, das zu tun? Ich könnte mir einen Mechanismus vorstellen, der auf Makefile und Shell-Scripting basiert und auf bestimmte Fehlercodes warten würde - oder sollte ich etwas anderes ausprobieren? Ist diese Idee eine gängige Praxis oder kompletter Wahnsinn?

Bearbeiten: Natürlich, "Unit Tests" ist kein passender Name für diese Art von Mechanismus, ich weiß das, aber für den Moment kann ich einfach nicht an einen besseren Weg denken. Es gibt bereits drei Kommentatoren, die ihre wertvolle Zeit und Mühe damit verbracht haben, mir zu erklären, was Komponententests sind und was nicht. Leider hilft das, obwohl es technisch wahr ist, hier nicht, ein tatsächliches Problem zu lösen.

Edit 2: Dies ist BDD Szenario, das ich für testen wollen:

  • Bei zwei Matrizen von Größen 2x2 und 3x3
  • Wenn der Benutzer versucht, sie
  • zu multiplizieren
  • Dann er bekommt Fehler

Bevor, Fehler Laufzeitfehler war, und es für das Testen war trivial. Aber jetzt wurde ich ein Kompilierzeitfehler, und ich sehe nicht, wie ich dieses Szenario automatisch prüfen und bestätigen kann, bei jedem Festschreiben (ich habe Unit-Tests in meinen Git-Hooks), dass es mir immer noch einen Fehler gibt.

+4

Unit-Tests sind für die Laufzeitfehler zu erkennen. Compiler dienen zum Erkennen von Kompilierzeitfehlern. – RPGillespie

+0

Komponententests erkennen keine Laufzeitfehler. Komponententests überprüfen, ob erwartete Laufzeitfehler vom Programm selbst oder seiner Laufzeit erkannt werden. Das Tool, nach dem ich suche (Sie haben Recht, Komponententest ist nicht der beste Name dafür), würde keine Kompilierfehler entdecken, sondern würde prüfen, ob der Compiler sie erkennt. –

+2

Komponententests sollten Blackbox-Funktionen testen, deren Implementierungen sich intern ändern können, damit Sie überprüfen können, ob die Modifizierung der Interna nicht ihre Funktionalität beeinträchtigt hat. Ich würde vorschlagen, Implementierung-unabhängige APIs für Ihre Matrizen zu machen. Eine Funktion wie 'bool canMultiply (Matrix & a, Matrix & b)' kann intern verwenden, was sie will, und ist mit Unit-Tests nachprüfbar. – RPGillespie

Antwort

1

Es ist harmlos, Ihren "Unit" -Test beizubehalten, auch wenn der neue Code-Code template es "unmöglich" macht, die Matrix zur Laufzeit nicht anzupassen. Möglicherweise haben Sie immer noch einen Fehler, der durchläuft, um Zeit zu haben und wie Sie sagen, der Code könnte sich wieder ändern.

Wenn Sie gcc verwenden, verwendet gccDejaGnu, um sich selbst zu testen. Das sollte robust genug sein, um gcc Kompilierungsfehler zu erkennen.

+0

Aber wenn ich es so behalte, wird der Laufzeitfehler zum Kompilierungsfehler und ich kann meine Komponententests überhaupt nicht ausführen, weil sie nicht kompiliert werden. Während der Kompilierfehler das gewünschte Ergebnis ist, nach dem ich suchen möchte, möchte ich prüfen, ob ich noch die Möglichkeit habe, den Rest meiner Komponententests auszuführen. Wie kann ich es erreichen? –

+0

Verschieben Sie Ihre Komponententests in Skriptdateien, die Kompilierungsfehler erwarten. Verwenden Sie Python oder make/bash –

+0

Erwartet C++ - Kompilierung Fehler ist ein bisschen schwer - vielleicht wissen Sie von einigen Rahmenbedingungen, um einige Tests zu implementieren? –

0

Ich habe noch nicht genug Rep, um @Paul Evans 'Antwort zu kommentieren, also sag mir bitte, ob ich einfach nicht antworten sollte.

@Paul Evans empfiehlt DejaGnu und ich unterstütze diese Wahl. Wenn Sie jedoch mehr verständliche Kompilierungsfehler erzeugen möchten (Vorlagenkompilierungsfehler neigen dazu, unordentlich zu werden), können Sie static_asserts verwenden.

Sie sind Standard seit C++ 11 (obwohl Sie überprüfen sollten, ob Ihr Compiler sie verwenden kann) und sind verwandt mit traditionellen Behauptungen, nur sie werden zur Kompilierzeit überprüft und können eine benutzerdefinierte Fehlermeldung anzeigen.

Hier ist die Dokumentation, wenn Sie sie heraus überprüfen wollen: http://en.cppreference.com/w/cpp/language/static_assert