Sollte der Anbieter einer Schnittstelle auch eine Scheinimplementierung zum Testen bereitstellen?

8

Wir haben bei unserem letzten Integrationstest viel Zeit mit einem Fehler verschwendet, der meiner Meinung nach beim Testen von Einheiten hätte gefunden werden müssen. Das Problem war, dass sich eine Schnittstelle / ein Dienst, die wir anriefen, anders verhielt als erwartet, und der Unit-Test dieses Problem nicht fand, weil wir diese Schnittstelle für den Unit-Test verspotteten und unser Mock natürlich auf unserer falschen Interpretation der Schnittstelle beruhte tun. Jetzt könnte ich ein bisschen wütend auf unseren lieben Mitarbeiter sein, der die Schnittstelle bereitgestellt hat, weil ihre Beschreibung / Spezifikation (ein knapper JavaDoc-Kommentar) nicht eindeutig war und zu unserem Missverständnis beitrug. Andererseits dachte ich, dass das Problem hätte vermieden werden können, wenn dieselben Mitarbeiter eine Scheinimplementierung ihrer Schnittstelle bereitgestellt hätten, die wir in unseren Unit-Tests aufrufen könnten.

Was ist nun die beste Vorgehensweise bei der Organisation der Erstellung von Scheinobjekten unter Teams, die gemeinsam genutzte Schnittstellen bereitstellen und verwenden? Was sind deine Erfahrungen?

Robert Jack Will
quelle
Ich hoffe, dass Sie bei all dieser Untersuchung der Schuld einige für sich selbst aufgenommen haben, weil Sie den Autor nicht gefragt haben, ob Ihr Verständnis richtig war ... Eine Frage von Ihrer Seite hätte den ganzen Schmerz ersparen können.
Walter
2
Walter, danke für deine Änderungen und deinen konstruktiven Kommentar. Ihr Vorschlag beantwortet die Frage nicht direkt, sondern ist tatsächlich eine Lösung für das ursprüngliche Problem, das ich habe. Da es mir so schwer fällt, gute Fragen zum eigenen Verständnis zu stellen, kam mir eine andere Idee: Wir hätten das andere Team bitten können, unseren Plan zur Verwendung der Benutzeroberfläche zu überprüfen, und sie hätten das Problem möglicherweise entdeckt.
Robert Jack Will

Antworten:

10

Im Idealfall ja.

Jeder, der Code schreibt, den andere verwenden, ist nicht verpflichtet, den Code zu ergänzen. Wenn Sie jedoch möchten, dass Benutzer Ihren Code verwenden (und jeder sollte immer mit dieser Mentalität schreiben), ist eine umfangreiche relevante Dokumentation - die Beispiele enthalten kann - äußerst nützlich.

Ich glaube nicht, dass ich jemals Dokumentation gelesen habe und gedacht habe: "Das ist dumm; es gibt viel zu viel Dokumentation." Menschen sind von Natur aus begabt, das zu überspringen, was sie für unnötig halten. Wir können jedoch nicht einfach die Dokumentation oder Konzepte lesen und interpolieren, die nicht erklärt wurden. Man kann also davon ausgehen, dass es nicht zu viele gute Dokumentationen gibt. Es sollte auch davon ausgegangen werden, dass die Person es als naives Kind liest (dh es so einfach wie möglich macht).

Beispiele zum Instanziieren und Verwenden einer Klasse sind immer hilfreich. Wenn der Code jedoch zu stark von der Dokumentation abhängt, um verstanden zu werden, ist dies ein weiteres (separates) Problem.

Diese Antwort sollte nicht als Feuerkraft angesehen werden, die es rechtfertigt, Ihren Kollegen anzuschreien. Es ist lediglich eine Richtlinie dessen, was ich für nützlich halte und was getan werden sollte. Während dies in Ihrer Situation völlig nutzlos ist (obwohl ich der Meinung bin, dass Ihre Frage im Grunde genommen ein Scherz ist), ist das nächstbeste, was Sie tun können, mit gutem Beispiel voranzugehen und zu hoffen, dass Ihr Kollege vorbeikommt.

JK
quelle
1
Während ich habe mich beschweren sich über zu viel Dokumentation, wurden diese Fälle selten gewesen (und nahm Problem mehr mit der Qualität , die in sehr langen formuliert geführt und verwirrend docs).
Tim Post
1
@ Tim: Danke, habe gerade bearbeitet - ich bezog mich auf gute Dokumentation. Leider kann jeder eine Menge Müll als "Dokumentation" schreiben!
JK
5

Sollte der Anbieter einer Schnittstelle auch eine Scheinimplementierung zum Testen bereitstellen?

Nein , aber der Anbieter sollte auch den Quellcode für seine Unittests bereitstellen. Wenn Sie diese Unittests lesen, erhalten Sie einen guten Eindruck davon, wie die Bibliothek verwendet werden sollte. Vielleicht können Sie den Provider-Tests Unittests hinzufügen, um anzugeben, was Sie vom Provider erwarten.

Es gibt viele Mocking-Tools / Frameworks, die einen Fake / Stub / Mock implementieren können.

Wenn der Anbieter nach einer Scheinimplementierung gefragt wird, besteht kein gutes Kosten-Nutzen-Verhältnis, da er nicht wissen kann, welcher Teil der gefälschten Implementierung nahezu identisch mit der tatsächlichen Implementierung sein muss und welcher Teil nur eine Fassade ist.

Eine andere Möglichkeit besteht darin, dass der Anbieter Codeverträge verwendet , um sicherzustellen, dass die Bibliothek auf die angegebene Weise verwendet wird.

k3b
quelle
+1 "Es gibt viele Mocking-Tools / Frameworks, die einen Fake / Stub / Mock implementieren können."
Armand
Unit-Tests: Ich sehe zwei Probleme bei der Verwendung als Dokumentation: 1. Sie zeigen nur Beispiele für die Unterstützung durch den Dienst, sagen mir jedoch nicht, ob eine bestimmte Verwendung, die ich in Betracht ziehe, unterstützt wird. 2. Das Lesen von Unit-Tests ist genauso anspruchsvoll / anstrengend wie das Lesen von Code, und ich suche nach einer Lösung, die allen die Arbeit erspart. Ich suche etwas, das automatisch funktioniert, wie Tests oder Verträge (die wir auch untersuchen).
Robert Jack Will
"Der Anbieter kann die Verwendung des Modells nicht kennen": Da bin ich mir nicht sicher. Zum einen sollte der Mock alle Voraussetzungen überprüfen (ist der Dienst richtig verwendet) und einige Dummy-Werte zurückgeben. Grundsätzlich alles, was benötigt wird, um einen Client zu testen. Könnten Sie näher erläutern, welche Informationen dem Anbieter fehlen, um dies gut zu machen?
Robert Jack Will
the mock should check all the preconditions: Warum muss der Mock prüfen, ob die echte Bibliothek diese Prüfung durchführt? Wenn Sie einen Integrationstest mit der realen Bibliothek haben, sollten diese Tests Sie zum Problem führen.
K3B
k3b: Wir wollen Fehler so früh wie möglich finden und der Integrationstest kann viel später erfolgen. Dies war genau das Problem, das wir hatten. Nun, wir arbeiten bereits daran, den Prozess so zu verbessern, dass Integrationstests früher und häufiger stattfinden können, aber dennoch sollten Unit-Tests so viele Fehler wie möglich finden.
Robert Jack Will