Was bedeutet "stub" in der Programmierung?


117

Was bedeutet es zum Beispiel in diesem Zitat?

Die Integration in eine externe API ist fast eine Garantie für jede moderne Web-App. Um eine solche Integration effektiv zu testen, müssen Sie sie auslöschen . Ein guter Stub sollte einfach zu erstellen und stets auf dem neuesten Stand der aktuellen API-Antworten sein. In diesem Beitrag beschreiben wir eine Teststrategie mit Stubs für eine externe API.


9
Haben Sie sich die akzeptierte Antwort in Was ist ein "Stub" angesehen? ?
Nick

Antworten:


103

Ein Stub ist ein steuerbarer Ersatz für eine vorhandene Abhängigkeit (oder einen Mitarbeiter) im System. Mithilfe eines Stubs können Sie Ihren Code testen, ohne sich direkt mit der Abhängigkeit zu befassen.

Externe Abhängigkeit - Bestehende Abhängigkeit:
Es handelt sich um ein Objekt in Ihrem System, mit dem Ihr zu testender Code interagiert und über das Sie keine Kontrolle haben. (Häufige Beispiele sind Dateisysteme, Threads, Speicher, Zeit usw.)

Beispiel im folgenden Code:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

Sie möchten die mailService.SendEMail () -Methode testen. Dazu müssen Sie jedoch eine Ausnahme in Ihrer Testmethode simulieren. Sie müssen also nur ein Fake Stub errorService- Objekt erstellen , um das gewünschte Ergebnis zu simulieren. Dann lautet Ihr Testcode kann die mailService.SendEMail () -Methode testen . Wie Sie sehen, müssen Sie ein Ergebnis simulieren, das aus einer anderen Abhängigkeit stammt, nämlich dem ErrorService- Klassenobjekt (vorhandenes Abhängigkeitsobjekt).


9
Englisch? Was ist eine bestehende Abhängigkeit?
Jwan622

17
@ Jwan622 In Laienbegriffen: Alles, was der Code verwendet. Es kann hilfreich sein zu verstehen, ob Sie "Abhängigkeit" erneut lesen und durch "Klasse" oder "Funktion" oder was auch immer ersetzen (abhängig von Ihrem Hintergrund). Manchmal ist die Verwendung der vorhandenen Klasse / Funktion keine praktikable Option, und Sie benötigen einen Stub (z. B. beim automatisierten Testen von Einheiten für Funktionen, die von der Umgebung abhängen, z. B. das aktuelle Datum und die aktuelle Uhrzeit des Systems).
MasterMastic

101

Ein Stub bedeutet in diesem Zusammenhang eine Scheinimplementierung.

Das heißt, eine einfache, gefälschte Implementierung, die der Schnittstelle entspricht und zum Testen verwendet werden soll.


3
Weitere Einzelheiten finden Sie in dem berühmten Artikel von Martin Fowler über Mocks Aren't Stubs : "Aber so oft wie nicht sehe ich schlecht beschriebene Scheinobjekte. Insbesondere sehe ich sie oft mit Stubs verwechselt - ein häufiger Helfer beim Testen von Umgebungen."
pba

61

Laut Laienbegriffen handelt es sich um Dummy-Daten (oder gefälschte Daten, Testdaten usw.), Mit denen Sie Ihren Code testen oder entwickeln können, bis Sie (oder die andere Partei) bereit sind, echte Daten zu präsentieren / zu empfangen. Es ist das "Lorem Ipsum" eines Programmierers.

Mitarbeiterdatenbank nicht bereit? Machen Sie eine einfache mit Jane Doe, John Doe ... etc. API nicht bereit? Erstellen Sie eine gefälschte .json-Datei, die gefälschte Daten enthält.


1
Vielen Dank für das Beispiel :)
CapturedTree

8

In diesem Zusammenhang wird das Wort "Stub" anstelle von "Mock" verwendet. Aus Gründen der Klarheit und Präzision sollte der Autor jedoch "Mock" verwenden, da "Mock" eine Art Stub ist, jedoch nur zum Testen. Um weitere Verwirrung zu vermeiden, müssen wir definieren, was ein Stub ist.

Im allgemeinen Kontext ist ein Stub ein Programmteil (normalerweise eine Funktion oder ein Objekt), das die Komplexität des Aufrufs eines anderen Programms (normalerweise auf einem anderen Computer, einer anderen VM oder einem anderen Prozess) zusammenfasst - aber nicht immer kann es auch ein lokales sein Objekt). Da sich das tatsächlich aufzurufende Programm normalerweise nicht auf demselben Speicherplatz befindet, erfordert das Aufrufen viele Vorgänge wie Adressieren, Ausführen des eigentlichen Remote-Aufrufs, Marshalling / Serialisieren der zu übergebenden Daten / Argumente (und dasselbe mit dem potenziellen Ergebnis). Vielleicht sogar mit Authentifizierung / Sicherheit und so weiter. Beachten Sie, dass Stubs in einigen Kontexten auch als Proxys bezeichnet werden (z. B. dynamische Proxys in Java).

