Zum Hauptinhalt springen
Capgo-Logo

Einheitstests für JavaScript: Umfassende Anleitung 2026

Meisteren Sie Einheitstests für JavaScript mit unserer Anleitung 2026. Es umfasst Jest, Mocha, Setup, Mocking, CI und Tipps für Capacitor & Electron-Apps.

JavaScript-Unit-Tests: Umfassende 2026 Anleitung

Sie befinden sich wahrscheinlich in einer von zwei Situationen. Entweder Ihr JavaScript-Projekt hat fast keine Tests und jede Refaktorisierung fühlt sich riskant an, oder Sie haben bereits Tests und die Hälfte davon ist langsam, brüchig und schwer zu vertrauen.

Das wird sich in Capacitor Elektron Electron Gute JavaScript-Unit-Tests arbeiten beginnen nicht mit cleverer Matcher-Syntax. Sie beginnen mit einer disziplinierten Grenze: Testen Sie reine Logik direkt, isolieren Sie Nebeneffekte und vermeiden Sie es, Tests zu schreiben, die zusammenbrechen, wenn Sie einen internen Funktion umbenennen.

Good unit tests JavaScript work doesn’t start with clever matcher syntax. It starts with a disciplined boundary: test pure logic directly, isolate side effects, and avoid writing tests that collapse the moment you rename an internal function.

Die Wahl Ihres JavaScript-Testframeworks

Wählen Sie Ihren JavaScript-Testframework

Ein professionelles JavaScript-Projekt benötigt einen echten Testrunner. Ad-hoc-Skripte und manuelle Konsolenprüfungen reichen nicht aus, wenn mehrere Ingenieure an dem gleichen Codebase arbeiten. Sie benötigen Testentdeckung, Anforderungen, asynche Handhabung, Mocks und eine Möglichkeit, alles konsistent in der lokalen Entwicklung und CI auszuführen.

Die aktuelle Leitlinie konvergiert sich auf eine kleine Auswahl an Mainstream-Optionen. Jest, Mocha und Jasmine sind wiederholt als Hauptframeworks hervorgehoben, mit Jest oftmals für die integrierte Teststruktur, Assertions, Mocking und asynche Unterstützung in einem Paket ausgewiesen, wie in diesem Pluralsight-Lab für JavaScript-Tests.

Eine Vergleichstabelle mit beliebten JavaScript-Testframeworks, einschließlich Jest, Mocha, Cypress und Playwright.

Weshalb ein Framework nicht optional ist

Das erste Missverständnis, das Teams haben, ist, dass Einheitstests eine Nebentätigkeit sind. Das führt normalerweise zu inkonsistenten Dateinamen, eigenen Assertions, die niemand mehr kennt, und Helfern, die nur einer Person bekannt sind.

Ein Framework gibt dir eine gemeinsame Sprache:

  • Teststruktur mit describe und test oder it
  • Aussagen mit lesbareren Vergleichern
  • Hooks zur Einrichtung und Auflösung
  • Asynchrone Unterstützung zur Verwendung von Versprechungen und Zeitern
  • Werkzeuge zum Mocken zur Auflösung externer Abhängigkeiten

Wenn Ihr Team auch einen umfassenderen Überblick über die Automatisierung von Tests benötigt, Capgo bietet eine nützliche Übersicht über automatisierte Tests in Abläufen zur App-Verfügbarkeit.

Jest vs Mocha im Überblick

Jest und Mocha vertreten zwei unterschiedliche Philosophien.

Jest ist die alles-in-einem-Paket-Lösung. Sie liefert die meisten Dinge, die Teams am ersten Tag benötigen.
Mocha ist modularer. Sie liefert einen Runner und erwartet, dass Sie den Rest der Stacks selbst zusammenbauen.

Funktion Jest Mocha
Setup-Komplexität Geringer für die meisten Teams Höher, da Sie normalerweise Assertion- und Mocking-Bibliotheken hinzufügen müssen
Anforderungen Inbegriffen Usually paired with another library
Mocking Inbegriffen Usually paired with another library
Asynchrones Testen Inbegriffen und unkompliziert Unterstützt, aber hängt mehr von der Umgebung ab
Abdeckungsworkflow Häufig in die gleiche Werkzeugkette integriert Oft mehr zusammengefügt
Beste Wahl Neue Projekte, Teams, die konsistente Qualität wollen Legacy-Stacks, Teams, die modulare Kontrolle wollen

