1373 Stimmen

Was ist der Unterschied zwischen einer Attrappe und einem Stummel?

Ich habe verschiedene Artikel über Mocking vs Stubbing in Tests gelesen, einschließlich Martin Fowlers Spötteleien sind keine Spötteleien aber ich verstehe den Unterschied immer noch nicht.

14voto

Premraj Punkte 65511

Der von ihm verwendete Oberbegriff ist ein Test Double (man denke an ein Stunt-Double). Test-Double ist ein allgemeiner Begriff für jeden Fall, in dem Sie ein Produktionsobjekt zu Testzwecken ersetzen. Es gibt verschiedene Arten von Double, die Gerard aufzählt:

  • Schnuller Objekte werden herumgereicht, aber nie wirklich benutzt. Normalerweise werden sie nur zum Füllen von Parameterlisten verwendet.
  • Gefälschte Objekte haben tatsächlich funktionierende Implementierungen, nehmen aber in der Regel eine Abkürzung, die sie nicht für die Produktion geeignet macht (eine InMemoryTestDatabase ist ein gutes Beispiel).
  • Kippen geben vorgefertigte Antworten auf Anrufe, die während des Tests getätigt werden, und reagieren in der Regel überhaupt nicht auf etwas, das nicht für den Test programmiert wurde.
  • Spione sind Stubs, die auch einige Informationen aufzeichnen, je nachdem, wie sie aufgerufen wurden. Eine Form davon könnte ein E-Mail-Dienst sein, der aufzeichnet, wie viele Nachrichten er verschickt hat (auch als Teilweise Attrappe ).
  • Verspottet sind mit Erwartungen vorprogrammiert, die eine Spezifikation der Anrufe bilden, die sie erhalten sollen. Sie können eine Ausnahme auslösen, wenn sie einen Anruf erhalten, den sie nicht erwarten, und werden während der Verifizierung überprüft, um sicherzustellen, dass sie alle Anrufe erhalten haben, die sie erwartet haben.

Quelle

11voto

Mustafa Ekici Punkte 6862

A gefälscht ist ein allgemeiner Begriff, der entweder einen Stub beschreiben kann oder ein Scheinobjekt (handschriftlich oder anderweitig) beschreiben kann, da beide wie das echte Objekt.

Ob eine Fälschung ein Stub oder ein Mock ist, hängt davon ab, wie sie in dem aktuellen Test verwendet wird. Wenn es verwendet wird, um eine Interaktion zu prüfen (gegen die behauptet wird), ist es ein Mock-Objekt. Andernfalls ist es ein Stub.

Fälschungen sorgt für einen reibungslosen Ablauf des Tests. Das bedeutet, dass der Leser Ihres zukünftigen Tests verstehen wird, wie sich das gefälschte Objekt verhalten wird, ohne den Quellcode lesen zu müssen (ohne von externen Ressourcen abhängig zu sein).

Was bedeutet ein reibungsloser Testlauf?
Beispiel im untenstehenden 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 wollen testen mailService.SendEMail() Methode, um das zu tun, müssen Sie eine Exception in Ihrer Testmethode simulieren, so müssen Sie nur eine Fake Stub errorService Klasse erstellen, um dieses Ergebnis zu simulieren, dann wird Ihr Testcode in der Lage sein, mailService.SendEMail() Methode zu testen. Wie Sie sehen, müssen Sie ein Ergebnis simulieren, das von einer anderen External Dependency ErrorService-Klasse stammt.

9voto

Murat Yıldız Punkte 10369

Stummel

Ein Stub ist ein Objekt, das vordefinierte Daten enthält und diese verwendet, um Anrufe während der Tests zu beantworten. Es wird verwendet, wenn Sie keine Objekte einbeziehen können oder wollen, die mit echten Daten antworten würden oder unerwünschte Nebeneffekte hätten.

Ein Beispiel kann ein Objekt sein, das Daten aus der Datenbank abrufen muss, um auf einen Methodenaufruf zu reagieren. Anstelle des eigentlichen Objekts haben wir einen Stub eingeführt und definiert, welche Daten zurückgegeben werden sollen.

enter image description here

Beispiel für Stub:

public class GradesService {

   private final Gradebook gradebook;

   public GradesService(Gradebook gradebook) {
       this.gradebook = gradebook;
   }

   Double averageGrades(Student student) {
       return average(gradebook.gradesFor(student));
   }
}

Anstatt die Datenbank aus dem Gradebook-Speicher aufzurufen, um die tatsächlichen Noten der Schüler abzurufen, konfigurieren Sie den Stub mit den Noten, die zurückgegeben werden sollen, vor. Sie definieren gerade genug Daten, um den Algorithmus zur Durchschnittsberechnung zu testen.