Ein Mock ist eine sehr spezifische und restriktive Art von Stub, da ein Mock ein Ersatz für eine andere Funktion oder ein anderes Objekt zum Testen ist. In der Praxis verwenden wir häufig Mocks als lokale Programme (Funktionen oder Objekte), um ein Remote-Programm in der Testumgebung zu ersetzen. In jedem Fall kann der Mock das tatsächliche Verhalten des ersetzten Programms in einem eingeschränkten Kontext simulieren.

Die bekanntesten Arten von Stubs sind offensichtlich für die verteilte Programmierung vorgesehen, wenn Remoteprozeduren ( RPC ) oder Remoteobjekte ( RMI , CORBA ) aufgerufen werden müssen . Die meisten verteilten Programmierframeworks / -bibliotheken automatisieren die Generierung von Stubs, sodass Sie sie nicht manuell schreiben müssen. Stubs können aus einer Schnittstellendefinition generiert werden, die beispielsweise mit IDL geschrieben wurde (Sie können jedoch auch eine beliebige Sprache zum Definieren von Schnittstellen verwenden).

Typischerweise unterscheidet man in RPC, RMI, CORBA usw. clientseitige Stubs , die sich hauptsächlich um das Marshalling / Serialisieren der Argumente und das Ausführen des Remote - Aufrufs kümmern , und serverseitige Stubs , die sich hauptsächlich um das Unmarshaling / Deserialisieren kümmern die Argumente und führen tatsächlich die Remote-Funktion / Methode aus. Offensichtlich befinden sich Client-Stubs auf der Client-Seite, während sich mehrere Stubs (häufig als Skelette bezeichnet) auf der Server-Seite befinden.

Das Schreiben guter, effizienter und allgemeiner Stubs wird beim Umgang mit Objektreferenzen zu einer großen Herausforderung. Die meisten Frameworks für verteilte Objekte wie RMI und CORBA befassen sich mit Verweisen auf verteilte Objekte, aber das vermeiden die meisten Programmierer beispielsweise in REST-Umgebungen. In REST-Umgebungen führen JavaScript-Programmierer normalerweise einfache Stub-Funktionen aus, um die AJAX-Aufrufe zu kapseln (Objektserialisierung wird von JSON.parseund unterstützt JSON.stringify). Das Swagger Codegen- Projekt bietet umfassende Unterstützung für die automatische Generierung von REST-Stubs in verschiedenen Sprachen.


3

Sie haben auch ein sehr gutes Test-Framework, um einen solchen Stub zu erstellen. Einer meiner Favoriten ist Mockito. Es gibt auch EasyMock und andere ... Aber Mockito ist großartig, Sie sollten es lesen - ein sehr elegantes und leistungsstarkes Paket


3

Stub ist eine Funktionsdefinition, die den richtigen Funktionsnamen und die richtige Anzahl von Parametern hat und ein Dummy-Ergebnis des richtigen Typs erzeugt.

Es hilft beim Schreiben des Tests und dient als eine Art Gerüst, damit die Beispiele ausgeführt werden können, noch bevor der Funktionsentwurf abgeschlossen ist


3

Dieser Satz ist mit ziemlicher Sicherheit eine Analogie zu einer Phase im Hausbau - dem "Ausstechen" von Rohrleitungen. Während des Baus, während die Wände noch offen sind, werden die rauen Leitungen eingebaut. Dies ist notwendig, damit der Bau fortgesetzt werden kann. Wenn dann alles fertig ist, kommt man zurück und fügt Wasserhähne und Toiletten sowie das eigentliche Endprodukt hinzu. (Siehe zum Beispiel So installieren Sie einen Sanitär-Stub-Out .)

Wenn Sie eine Funktion in der Programmierung "stubben", erstellen Sie genug davon, um sie zu umgehen (zum Testen oder zum Schreiben von anderem Code). Dann kommen Sie später zurück und ersetzen es durch die vollständige Implementierung.


0

RPC Stubs

  • Grundsätzlich ist ein clientseitiger Stub eine Prozedur, die für den Client so aussieht, als wäre es eine aufrufbare Serverprozedur.
  • Ein serverseitiger Stub sieht für den Server so aus, als wäre er ein aufrufender Client.
  • Das Client-Programm glaubt, den Server aufzurufen. Tatsächlich ruft es den Client-Stub auf.
  • Das Serverprogramm glaubt, dass es vom Client aufgerufen wird. Tatsächlich wird es vom Server-Stub aufgerufen.
  • Die Stubs senden sich gegenseitig Nachrichten, um den RPC zu ermöglichen.

Quelle


0

"Wenn Sie eine Funktion auslöschen, schreiben Sie nur genug, um zu zeigen, dass die Funktion aufgerufen wurde, und lassen die Details für später, wenn Sie mehr Zeit haben."

Von: SAMS Bringen Sie sich C ++, Jesse Liberty und Bradley Jones bei

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.