Praktische Regel: Wenn Ihr Team fragen muss, welche Assertion-Bibliothek und Mocking-Bibliothek mit dem Runner kombiniert werden sollen, wollen Sie wahrscheinlich Jest.

Was ich für die meisten Teams empfehle

Für die meisten modernen Projekte würde ich wählen Jest es sei denn, die Codebasis hat starke Gründe, auf Mocha zu bleiben. Diese Empfehlung wird stärker, wenn die Anwendung enthält Capacitor oder Elektronweil diese Projekte bereits genug bewegliche Teile haben. Die Reduzierung des Testwerkzeug-Schwamms lohnt sich schnell.

Mocha ist in älteren Node.js-Diensten oder langlebigen Codebases noch immer sinnvoll, wo sich das umliegende Ökosystem bereits etabliert hat. Aber für einen mittleren Ingenieur, der von vorneherein eine robuste Suite aufbaut, entfernt Jest in der Regel mehr Hindernisse als es schafft.

Eine wichtige Anmerkung zum Umfang. Cypress und Playwright sind hervorragende Werkzeuge, aber sie lösen ein anderes Problem. Sie sind besser für Browser-Ebene- und End-to-End-Überprüfungen geeignet, nicht für die schnelle innere Schleife, in der die Einheitstests JavaScript laufen sollten.

Projektsetup und erste Einheitstest

Ein sauberes Testsetup sollte langweilig sein. Wenn die Hinzufügung der ersten Einheitstest kompliziert ist, wird die Suite wahrscheinlich nicht gesund bleiben.

Ein Mann mit Brille, der an einem Programmierprojekt auf einem Laptop an einem Holztisch arbeitet.

Einfacher Jest-Setup

Beginnen Sie mit einem JavaScript-Projekt, das bereits eine package.jsonDann fügen Sie Jest als Entwicklungsabhängigkeit hinzu und verbinden Sie eine Testskript.

{
  "scripts": {
    "test": "jest"
  }
}

Das reicht für viele Projekte aus. Sie können später mehr Konfiguration hinzufügen, wenn Ihr Modulsystem, die Transpilation oder die Struktur Ihres Monorepos es erfordert.

Wenn Sie ein Capacitor-Anwendungsprojekt lokal erstellen und Ihr Entwicklungs-Umgebung vor der Hinzufügung von Tests um die gemeinsame Logik in Ordnung haben möchten, ist Capgo's Anleitung zum Setup einer Capacitor-Entwicklungsumgebung eine praktische Begleiterin.

Schreiben Sie den Test vor der code

Die Test-Vor-Vorlage ist nicht nur eine persönliche Vorliebe. Die US-amerikanische Bundesbehörde für Verbraucherfinanzschutz empfiehlt in ihrer JavaScript-Richtlinie ausdrücklich den Test zu schreiben, Tests zu organisieren mit describe und it, und die Überprüfungen um expect(...) Ansprüche in ihrer JavaScript-Einheitstest-Richtlinie.

That matters because test-first changes how you design code. Functions tend to become smaller, dependencies become more visible, and side effects stop leaking into logic that should stay pure.

Hier ist ein minimaler Beispielcode:

// math.js
function addTax(amount, rate) {
  return amount + amount * rate;
}

module.exports = { addTax };
// math.test.js
const { addTax } = require('./math');

describe('addTax', () => {
  it('returns the amount with the tax applied', () => {
    expect(addTax(100, 0.2)).toBe(120);
  });
});

Hier ist ein Minimalbeispiel:

The Anordnen, Handeln, Behaupten Das Muster hält die Tests lesbar, selbst wenn sie komplexer werden.

  1. Anordnen die Eingabe und jede notwendige Vorbereitung.
  2. Handeln indem man die Funktion aufruft.
  3. Behaupten auf dem Ergebnis.

Angewendet auf eine Validierungs-Hilfe:

