2016-04-12 13 views
4

Wenn Sie eine Anwendung mit den Code-Verträgen entwickeln, wissen Sie vielleicht, dass dieses Konzept in der Programmiersprache Eiffel eingeführt wurde.Sind Unit-Tests erforderlich, wenn Sie Code-Verträge haben?

Ich bin sehr verwirrt geworden, nachdem ich dieses Konzept in meiner C# -Anwendung unter Verwendung System.Diagnostics.Contracts versucht habe.

Die Hauptfrage ist für mich der nächste:

sind wirklich Einheit-Tests erforderlich, wenn Sie Code Verträge haben?

Einer der wichtigsten Unterschiede, dass Unit-Test-Frameworks in der Regel nicht bietet, ist die Möglichkeit, private Methoden zu nennen (außer MS fakes Bibliothek mit ihrer shims). Es ist getan, wegen der Unterstützung der Zusammensetzung & die Idee, dass private Methoden durch öffentliche Methodenaufrufe abgedeckt sind.

Wie für die Code-Verträge kann ich Contract.Requires, Contract.Ensures für private Methoden deklarieren.

Also, warum brauche ich Komponententests, wenn ich Code-Verträge habe, deren Verhalten sehr ähnlich ist.

Danke

+5

Können Sie einen Code-Vertrag für jeden Aspekt schreiben, den Sie jemals testen möchten? Und ist das Vertragssystem in der Lage, jeden dieser Verträge (zur Erstellungszeit) zu überprüfen? Das klingt unwahrscheinlich für mich. –

+0

@JonSkeet Ich nehme an, dass, wenn ich ein Produkt ohne Bugs haben will (in bestimmten Versionen) - muss ich einen sehr hohen Prozentsatz an Code abdecken. Was also Unit-Testing betrifft (wo ich immer versuche, 100% zu erreichen), versuche ich, das gleiche für die Code-Verträge zu tun. Auch TDD-Verhalten (bei jedem Zyklus R-> G-> R) setzt voraus, dass man den Clean-Code für jedes Ziel einzeln entwickelt, man kann nicht zu einem anderen Zeug wechseln, wenn man das vorhergehende nicht beendet hat, oder? –

+3

Ich betrachte die Codeabdeckung nicht als besonders gute Proxy-Metrik für die Codequalität, um ehrlich zu sein. Es ist möglich, 100% Codeabdeckung zu haben, ohne wirklich über Eckfälle nachzudenken. –

Antwort

0

Sie brauchen sicherlich Unit-Tests. Mit Code-Verträgen können Sie nur Ihre statische Vertragsüberprüfung haben. Sie können viel mehr tun, wenn Ihr Code ausgeführt wird.

Angenommen, Sie testen eine Klasse, die von IConnectionProvider abhängt. Was passiert, wenn Ihre GetConnection löst? Code-Verträge helfen dir dabei nicht.

Im Idealfall würden Sie die öffentlichen Methoden Ihrer Klasse mit verschiedenen Eingaben testen und überprüfen, ob sie sich wie erwartet verhält. Dies wird Ihnen helfen, Fehler zu finden und auf lange Sicht besseren Code zu entwickeln.

0

Ich würde Nein sagen. Mit Hilfe von Code-Contracts definieren Sie, was Ihr Code tun soll, und prüfen, ob er dies tut. Der Komponententest macht dasselbe größtenteils, deshalb glaube ich, dass es redundant ist, bis es kosteneffektiv ist, beides zu schreiben.