Viele Entwickler stehen beim Testen ihres Codes vor Herausforderungen. Ohne ordnungsgemäße Tests können Fehler durchschlüpfen, was zu frustrierten Benutzern und kostspieligen Korrekturen führt.
In diesem Artikel erfahren Sie, wie Sie Unit-, Integrations- und End-to-End-Tests mit Jest, Supertest und Puppeteer effektiv an einem sehr einfachen Beispiel anwenden, das mit Node.js und MongoDB erstellt wurde.
Ich hoffe, dass Sie am Ende dieses Artikels ein klares Verständnis dafür haben, wie Sie diese Art von Tests in Ihren eigenen Projekten anwenden können.
?? Das vollständige Beispiel finden Sie hier in diesem Repo.
Bevor ich unsere Abhängigkeiten installiere, möchte ich zunächst unser Beispiel vorstellen. Es handelt sich um ein sehr einfaches Beispiel, bei dem ein Benutzer die Registrierungsseite öffnen, seine Registrierungsdaten festlegen, auf die Registrierungsschaltfläche klicken und seine Informationen in der Datenbank speichern kann.
In diesem Beispiel verwenden wir die folgenden Pakete:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Die meisten dieser Abhängigkeiten sind unkompliziert, aber hier finden Sie Erläuterungen zu einigen davon:
Gut, lass uns das in Code übersetzen.
Um Ihre Unit-Tests ohne unvorhersehbares Verhalten auszuführen, sollten Sie die Mock-Funktionen vor jedem Test zurücksetzen. Sie können dies mit dem Hook „beforeEach“ erreichen:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
In diesem Fall möchten wir die Funktion „validateInput“ testen:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Es handelt sich um eine sehr einfache Funktion, die überprüft, ob die bereitgestellte Eingabe eine gültige E-Mail enthält. Hier ist der Unit-Test:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
await Expect(async () => {}).rejects: Basierend auf der Jest-Dokumentation ist dies die Möglichkeit, den Grund für ein abgelehntes Versprechen zu erwarten.
Testen wir eine weitere Funktion, die prüft, ob eine doppelte E-Mail in der Datenbank vorhanden ist. Eigentlich ist dies interessant, weil wir uns mit der Datenbank befassen müssen und sich Unit-Tests gleichzeitig nicht mit externen Systemen befassen sollten. Was sollen wir also tun? Nun, wir sollten Mocks verwenden.
Schauen Sie sich zunächst die Funktion emailShouldNotBeDuplicated an, die wir testen müssen:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
Wie Sie sehen, sendet diese Funktion eine Anfrage an die Datenbank, um zu prüfen, ob es einen anderen Benutzer mit derselben E-Mail-Adresse gibt. So können wir den Datenbankaufruf verspotten:
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
Wir haben die findOne-Datenbankmethode mit jest.spyOn(object, methodName) gemobbt (ausspioniert), wodurch eine Scheinfunktion erstellt und ihre Aufrufe verfolgt werden. Dadurch können wir die Anzahl der Aufrufe und die übergebenen Parameter der ausspionierten findOne-Methode mithilfe von toHaveBeenNthCalledWith.
verfolgenBevor wir unseren Integrationstest schreiben, müssen wir unsere Umgebung konfigurieren:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Jetzt sind wir bereit, unseren Integrationstest durchzuführen.
Testen wir den gesamten serverseitigen Registrierungsprozess – vom Senden der Registrierungsanfrage über das Speichern von Benutzerdetails in der Datenbank bis hin zur Weiterleitung zur Erfolgsseite:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
Wie Sie sehen, integriert die Funktion „registerController“ mehrere Komponenten (Funktionen) sowie die Funktionen „validateInput“, „emailShouldNotBeDuplicated“ und „createUser“.
Also schreiben wir unseren Integrationstest:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
Lass uns auf unser Beispiel eingehen.
Tatsächlich in unserem Beispiel ähnelt die Umgebungskonfiguration für End-to-End-Tests der für Integrationstests.
In diesem Fall müssen wir das tatsächliche Benutzerregistrierungsverhalten genau simulieren, vom Öffnen der Registrierungsseite über die Eingabe der Daten (Name, E-Mail-Adresse, Passwort) bis hin zum Klicken auf die Schaltfläche „Registrieren“ und schließlich der Weiterleitung auf eine Erfolgsseite . Schauen Sie sich den Code an:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Lassen Sie uns diesen Code aufschlüsseln:
Foto von Nathan Dumlao auf Unsplash
An diesem Punkt fragen Sie sich vielleicht, wie Sie alle Testtypen gleichzeitig ausführen können, wenn jeder seine eigene Konfiguration hat. Zum Beispiel:
Wie können wir also alle Testtypen gleichzeitig ausführen und gleichzeitig sicherstellen, dass jeder seine entsprechende Konfiguration berücksichtigt?
Um dieses Problem zu lösen, befolgen Sie diese Schritte:
1. Lassen Sie uns drei verschiedene Konfigurationsdateien erstellen, jest.unit.config.js:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
jest.integration.config.js:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
jest.e2e.config.js:
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
2. Als Nächstes aktualisieren Sie Ihre npm-Skripte in der Datei „package.json“ wie folgt:
// register.controller.js const { User } = require('../models/user'); const registerController = async (input) => { ... await emailShouldNotBeDuplicated(input.email); ... }; const emailShouldNotBeDuplicated = async (email) => { const anotherUser = await User.findOne({ email }); if (anotherUser) throw new Error('Duplicated email'); };
--config: Gibt den Pfad zur Jest-Konfigurationsdatei an.
npm-run-all --parallel: Ermöglicht die parallele Ausführung aller Tests.
3. Erstellen Sie dann drei Setup-Dateien mit den Namen setup.unit.js, setup.integration.js und setup.e2e.js, die den erforderlichen Setup-Code enthalten, der in den vorherigen Abschnitten verwendet wurde.
4. Führen Sie abschließend alle Tests aus, indem Sie diesen Befehl npm run test ausführen. Dieser Befehl führt alle Unit-, Integrations- und End-to-End-Tests entsprechend ihrer jeweiligen Konfiguration parallel aus.
In diesem Artikel haben wir Unit-, Integrations- und End-to-End-Tests (E2E) untersucht und deren Bedeutung für die Erstellung zuverlässiger Anwendungen hervorgehoben. Wir haben in einem einfachen Benutzerregistrierungsbeispiel mit Node.js und MongoDB gezeigt, wie diese Testmethoden mit Jest, Supertest und Puppeteer implementiert werden.
Tatsächlich verbessert eine solide Teststrategie nicht nur die Codequalität, sondern stärkt auch das Vertrauen der Entwickler und erhöht die Benutzerzufriedenheit.
Ich hoffe, dieser Artikel hat Ihnen nützliche Erkenntnisse geliefert, die Sie auf Ihre eigenen Projekte anwenden können. Viel Spaß beim Testen!
Wenn Sie diesen Artikel nützlich fanden, schauen Sie sich auch diese Artikel an:
Vielen Dank, dass Sie bis hierher bei mir geblieben sind. Ich wünsche Ihnen viel Spaß beim Lesen dieses Artikels.
Das obige ist der detaillierte Inhalt vonUnit, Integration und ETesting in einem Beispiel mit Jest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!