function isSupportedPlatform(platform) {
  return ['ios', 'android', 'web', 'desktop'].includes(platform);
}

describe('isSupportedPlatform', () => {
  it('returns true for ios', () => {
    // Arrange
    const platform = 'ios';

    // Act
    const result = isSupportedPlatform(platform);

    // Assert
    expect(result).toBe(true);
  });
});

Kleine Tests halten gut. Ein Test sollte normalerweise eine Frage beantworten, nicht eine gesamte Ablauf beschreiben.

Für Capacitor- und Electron-Projekte ist diese Disziplin wichtiger, weil Ihre reine Logik oft neben native oder Desktop-Integrationen code liegt. Halten Sie die Geschäftsregel ohne die Plattform- Runtime testbar, und Ihr erster Test wird nicht Ihr letzter nützlicher sein.

Meisterung von Mocks und asynchronen Code

Die meisten Fehler in der Anwendung code kommen nicht von der Addition zweier Zahlen. Sie kommen von code , die sich außerhalb selbst befindet: Netzwerk-Anfragen, Dateien, Plugin-APIs, Timer, IPC-Kanäle, Speicherschichten.

Dabei hilft das Mocking. Es gibt dir die Kontrolle über die Grenze, so dass sich der Test auf die Entscheidungsfindung deiner code konzentrieren kann.

Eine Whiteboard-Diagramm, das eine Microservices-Architektur mit APIs, Datenbanken, externen Diensten und eventgetriebenen Datenflüssen illustriert.

Mocken Sie Grenzen, nicht alles

Leitfaden für wartbare Tests betont eine-Verhaltensdeckung und Eine starke Behauptung pro TestSeite/ Bereich: Capgo-Marketing-Website. Rolle: Kurze UI-Bezeichnung oder Navigationspunkt. Gesehen in: Seite trust.astro. Nachrichten Schlüssel `und` (Und). eine starke Behauptung pro Test.

That warning matters a lot in JavaScript. Teams often start by mocking every imported module and end up testing whether functions call other functions in the “correct” order, instead of testing real behavior.

Falsche Zieladresse für einen mock-reichen Test:

  • Wie der Hilfsprogramm A den Hilfsprogramm B aufgerufen hat
  • whether service C called serializer D
  • Wie eine interne private Funktion zweimal aufgerufen wurde

Bessere Zielvorstellung:

  • Was die Funktion zurückgegeben hat
  • Wie es eine fehlgeschlagene Abhängigkeit korrekt bearbeitet hat
  • Wie es die Daten in die erwartete Form umgewandelt hat

Eine bessere Muster für Capacitor und Electron code

In mobilen und Desktop-Anwendungen bevorzuge ich eine Wrapper-Schicht um native oder Plattform-APIs herum. Dann simulieren die Einheitstests die Wrapper, nicht die Plattform selbst.

Beispielstruktur:

// cameraGateway.js
async function getPhoto(cameraPlugin) {
  return cameraPlugin.getPhoto();
}

module.exports = { getPhoto };
// profilePhotoService.js
async function loadProfilePhoto(cameraGateway) {
  const photo = await cameraGateway.getPhoto();
  return { path: photo.path, ready: true };
}

module.exports = { loadProfilePhoto };
// profilePhotoService.test.js
const { loadProfilePhoto } = require('./profilePhotoService');

test('returns mapped photo data', async () => {
  const fakeCameraGateway = {
    getPhoto: jest.fn().mockResolvedValue({ path: '/tmp/pic.jpg' })
  };

  const result = await loadProfilePhoto(fakeCameraGateway);

  expect(result).toEqual({ path: '/tmp/pic.jpg', ready: true });
});

Dieses Muster funktioniert auch für Electron. Wrap ipcRenderer, Dateien, Zugriffe oder Shell-Integrationen hinter einer dünnen Adapter-Schicht. Die Einheitstests treffen die Dienstschicht, nicht die Laufzeit direkt.

Für Teams, die die Release-Logik und Update-Pfade in Capacitor-Anwendungen testen, hat Capgo eine relevante Anleitung Prüfung von Capacitor OTA-Updates mit Mock-Szenarien.

