Vor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?
Hallo zusammen! Heute bringe ich ein Thema vor, das meiner Meinung nach sehr interessant ist. Ich weiß, dass es online Dutzende von Artikeln gibt, die sich mit TDD, BDD, Entwurfsmustern für Tests, dem Schreiben von Tests und vielen anderen verwandten Themen befassen. Allerdings sehe ich nur sehr wenige Artikel, die grundlegendere Begriffe im Testuniversum erklären – jene Funktionen, die wir häufig verwenden, von denen wir jedoch nicht immer vollständig verstehen, was sie bedeuten oder wie sie sich verhalten. Wenn Sie gerade erst anfangen, etwas über das Testen zu lernen, und nicht genau wissen, was die Bibliotheksfunktionen bewirken, ist dieser Artikel genau das Richtige für Sie. Viel Spaß beim Lesen!
Was sind Mocks?
Das Erste, worauf Sie stoßen könnten, sobald Sie mit dem Schreiben von Tests beginnen, sind Mocks. Manchmal verwendet man sie bereits, weiß aber nicht genau, was sie bedeuten. Also, lasst uns eintauchen.
Mocks werden hauptsächlich beim Unit-Testen verwendet. Hierbei handelt es sich um Tools zur Simulation von Inhalten, Objekten oder Antworten, die normalerweise aus einer externen Abhängigkeit stammen oder wenn der Inhalt bestimmte Informationen enthalten muss.
Stellen Sie sich vor, Sie testen ein Filmempfehlungssystem. Dieses System ruft eine Liste von Filmen von einer API ab und sendet sie an Sie zurück.
Das Problem ist: Wenn jedes Mal, wenn Sie die Tests ausführen, die echte API aufgerufen wird, könnte diese langsam und inkonsistent sein (Filme können variieren oder die API könnte ausfallen), was die Tests unzuverlässig macht.
Okay, Leo, ich verstehe das Problem, aber wie löst ein Mock das? Nun, es ist ganz einfach: Anstatt die API aufzurufen, verwenden Sie deren Antwort als statische Liste von Filmen. Es handelt sich im Grunde genommen um eine „Fälschung“ der API-Antwort mit dieser Filmliste.
Wenn Sie im Beispiel des Filmsystems eine Funktion namens fetchMoviesFromAPI() testen möchten, die die API zum Abrufen von Filmen verwendet, können Sie eine Simulation erstellen, um die API-Antwort wie folgt zu simulieren:
// This is the mock const MOVIES_FROM_API = [ { id: 1, name: "Interstellar" }, { id: 2, name: "Nosferatu" } ] // Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section. const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API) ;(async () => { { const expectedMovies = MOVIES_FROM_API const movies = await fetchMoviesFromAPI() expect(movies).toEqual(MOVIES_FROM_API) } })()
Mit Mocks werden Ihre Tests effizienter, da sie nicht von externen Diensten abhängig sind. Darüber hinaus gewinnen sie an Zuverlässigkeit, da Sie die volle Kontrolle über die Erträge haben, sodass Sie sich weiterhin auf die Validierung der Funktionalität konzentrieren können, ohne sich über mögliche API-Instabilitäten oder Ausfallzeiten Gedanken machen zu müssen.
Mocks sind statische Objekte, die Antworten von Anrufen oder anderen zum Testen benötigten Objekten simulieren.
Letztendlich ist es so, als würde man ein Auto testen, ohne echtes Benzin zu verwenden. Sie schaffen eine kontrollierte Umgebung, um sicherzustellen, dass der Motor funktioniert, bevor Sie ihn auf die Straße bringen.
Ich bekomme Mocks, was sind nun Stubs?
Stubs sind ebenfalls Testwerkzeuge, dienen aber einem etwas anderen Zweck. Sie ersetzen das Verhalten von Funktionen durch etwas Vorgegebenes und verwenden oft Mocks, um bestimmte Werte zurückzugeben.
Stubs ersetzen das Verhalten der Funktion. Wenn ich beispielsweise auf diese Film-API zugreife, führt die Funktion nicht den eigentlichen Aufruf aus, sondern schaut sich unser Mock (die statische Liste der Filme) an.
Sie dienen auch als Erinnerung daran, dass unsere Tests nicht von externen Diensten oder dem Internet abhängig sein sollten.
Lassen Sie mich Ihnen etwas Kontext geben: Stellen Sie sich vor, Sie testen eine Anwendung, die den Gesamtwert eines Online-Kaufs berechnet. Die Berechnung berücksichtigt Gebühren, die von einem externen Dienst erhoben werden. Jedes Mal, wenn Sie den Test ausführen, muss diese Berechnung durchgeführt werden, was bedeutet, dass der externe Dienst aufgerufen werden muss. Dies könnte zu einem langsamen, instabilen, kostspieligen (da der externe Dienst möglicherweise Gebühren pro Anfrage berechnet) und inkonsistenten Test (Werte könnten sich ändern) führen.
Mit einem Stub ersetzen Sie den echten Serviceaufruf durch einen festen, vordefinierten Wert (ja, einen Schein). Anstatt den Gebührenservice anzurufen, sagen Sie: „Als Gebühr immer den Wert 10 zurückgeben.“
Stellen Sie sich vor, Sie möchten die Funktion berechnenTotalPurchase() testen, die die Werte der Warenkorbartikel summiert und die Versandkosten hinzufügt. Mithilfe von Stubs ersetzen Sie den Versandkostenservice durch einen Wert, der als Versandkosten immer „10“ zurückgibt. So:
// This is the mock const MOVIES_FROM_API = [ { id: 1, name: "Interstellar" }, { id: 2, name: "Nosferatu" } ] // Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section. const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API) ;(async () => { { const expectedMovies = MOVIES_FROM_API const movies = await fetchMoviesFromAPI() expect(movies).toEqual(MOVIES_FROM_API) } })()
Dies vereinfacht den Test und gewährleistet seine Reproduzierbarkeit, sodass er immer auf die gleiche Weise funktioniert. Darüber hinaus helfen Stubs dabei, den Test zu isolieren, sodass Sie sich keine Gedanken über den Status oder die Verfügbarkeit der Gebühren-API machen müssen.
Zusammenfassend lässt sich sagen, dass es so ist, als würde man ein Kuchenrezept mit einem Messbecher testen, auf dem immer 200 ml Milch stehen, anstatt die tatsächliche Milchmenge abzumessen. Auf diese Weise testen Sie nur, ob Sie die Zutaten mischen können, ohne sich Gedanken darüber machen zu müssen, ob die Milch richtig abgemessen wird.
Spott, Stubs ... und schließlich: Was sind Spione?
Wir haben Mocks untersucht, die Objekte simulieren, und Stubs, die Funktionsverhalten nachahmen. Lassen Sie uns nun über Spione sprechen: Was genau machen sie?
Spies überwachen Funktionen und zeichnen auf, wie oft sie aufgerufen wurden, welche Parameter sie erhielten und die Ergebnisse jeder Ausführung. Sie ermöglichen es Ihnen, das Verhalten der Funktion zu beobachten, ohne sie zu ändern, und stellen so sicher, dass alles wie erwartet funktioniert.
Stellen Sie sich vor, Sie testen das Benachrichtigungsmodul Ihres Projekts. Jedes Mal, wenn eine Bestellung abgeschlossen ist, sollte das System eine Nachricht an den Kunden senden und einen Eintrag protokollieren. In diesem Fall möchten Sie nur sicherstellen, dass diese Aktionen ausgeführt werden, aber keine davon ersetzen. Mit einem Spion überwachen Sie diese Funktionen, ohne ihr Verhalten zu ändern. Dadurch können Sie Folgendes sehen:
- Wenn die Funktion aufgerufen wurde
- Wie oft wurde es aufgerufen
- Welche Argumente es erhalten hat
Wenn Sie beispielsweise die Funktion „completeOrder()“, die eine Benachrichtigung an den Kunden sendet und den Eintrag protokolliert, mit einem Spion testen möchten, können Sie Folgendes überprüfen:
- Wenn die Benachrichtigungsfunktion aufgerufen wurde
- Wenn die Protokollfunktion aufgerufen wurde
- Welche Argumente diese Funktionen erhalten haben.
// This is the mock const MOVIES_FROM_API = [ { id: 1, name: "Interstellar" }, { id: 2, name: "Nosferatu" } ] // Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section. const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API) ;(async () => { { const expectedMovies = MOVIES_FROM_API const movies = await fetchMoviesFromAPI() expect(movies).toEqual(MOVIES_FROM_API) } })()
Zusammenfassend lässt sich sagen, dass es so ist, als würde man eine Kamera aufstellen, um zu beobachten, was ein Koch in der Küche tut. Sie mischen sich nicht in das ein, was sie tun. Überprüfen Sie einfach, ob das Rezept korrekt befolgt wird.
So, das ist es! Sie haben die Begriffe Mocks, Stubs und Spione gelernt und verstanden, die grundlegende Elemente für die Erstellung zuverlässiger und effizienter Tests sind. Jetzt können Sie Ihr Studium weiter vertiefen. Wir sehen uns dort, auf Wiedersehen!
Das obige ist der detaillierte Inhalt vonVor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Diskussion über die Realisierung von Parallaxe -Scrolling- und Elementanimationseffekten in diesem Artikel wird untersuchen, wie die offizielle Website der Shiseeido -Website (https://www.shiseeido.co.jp/sb/wonderland/) ähnlich ist ...

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

JavaScript zu lernen ist nicht schwierig, aber es ist schwierig. 1) Verstehen Sie grundlegende Konzepte wie Variablen, Datentypen, Funktionen usw. 2) Beherrschen Sie die asynchrone Programmierung und implementieren Sie sie durch Ereignisschleifen. 3) Verwenden Sie DOM -Operationen und versprechen Sie, asynchrone Anfragen zu bearbeiten. 4) Vermeiden Sie häufige Fehler und verwenden Sie Debugging -Techniken. 5) Die Leistung optimieren und Best Practices befolgen.

Wie fusioniere ich Array -Elemente mit derselben ID in ein Objekt in JavaScript? Bei der Verarbeitung von Daten begegnen wir häufig die Notwendigkeit, dieselbe ID zu haben ...

Erforschen Sie die Implementierung der Funktion des Bedien- und Drop-Einstellungsfunktion der Panel ähnlich wie VSCODE im Front-End. In der Front-End-Entwicklung wird VSCODE ähnlich wie VSCODE implementiert ...
