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.
Unit-Tests sind für die Laufzeitfehler zu erkennen. Compiler dienen zum Erkennen von Kompilierzeitfehlern. – RPGillespie
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. –
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