public class GradesServiceTest {

   private Student student;
   private Gradebook gradebook;

   @Before
   public void setUp() throws Exception {
       gradebook = mock(Gradebook.class);
       student = new Student();
   }

   @Test
   public void calculates_grades_average_for_student() {
       //stubbing gradebook
       when(gradebook.gradesFor(student)).thenReturn(grades(8, 6, 10)); 

       double averageGrades = new GradesService(gradebook).averageGrades(student);

       assertThat(averageGrades).isEqualTo(8.0);
   }
}

Mock

Mocks sind Objekte, die Aufrufe registrieren, die sie erhalten. In der Test Assertion können Sie anhand von Mocks überprüfen, ob alle erwarteten Aktionen ausgeführt wurden. Sie verwenden Mocks, wenn Sie den Produktionscode nicht aufrufen wollen oder wenn es keine einfache Möglichkeit gibt, zu überprüfen, ob der beabsichtigte Code ausgeführt wurde. Es gibt keinen Rückgabewert und keine einfache Möglichkeit, eine Änderung des Systemzustands zu überprüfen. Ein Beispiel ist eine Funktion, die den E-Mail-Versanddienst aufruft.

Sie möchten nicht bei jedem Test eine E-Mail versenden. Außerdem ist es nicht einfach, in Tests zu überprüfen, ob eine richtige E-Mail versendet wurde. Das Einzige, was Sie tun können, ist, die Ausgaben der Funktionalität zu überprüfen, die in unserem Test ausgeübt wird. In anderen Worten: Überprüfen Sie, ob der E-Mail-Versanddienst aufgerufen wurde.

enter image description here

Beispiel für Mock:

public class SecurityCentral {

   private final Window window;
   private final Door door;

   public SecurityCentral(Window window, Door door) {
       this.window = window;
       this.door = door;
   }

   void securityOn() {
       window.close();
       door.close();
   }
}

Sie wollen keine echten Türen schließen, um zu testen, ob die Sicherheitsmethode funktioniert, richtig? Stattdessen platzieren Sie Tür- und Fenstermodelle im Testcode.

public class SecurityCentralTest {

   Window windowMock = mock(Window.class);
   Door doorMock = mock(Door.class);

   @Test
   public void enabling_security_locks_windows_and_doors() {
       SecurityCentral securityCentral = new SecurityCentral(windowMock, doorMock);

       securityCentral.securityOn();

       verify(doorMock).close();
       verify(windowMock).close();
   }
}

Vielen Dank an Micha Lipski für seinen guten Artikel. Für weitere Lektüre:

Test Double - Martin Fowler https://martinfowler.com/bliki/TestDouble.html
Test Double - xUnit-Muster http://xunitpatterns.com/Test%20Double.html
Mocks sind keine Stubs - Martin Fowler https://martinfowler.com/articles/mocksArentStubs.html
Befehl-Abfrage-Trennung - Martin Fowler https://martinfowler.com/bliki/CommandQuerySeparation.html

9voto

Dimos Punkte 7461

Direkt aus der Zeitung Rollen simulieren, nicht Objekte , von den Entwicklern von jMock :

Stubs sind Dummy-Implementierungen des Produkts Ergebnisse liefern. Mock Objects agieren wie Stubs, enthalten aber auch Assertions, um die Interaktionen des Zielobjekts mit seinen Nachbarn zu instrumentieren.

Die wichtigsten Unterschiede sind also:

  • Erwartungen, die auf Stubs gesetzt werden, sind in der Regel generisch, während Erwartungen, die auf Mocks gesetzt werden, "cleverer" sein können (z. B. beim ersten Aufruf dies zurückgeben, beim zweiten dies usw.).
  • Kippen werden hauptsächlich verwendet, um Einrichtung indirekter Eingänge des SUT , während spottet kann verwendet werden, um zu prüfen sowohl indirekte Inputs als auch indirekte Ausgänge des SUT.

Zusammenfassend lässt sich sagen, dass wir versuchen, die Verwirrung zu zerstreuen, die Der Artikel von Fowler Titel: Mocks sind Stubs, aber sie sind nicht nur Stubs .

8voto

A.I Punkte 1408

Ich bin auf diesen interessanten Artikel von UncleBob gestoßen Der kleine Spötter . Er erklärt die gesamte Terminologie in einer sehr leicht verständlichen Art und Weise, so dass er für Anfänger nützlich ist. Martin Fowlers Artikel ist vor allem für Anfänger wie mich eine harte Lektüre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X