Ein schneller Leitfaden hilft, wenn Ihr Team noch die asynchrone Test-Style normalisiert:

Testen Sie asynchrone Flüsse ohne Flakiness

Use async/await in Tests, wenn der code unter Test eine Promise zurückgibt. Es ist klarer als die callback-lastigen Muster und einfacher zu debuggen.

async function fetchProfile(api) {
  const response = await api.getUser();
  return response.name;
}

test('returns the user name from the API response', async () => {
  const api = {
    getUser: jest.fn().mockResolvedValue({ name: 'Ava' })
  };

  const result = await fetchProfile(api);

  expect(result).toBe('Ava');
});

Testen Sie auch den Fehlerpfad:

test('throws when the API request fails', async () => {
  const api = {
    getUser: jest.fn().mockRejectedValue(new Error('network failed'))
  };

  await expect(fetchProfile(api)).rejects.toThrow('network failed');
});

Testen Sie sowohl den glücklichen Pfad als auch den unglücklichen Pfad. In der Produktion ist der unglückliche Pfad meist der, den die Benutzer merken.

Erweiterte Strategien für robuste Tests

Ein Test-Suite wird nützlich, wenn sie auch nach dem code-Wechsel noch nützlich ist. Das ist schwieriger als die Schreibaufgabe von einer Menge von Tests, die laufen.

Ein Diagramm, das Strategien für die Erstellung robusten Software durch umfassende Testabdeckung und wartbare Test-Suiten illustriert.

Verwenden Sie das Test-Split als Budget

Eine praktische Anleitung empfiehlt eine 70/20/10 aufgeteilt auf Einheiten-, Integrations- und End-to-End-Tests, wobei Einheitstests die schnellste Rückmeldung und die stabilsten Fehler liefern. Die gleiche Leitlinie sagt, dass ein vollständiger Einheitstest-Satz idealerweise innerhalb von unter 10 Sekunden, and pre-commit checks should stay unter 5 Sekundenbleiben sollten, laut dieser OpenReplay-Testleitlinie.

Ich betrachte das als Budgetierungstool, nicht als Religion. Wenn sich die meisten Ihrer Anstrengungen auf End-to-End-Tests konzentrieren, warten Ihre Teammitglieder zu lange auf Rückmeldung. Wenn alles nur Einheitstests sind, verpassen Sie realistische Systemgrenzen.

Für eine Capacitor- oder Electron-Anwendung sieht ein gesunder Balance normalerweise so aus:

  • Einheitstests für Preislogik, Berechtigungsregeln, Serialisierung, Aktualisierungsbedingungen, Feature-Flags und Zustandsänderungen
  • Integrations-Tests für Speicherverbindungen, Plugin-Hüllern und IPC-Verträge
  • E2E-Tests für einige kritische Reisezüge wie Login, Kaufablauf, Synchronisierung oder Aktualisierungsanfragen

Der Coverage ist ein Leuchtfeuer, nicht ein Ziel

Coverage-Berichte sind nützlich, wenn sie Ihnen helfen, ungetestete Zweige in wichtigen Logiken zu erkennen. Sie werden schädlich, wenn Teams Coverage-Prozentsätze für ihren eigenen Willen verfolgen.

Ein Login-Validator mit sorgfältigen Edge-Case-Tests liefert mehr Wert als ein abgedeckter Datei voller trivialer Behauptungen. Das ist besonders wahr für input-reiche code wie Formulare, Parser, Datumlogik und Berechtigungsprüfungen. Wenn Ihr Team die Qualität um die Validierung schwerer UI herum schärft, ist diese Anleitung zu der Meisterung der Frontend-Formularvalidierung ein gutes Ergänzung zum unit-level-Teststrategie.

Verhaltens-basierte Tests überstehen Refaktorisierungen

Ein zuverlässiges Suite sollte es dir ermöglichen, interne Strukturen ohne die Hälfte der Tests neu zu schreiben. Der einfachste Weg, um dorthin zu gelangen, ist, zu behaupten verhaltensbeobachtung anstatt Implementierungsdetails.

