Scheinobjekt

Im Objekt orientierte Programmierung, Scheinobjekte sind simulierte Objekte, die das Verhalten realer Objekte auf kontrollierte Weise nachahmen, meistens als Teil von a Softwaretest Initiative. Ein Programmierer erstellt normalerweise ein Scheinobjekt, um das Verhalten eines anderen Objekts zu testen, genauso wie ein Autodesigner a Crash Test Dummy zu simulieren Das dynamische Verhalten eines Menschen in Fahrzeugauswirkungen. Die Technik gilt auch in generische Programmierung.

Motivation

In einem Gerätetest, Scheinobjekte können simulieren Das Verhalten komplexer, realer Objekte und daher nützlich, wenn ein reales Objekt unpraktisch oder unmöglich in einen Unit -Test einbezogen werden kann. Wenn ein Objekt eine der folgenden Eigenschaften hat, kann es nützlich sein, ein Scheinobjekt an seiner Stelle zu verwenden:

  • Das Objekt liefert nicht deterministisch Ergebnisse (z. B. die Stromzeit oder die Stromtemperatur);
  • Es gibt Zustände, die schwer zu erstellen oder zu reproduzieren sind (z. B. einen Netzwerkfehler);
  • es ist langsam (z. B. eine vollständige Datenbank, was vor dem Test initialisiert werden müsste);
  • Es existiert noch nicht oder kann das Verhalten ändern;
  • Es müsste Informationen und Methoden ausschließlich zu Testzwecken (und nicht für seine tatsächliche Aufgabe) enthalten.

Beispielsweise kann ein Weckerprogramm, das zu einem bestimmten Zeitpunkt eine Glocke läute, die aktuelle Zeit von einem Zeitdienst erhält. Um dies zu testen, muss der Test bis zur Alarmzeit warten, um zu wissen, ob er die Glocke richtig erbracht hat. Wenn anstelle des Echtzeitdienstes ein Mock Time-Service verwendet wird, kann er so programmiert werden, dass die Glocken-Ring-Zeit (oder jede andere Zeit) unabhängig von der Echtzeit bereitgestellt wird, damit das Weckerprogramm isoliert getestet werden kann.

Technische Details

Scheinobjekte haben das gleiche Schnittstelle Als die wirklichen Objekte, die sie nachahmen und ein Client -Objekt nicht bewusst sind, ob es ein reales Objekt oder ein Scheinobjekt verwendet. Mit vielen verfügbaren Mock -Objekt -Frameworks kann der Programmierer angeben, welche und in welcher Reihenfolge, Methoden wird auf einem Scheinobjekt aufgerufen und was Parameter wird an sie übergeben und welche Werte zurückgegeben werden. Daher kann das Verhalten eines komplexen Objekts wie einer Netzwerkbuchse von einem Scheinobjekt nachgeahmt werden, sodass der Programmierer feststellen kann, ob das getestete Objekt angemessen auf die große Vielfalt der Zustände reagiert, in denen solche Scheinobjekte möglicherweise sein.

Mocks, Fälschungen und Stubs

Klassifizierung zwischen Mocks, Fälschungen und Stubs ist in der Literatur sehr inkonsistent.[1][2][3][4][5][6] In der Literatur konsistent ist jedoch, dass sie alle ein Produktionsobjekt in einer Testumgebung darstellen, indem sie dieselbe Schnittstelle freigeben.

Was aus spotten, gefälscht, oder Stummel ist der einfachste ist inkonsistent, aber die einfachste gibt immer vorab angeordnet (wie in a Methode Stub). Auf der anderen Seite des Spektrums simuliert das komplexeste Objekt ein Produktionsobjekt mit vollständiger Logik, Ausnahmen usw., ob eine der Mock-, Fake- oder Stub -Trio zu einer solchen Definition ist oder nicht, wieder inkonsistent über die Literatur.

Zum Beispiel könnte eine mock-, gefälschte oder Stubmethode -Implementierung zwischen den beiden Enden des Komplexitätsspektrums enthalten Behauptungen Untersuchen Sie den Kontext jedes Anrufs. Beispielsweise kann ein Scheinobjekt die Reihenfolge geltend machen, in der seine Methoden aufgerufen werden, oder die Konsistenz von Daten über Methodenaufrufe hinweg gilt.

Im Buch Die Kunst der Einheitstests[7] Mocks werden als gefälschtes Objekt beschrieben, das hilft, zu entscheiden, ob ein Test fehlgeschlagen ist, oder überprüft, ob eine Interaktion mit einem Objekt aufgetreten ist. Alles andere ist definiert als Stummel. In diesem Buch, Fälschungen sind alles, was nicht real ist, was, basierend auf ihrer Verwendung, entweder sein kann Stubs oder Mocks.

Erwartungen setzen

Betrachten Sie ein Beispiel, in dem ein Autorisierungssubsystem verspottet wurde. Das Scheinobjekt implementiert eine IsuSerallowed (Aufgabe: Aufgabe): boolean[8] Methode, um dies in der realen Autorisierungsklasse zu entsprechen. Viele Vorteile folgen, wenn es auch eine enthüllt isallowed: boolean Eigenschaft, das in der realen Klasse nicht vorhanden ist. Auf diese Weise können Testcode die Erwartung einfach festlegen, dass ein Benutzer im nächsten Anruf die Erlaubnis erteilt und daher das Verhalten des Restes des Systems in beiden Fällen leicht testen kann.

In ähnlicher Weise könnten nur Scheineinstellungen sicherstellen, dass nachfolgende Aufrufe des Untersystems dies dazu führen, dass dies zu Wirf eine Ausnahme, aufhängen ohne antworten oder zurückkehren Null usw. Daher ist es möglich, sich zu entwickeln und zu testen Klient Verhaltensweisen für realistische Fehlerbedingungen in Back-End Subsysteme sowie für ihre erwarteten Antworten. Ohne ein so einfaches und flexibles Scheinsystem kann das Testen jeder dieser Situationen zu mühsam sein, um sie angemessen zu berücksichtigen.

Schreiben von Protokollzeichenfolgen

Ein Scheindatenbankobjekt eines Speichern (Person: Person) Die Methode enthält möglicherweise nicht viel (falls vorhanden) Implementierungscode. Es könnte die Existenz und vielleicht die Existenz überprüfen Gültigkeit von dem Person, der zum Speichern verabschiedet wurde (siehe oben gefälschte vs. Scheindiskussion), aber darüber hinaus könnte es keine andere Implementierung geben.

Dies ist eine verpasste Gelegenheit. Die Mock -Methode könnte einen Eintrag zu einer öffentlichen Protokollzeichenfolge hinzufügen. Der Eintrag muss nicht mehr als "Person gespeichert" sein,[9]: 146–7 oder es kann einige Details der Person -Objektinstanz enthalten, z. B. einen Namen oder eine ID. Wenn der Testcode auch den endgültigen Inhalt der Protokollzeichenfolge nach verschiedenen Vorgängen überprüft, die die Mock -Datenbank betreffen, ist es möglich zu überprüfen, dass in jedem Fall genau die erwartete Anzahl von Datenbankspart ausgeführt wurde. Dies kann ansonsten unsichtbare Leistungsfehler finden, beispielsweise, bei denen ein Entwickler, der nervös ist, Daten zu verlieren, wiederholte Aufrufe an codiert hat sparen() wo nur einer ausreichte.

Verwendung in der testgetriebenen Entwicklung

Programmierer arbeiten mit dem Testgetriebene Entwicklung (TDD) Methode verwendet Scheinobjekte beim Schreiben von Software. Scheinobjekte treffen die Schnittstelle Anforderungen an und stehen für komplexere reale; So erlauben sie den Programmierern zu schreiben und Gerätetest Funktionalität in einem Bereich, ohne komplexe zugrunde liegende oder zusammenarbeite zu nennen Klassen.[9]: 144–5 Durch die Verwendung von Scheinobjekten können Entwickler ihre Tests auf das Verhalten des zu testenden Systems konzentrieren, ohne sich um seine Abhängigkeiten zu sorgen. Beispielsweise kann das Testen eines komplexen Algorithmus basierend auf mehreren Objekten, die insbesondere Zustände sind, mithilfe von Scheinobjekten anstelle realer Objekte klar ausgedrückt werden.