Verwendungsfälle, die gut funktionieren:

  • Boundary conditions wie leerer Eingabewert, Null-Werte, ungültige Typen und übermäßige Zeichenketten
  • Domänenergebnisse wie „Zugriff verweigert, da die erforderliche Berechtigung fehlt“
  • Zustandsübergänge wie „Markiert Update als ausstehend, nachdem das Download-Metadaten-Validierung abgeschlossen ist“

Verwendungsfälle, die oft verrotten:

  • Internen Hilfsfunktionen überprüfen
  • Private Methode-Sequenzen behaupten
  • Mocken Sie jeden Schichten in der Aufrufkette

Für App-Teams, die disziplinierte Release-Prozesse aufbauen, ist das Artikel von Capgo über die Qualitätssicherung von Apps wirksam, weil es die Testarbeit mit dem breiteren Release-Pipeline verbindet.

Testen für CI, Capacitor, und Electron-Apps

Ein Test, der nur auf einem Entwickler-Computer läuft, ist kein Sicherheitsnetz. Es ist eine lokale Gewohnheit.

CI verwandelt die JavaScript-Einheitstests in Team-Infrastruktur. Jeder Push, Pull-Antrag oder Release-Zweig kann die gleichen Befehle mit den gleichen Erwartungen ausführen. Diese Konsistenz ist noch wichtiger für Capacitor- und Electron-Projekte, bei denen sich die Umgebungsdrift zu subtilen Fehlern verhält.

Machen Sie CI zum Standard- Ausführungspfad

Zumindest sollte Ihre CI die Abhängigkeiten installieren und die Einheitssuite auf jedem Änderungssatz ausführen. Halten Sie den Befehl, wenn möglich, identisch zur lokalen Entwicklung.

Ein grundlegender GitHub-Actions-Arbeitsfluss kann so klein wie das sein:

name: test

on: [push, pull_request]

jobs:
  unit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm test

Das reicht aus, um fehlerhafte Imports, fehlende Behauptungen und zufällige Plattformannahmen vor dem Hineinlaufen in die Hauptversion zu erkennen.

Für mobile Teams, die durch automatisierte Pipelines liefern, hat Capgo eine praktische Anleitung zu Einstellung von CI/CD für Capacitor Anwendungen.

Testen von Capacitor Plugin-Interaktionen

Die falsche Methode, um Capacitor code zu testen, ist, native Plugins direkt in jede Dienstleistung zu pullen. Das verbindet Ihre Test-Suite mit der Plattformbrücke.

Die bessere Muster ist eine dünne Abstraktion:

// deviceStorage.js
async function saveFile(filesystem, path, data) {
  return filesystem.writeFile({ path, data });
}

module.exports = { saveFile };
// draftService.js
async function persistDraft(storage, draft) {
  await storage.save('draft.json', JSON.stringify(draft));
  return { saved: true };
}

module.exports = { persistDraft };
// draftService.test.js
const { persistDraft } = require('./draftService');

test('persists a serialized draft', async () => {
  const storage = {
    save: jest.fn().mockResolvedValue(undefined)
  };

  const result = await persistDraft(storage, { title: 'Hello' });

  expect(result).toEqual({ saved: true });
});

Das gleiche Konzept gilt für die Zugriff auf die Kamera, biometrische Anfragen, die Registrierung von Push-Tokens und den Netzwerkstatus. Halten Sie die Pluginaufrufe in Adapters. Testen Sie die App-Logik gegen Schnittstellen, die Sie kontrollieren.

Testen von Electron-Haupt-Renderer- und IPC code

Elektron-Anwendungen haben zwei wichtige Scharniere: Hauptprozess code und Hauptprozess code. Verschwimmen Sie sie nicht in Tests.

. Lassen Sie sie nicht in den Tests verschwimmen.

  • Renderereinheitstests für View-Modelle, Zustände, Formatierungen und Geschäftslogik auf der UI-Seite
  • Hauptprozess-Einheitstests für Menüs, Dateibearbeitungen und Entscheidungen zum Lebenszyklus der Anwendung
  • IPC-Vertragsprüfungen für die Form der Nachrichten und der erwarteten Antworten

Beispiel für eine IPC-Wrapper:

// ipcGateway.js
function sendSettings(ipcRenderer, payload) {
  ipcRenderer.send('settings:update', payload);
}

module.exports = { sendSettings };
// ipcGateway.test.js
const { sendSettings } = require('./ipcGateway');

test('sends settings update over ipc', () => {
  const ipcRenderer = { send: jest.fn() };

  sendSettings(ipcRenderer, { theme: 'dark' });

  expect(ipcRenderer.send).toHaveBeenCalledWith('settings:update', { theme: 'dark' });
});

If you later change the internal implementation from one helper to another, this test still holds because it verifies the behavior that matters. That’s the standard you want across desktop and mobile code.

Häufig gestellte Fragen zum JavaScript-Einheitstesten

Was ist der Unterschied zwischen Einheitstests und Integrationstests sowie E2E-Tests

A Einheitstest prüft einen kleinen Logik-Teil isoliert. Ein Integrations-Test prüft, ob einige Komponenten oder Dienste korrekt zusammenarbeiten. Ein End-to-End-Test übt eine Benutzerreise durch die laufende Anwendung aus.

Verwenden Sie Einheitstests für schnelles Vertrauen in Geschäftsregeln. Verwenden Sie Integrations-Tests für Scharniere wie Speicher, Plugin-Wrapper und IPC. Verwenden Sie E2E-Tests sparsam für die Workflows, die sich ernsthaft verletzten würden, wenn sie brachen.

Sollten wir uns auf volle Abdeckung richten

Nein. Eine vollständige Abdeckung kann Teams zu Tests mit niedrigem Wert drängen.

Die Abdeckung ist nützlich, wenn sie riskante code offenlegt, die niemand ausprobiert hat. Sie ist nicht nützlich, wenn Ingenieure nur flache Behauptungen hinzufügen, um ein Dashboard zu befriedigen. Wenn Ihr Suite brüchig ist, rettet mehr Abdeckung sie nicht.

Wie fügen wir Tests zu einem bestehenden Codebase hinzu

Beginnen Sie, wo Änderungen bereits stattfinden. Ersticken Sie die Mannschaft nicht und verkünden Sie eine umfassende Überarbeitung der Teststrategie.

Ein praktischer Sequenz sieht wie folgt aus:

  • Schützen Sie aktive code zuerst indem Sie Tests in Modulen hinzufügen, die Sie während der Arbeit an Features oder Bugfixen berühren
  • Entfernen Sie reine Logik aus Dateien, die schwer zu testen sind, damit Geschäftsregeln ohne Framework- oder Laufzeitlärm getestet werden können
  • Fügen Sie Schaltflächen um um native Plugins, Netzwerkclients, Dateisystemaufrufe und Electron-IPC zu umschließen
  • Verweigern Sie anfällige Muster wenn Sie Mocks einführen. Leitfaden aus JavaScript-Testbest Practices ist hier besonders nützlich, da er das oft übersehene Problem der Über-Mockung und die anfälligen Tests, die folgen, hervorhebt

Das Ziel ist nicht sofortige Vollständigkeit, sondern ein kontinuierlicher Fortschritt in den Bereichen, in denen Rückschritte dem Team am meisten Kosten.


Wenn Ihr Team Schiffe Capacitor oder Elektron Apps und benötigt einen sauberen Releaseprozess bei JavaScript-Änderungen, Capgo ist eine Option, die man in Betracht ziehen kann. Es bietet Live-Updates für CapacitorJS- und Elektron-Apps mit Rollout-Kontrollen und -Beobachtbarkeit, so dass Teams soliden Einheitstests mit einer sicheren Möglichkeit zum Versand von Web-Bundle-Änderungen ohne auf jede Korrektur im Store warten zu müssen, kombinieren können.

Live Updates für Capacitor-Apps

Wenn ein Web-Schicht-Bug live ist, schicken Sie die Reparatur über Capgo anstatt Tage zu warten, bis die App-Store-Zulassung genehmigt ist. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Menschliche Unterstützung von Martin

Jetzt loslegen

Neueste von unserem Blog

Capgo gibt Ihnen die besten Einblicke, die Sie benötigen, um ein wirklich professionelles Mobiltelefon-App zu erstellen.