Abgesehen von Komplexitätsproblemen und den daraus gewonnenen Vorteilen Trennung von BedenkenEs gibt praktische Geschwindigkeitsprobleme. Die Entwicklung einer realistischen Software mit TDD kann leicht mehrere hundert Einheiten -Tests umfassen. Wenn viele davon Kommunikation mit Datenbanken, Webdiensten und anderen induzieren außerhalb des Verfahrens oder vernetzt Systeme, dann die Suite der Unit -Tests werden schnell zu langsam, um regelmäßig ausgeführt zu werden. Dies führt wiederum zu schlechten Gewohnheiten und einer Zurückhaltung des Entwicklers, die Grundsätze der TDD zu erhalten.

Wenn Scheinobjekte durch reale ersetzt werden, muss die End-to-End-Funktionalität weiter testen. Das wird sein Integrationstests eher als Unit -Tests.

Einschränkungen

Die Verwendung von Scheinobjekten kann das genau koppeln Unit -Tests zur Implementierung des getesteten Codes. Beispielsweise ermöglichen es vielen Scheinobjekt -Frameworks dem Entwickler, die Reihenfolge und die Anzahl der Mock -Objektmethoden zu überprüfen, die durch das testen reale Objekt aufgerufen wurden. anschließend Refactoring Der getestete Code könnte daher dazu führen, dass der Test fehlschlägt, obwohl alle verspotteten Objektmethoden immer noch dem Vertrag der vorherigen Implementierung gehorchen. Dies zeigt, dass Unit -Tests eher das externe Verhalten einer Methode als die interne Implementierung testen sollten. Die Überwendung von Scheinobjekten im Rahmen einer Reihe von Einheitstests kann zu einer dramatischen Erhöhung der Wartungsmenge führen, die während der Systementwicklung während des Refactorings für die Tests selbst während des Aufbaus durchgeführt werden muss. Die unsachgemäße Wartung solcher Tests während der Evolution könnte es ermöglichen, Fehler zu übersehen, die ansonsten von Unit -Tests, die Instanzen von realen Klassen verwenden, erfasst werden. Umgekehrt muss einfach eine Verspottung einer Methode weit weniger Konfiguration erfordern als die Einrichtung einer gesamten realen Klasse und damit die Wartungsanforderungen zu reduzieren.

Scheinobjekte müssen das Verhalten des von ihnen verspotteten Objekts genau modellieren, was schwierig zu erreichen sein kann, wenn das verspottete Objekt von einem anderen Entwickler oder Projekt stammt oder noch nicht einmal geschrieben wurde. Wenn das Verhalten nicht korrekt modelliert wird, können die Unit -Tests einen Pass registrieren, obwohl ein Fehler zu Laufzeit unter den gleichen Bedingungen wie der Unit -Test auftritt, wodurch der Unit -Test ungenau wird.[10]

Siehe auch

Verweise

  1. ^ "Lassen Sie uns die gleiche Sprache (falsche, Stubs und Mocks) sprechen".
  2. ^ "Hinter der Zeit: Mocks und Stubs sind keine Spione". 21. Oktober 2007.
  3. ^ "Mocks, Fälschungen, Stubs und Dummies bei Xunitpatterns.com".
  4. ^ "Was ist der Unterschied zwischen einem Mock & Stub?".
  5. ^ "Was ist der Unterschied zwischen Fake, Mocking und Stubbing?".
  6. ^ Federn, Michael (2005). "Sensing und Trennung". Effektiv mit dem Legacy -Code arbeiten. NJ: Prentice Hall. p. 23 ff. ISBN 0-13-117705-2.
  7. ^ Osherove, Roy (2009). "Interaktionstests mit Scheinobjekten und SEQ". Die Kunst der Einheitstests. Manning. ISBN 978-1-933988-27-6.
  8. ^ Diese Beispiele verwenden eine Nomenklatur, die dem in verwendeten ähnlich ist Einheitliche Modellierungssprache
  9. ^ a b Beck, Kent (2003). Testgetriebene Entwicklung mit gutem Beispielsweise. Boston: Addison Wesley. ISBN 0-321-14653-0.
  10. ^ Inva.com zum Verspotten | O'Reilly Media

Externe Links