__CAPGO_KEEP_0__ Startseite

Einführung in die Einheitstests für JavaScript: Umfassende Anleitung 2026

Master unit tests javascript with our 2026 guide. Covers Jest, Mocha, setup, mocking, CI, and tips for Capacitor & Electron apps.

Einführung in die Einheitstests für JavaScript: Umfassende Anleitung 2026

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 und Electron Anwendungen. Ein einfaches Feature kann gemeinsame Geschäftslogik, Browser-APIs, native Plugins, lokale Dateien, IPC und Remote-Dienste in einem Flow berühren. Wenn Sie diese Teile falsch testen, wird Ihr Suite zu einem Labyrinth aus fiktiven Abhängigkeiten. Wenn Sie sie richtig testen, erhalten Sie schnelles Feedback auf die Logik, die bricht.

Ein guter Einheitstest funktioniert nicht mit cleverer Matcher-Syntax. Es beginnt 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.

Inhaltsübersicht

Wählen Sie Ihren JavaScript-Testframework

Ein professionelles JavaScript-Projekt benötigt einen echten Testrunner. Ad-hoc-Skripte und manuelle Konsolenprüfungen schalen nicht, wenn mehrere Ingenieure an demselben 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 immer wieder auf eine kleine Anzahl von Mainstream-Optionen. Jest, Mocha und Jasmine sind wiederholt als Hauptframeworks hervorgehoben, mit Jest oft als integrierte Teststruktur, Assertions, Mocking und Unterstützung für asynche Operationen in einem Paket hervorgehoben, wie in diesem Pluralsight-Labor für JavaScript-Tests.

Ein Vergleichsdiagramm, das beliebte JavaScript-Testframeworks wie Jest, Mocha, Cypress und Playwright zeigt

Warum 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 Ihnen eine gemeinsame Sprache:

  • Teststruktur mit describe oder test Assertions it
  • mit lesbarer Vergleichsmatcher with
  • Hooks zur Einrichtung und Demontage
  • Asynchrone Unterstützung zur Unterstützung von Versprechungen und Zeitern
  • Werkzeuge zum Mocken zur Unterstützung externer Abhängigkeiten

Wenn Ihr Team auch einen umfassenderen Überblick über die Automatisierung von Tests benötigt, der über die Einheitstests hinausgeht, hat Capgo eine nützliche Übersicht über automatisierte Tests in Lieferflüssen von Anwendungen.

Jest vs Mocha im Überblick

Jest und Mocha vertreten zwei unterschiedliche Philosophien.

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

Funktion Jest Mocha
Setup-Komplexität Niedriger für die meisten Teams Höher, da Sie normalerweise Assertion- und Mocking-Bibliotheken hinzufügen
Ansprüche Inbegriffen Normalerweise mit einer anderen Bibliothek kombiniert
Mocking Eingebaut Häufig mit einer anderen Bibliothek kombiniert
Asynchrones Testen Eingebaut und direkt 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 Konsistenz wollen Legacy-Stacks, Teams, die modularen Kontrol haben wollen

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

Was ich für die meisten Teams empfehle

Für die meisten modernen Projekte würde ich wählen Jest nichtsdestotrotz, wenn das Codebase bereits starke Gründe hat, auf Mocha zu bleiben. Diese Empfehlung wird stärker, wenn die Anwendung Capacitor Da diese Projekte bereits genug bewegliche Teile haben. Die Reduzierung des Testwerkzeugspralls zahlt sich schnell aus. Mocha macht noch immer Sinn in älteren Node.js-Diensten oder langlebigen Codebases, wo das Ecosystem um es bereits abgeschlossen ist. Aber für einen mittelständischen Ingenieur, der von vorneherein eine robuste Suite einrichtet, entfernt Jest normalerweise mehr Hindernisse als es schafft.Ein wichtiger Umfangsvermerk. Cypress und Playwright sind ausgezeichnete Werkzeuge, aber sie lösen ein anderes Problem. Sie sind besser für Browser-Ebene- und End-to-End-Überprüfungen, nicht für die schnelle innere Schleife, wo die Einheitstests JavaScript arbeiten sollten.

Projektsetup und Ihre erste Einheitstest

Live-Updates-Plattform Electron

Live-Updates-LTS-Electron

Aufrechterhaltung einer sauberen Testumgebung sollte langweilig sein. Wenn die Hinzufügung des ersten Tests kompliziert erscheint, wird die Suite wahrscheinlich nicht gesund bleiben.

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

Einfache Jest-Einrichtung

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

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

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

Wenn Sie ein lokales Capacitor-Projekt erstellen und Ihre Entwicklungs-Umgebung in Ordnung bringen möchten, bevor Sie Tests um die gemeinsam verwendete Logik herum schreiben, ist Capgo's Anleitung zur Einrichtung eines lokalen Capacitor-Umgebungs Schreiben Sie den Test vor der __CAPGO_KEEP_0__

Write the test before the code

Die Test-erst-Praxis ist nicht nur eine persönliche Vorliebe. Die U.S. Consumer Financial Protection Bureau empfiehlt in ihrer JavaScript-Richtlinie ausdrücklich, den Test zuerst zu schreiben Die Test-erst-Praxis ist nicht nur eine persönliche Vorliebe. Die U.S. Consumer Financial Protection Bureau empfiehlt in ihrer JavaScript-Richtlinie ausdrücklich, den Test zuerst zu schreiben, Testorganisation mit describe und it, und die Definition von Kontrollen um expect(...) Ansprüche in seiner JavaScript-Einheitstestleitfaden.

Dies ist wichtig, weil testgetriebene Änderungen die Art und Weise ändern, wie Sie code. Funktionen gestalten. Funktionen werden kleiner, Abhängigkeiten werden sichtbarer, und Nebeneffekte stoppen, sie zu logik zu verunreinigen, die rein bleiben sollte.

Hier ist ein Minimalbeispiel:

// 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);
  });
});

Verwenden Sie Arrange Act Assert immer

Das Arrange, Act, Assert Muster hält Tests lesbar, selbst wenn sie komplexer werden.

  1. Arrange Die Eingabe und jede erforderliche Einrichtung.
  2. Handeln Durch Aufrufen der Funktion.
  3. Behaupten Auf das Ergebnis.

Angewendet auf einen Validierungs-Helfer:

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.

For Capacitor and Electron projects, that discipline matters more because your pure logic often sits next to native or desktop integration code. Keep the business rule testable without the platform runtime, and your first test won’t be your last useful one.

Mastering Mocks and Asynchronous Code

Most bugs in application code don’t come from adding two numbers. They come from code that reaches outside itself: network requests, files, plugin APIs, timers, IPC channels, storage layers.

That’s where mocking helps. It gives you control over the boundary so the test can focus on your code’s decision-making.

Ein weißes Brett-Diagramm, das eine Microservices-Architektur mit APIs, Datenbanken, externen Diensten und event-getriebenen Datenflüssen illustriert.

Mock-Grenzen, nicht alles

Leitfaden für wartbare Tests betont Einzelschritt-Abdeckung und Eine starke Behauptung pro Test, und es warnt auch davor, Mocks übermäßig zu verwenden, was Tests brüchig und eng an Implementierungsdetails gekoppelt macht, wie in diesem Artikel von TestRail über wartbare Einheitstests.

Dass Warnung zählt sehr viel in JavaScript. Teams beginnen oft damit, jeden importierten Modul zu mocken und landen letztendlich bei der Überprüfung, ob Funktionen andere Funktionen in der richtigen Reihenfolge aufrufen, anstatt das echte Verhalten zu testen.

Schlechter Zielwert für einen Mock-lastigen Test:

  • ob Hilfsfunktion A Helper B aufgerufen hat
  • ob Dienst C Serializer D aufgerufen hat
  • ob eine interne private Funktion zweimal aufgerufen wurde

Bessere Zielgruppe:

  • was die Funktion zurückgegeben hat
  • ob es eine fehlgeschlagene Abhängigkeit richtig behandelt hat
  • ob es die Daten in die erwartete Form umgewandelt hat

Ein besseres Muster für Capacitor und Electron code

Bei mobilen und Desktop-Anwendungen bevorzuge ich eine Wrapper-Schicht um native oder Plattform-APIs herum. Dann testen die Einheitstests die Wrapper-Schicht, 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 ipcRendererDateizugriff oder Shell-Integrationen hinter einer dünnen Adapter-Schicht. 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 zu dem Testen von Capacitor-OTA-Updates mit Mock-Szenarien.

Ein schneller Überblick hilft, wenn Ihr Team noch normalisiert, wie Sie Asynchrone Test-Style ausführen.

Testen von asynchronen Fluss ohne Flakiness

Verwenden Sie async/await bei Tests, wenn das code unter Test in einer Versprechen zurückgegeben wird. 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');
});

Auch testen Sie 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 hässlichen Pfad. In der Produktion ist der hässliche Pfad meistens der, den die Benutzer merken.

Fortgeschrittene Strategien für Robuste Tests

Eine Testsuite wird nützlich, wenn sie nach dem code-Wechsel noch nützlich ist. Das ist schwieriger als das Schreiben einer Menge von Tests, die laufen.

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

Verwenden Sie den Test-Split als Budget

Eine praktische Anleitung empfiehlt eine 70/20/10 Zuweisung über Einheiten-, Integrations- und End-to-End-Tests, mit Einheitstests, die das schnellste Feedback und die stabilsten Fehler liefern. Die gleiche Anleitung sagt, dass ein vollständiger Einheitstest-Satz idealerweise in unter 10 Sekundenabgeschlossen sein sollte, und die Prüfung vor dem Commit sollte in unter 5 Sekundenbleiben. Gemäß dieser Offenen Replays-Testanleitung.

behandele ich das als Budgetierungstool, nicht als Religion. Wenn sich die meisten Ihrer Anstrengungen auf End-to-End-Tests konzentrieren, werden Ihre Teammitglieder zu lange auf Feedback warten. Wenn alles nur Einheitstests sind, werden Sie die realen Systemgrenzen verpassen.

For a Capacitor or Electron app, a healthy balance usually looks like this:

  • Capgo oder Electron-Anwendung sieht ein gesunder Ausgleich normalerweise so aus:
  • Einheitstests für Preislogik, Berechtigungsregeln, Serialisierung, Aktualisierungsbedingungen, Feature-Flags und Zustandsänderungen. Integrationstests für Speicherverbindungen, Plugin-Wrapper und IPC-Verträge.
  • E2E-Tests für einige kritische Reiserouten wie Login, Kaufablauf, Synchronisierung oder Aktualisierungsanfragen

Abdeckung ist ein Leuchtfeuer, kein Ziel

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

Ein Login-Validator mit sorgfältigen Tests für Randfälle liefert mehr Wert als ein abgedeckter Datei voller trivialer Behauptungen. Das ist besonders wahr für inputreiche code wie Formulare, Parser, Datumlogik und Berechtigungsprüfungen. Wenn Ihr Team die Qualität um die Validierung schwerpunkthafter UI herum schraubt, ist diese Anleitung zum code Mastering Frontend-Formularvalidierung ist eine gute Ergänzung zur unit-level-Teststrategie.

Verhaltens-basierte Tests überleben Refaktorisierungen

Ein zuverlässiges Suite sollte es Ihnen ermöglichen, interne Änderungen ohne die Hälfte der Tests neu zu schreiben. Der einfachste Weg, um dorthin zu gelangen, ist, das beobachtbare Verhalten anstatt Implementierungsdetails zu behaupten. Verwendungsfälle, die gut halten:

Behauptungen über beobachtbares Verhalten anstatt Implementierungsdetails zu machen.

  • Randbedingungen wie leerer Eingabewert, NULL-artige Werte, ungültige Typen und überdimensionale Zeichenfolgen
  • Ausgänge im Domänenbereich wie z.B. ‘Zugriff verweigert wegen fehlender Berechtigung’
  • Zustandsübergänge wie z.B. ‘Update als ausstehend markiert nach Validierung des Download-Metadaten’

Verwendungsfälle, die oft verrotten:

  • Internen Hilfsfunktionen untersuchen
  • Private Methodensequenzierung behaupten
  • Jede Schicht in der Aufrufkette mocken

Für App-Teams, die disziplinierte Release-Prozesse aufbauen, Capgo’s Artikel über Anwendungsqualitätssicherung ist nützlich, weil es die Testarbeit mit der breiteren Releasepipeline 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 wandelt die JavaScript-Einheitstests in Team-Infrastruktur um. Jeder Push, Pull-Antrag oder Releasezweig kann die gleichen Befehle mit denselben Erwartungen ausführen. Diese Konsistenz ist noch wichtiger für Capacitor- und Electron-Projekte, bei denen sich die Umgebungsdrift zu subtilen Fehlern verhält.

Stelle CI als Standardausführungspfad ein

Zumindest sollte Ihre CI die Abhängigkeiten installieren und die Einheitssuite auf jedem Änderungssatz ausführen. Halte den Befehl so weit wie möglich identisch mit der lokalen Entwicklung.

Ein grundlegender GitHub-Actions-Auftrag kann so klein wie folgt 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

Dadurch können Sie bereits gebrochene Importe, fehlende Anforderungen und zufällige Plattformannahmen vor der Veröffentlichung erkennen.

Für mobile Teams, die durch automatisierte Pipelines liefern, hat Capgo eine praktische Anleitung zum Einrichten von CI/CD für Capacitor-Apps.

Testen von Capacitor-Plugininteraktionen

Die falsche Art, Capacitor-code zu testen, ist, native Plugins direkt in jede Dienstleistung zu pullen. Das koppelt Ihre Testsuite an die Plattformbrücke.

Bessere Muster sind dünne Abstraktionen:

// 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 Aufrufe von Plugins in Adapters. Testen Sie die Anwendungslogik gegen Schnittstellen, die Sie kontrollieren.

Testen Sie den Electron-Hauptrenderer und IPC code

Elektron-Apps haben zwei wichtige Scharniere: Hauptprozess code und Renderprozess code. Lassen Sie sie in Tests nicht verschwimmen.

Ein zuverlässiger Aufbau trennt normalerweise:

  • Elektron-Renderer-Einheitstests zur Sichtbarkeit von Modellen, Zustand, Formatierung und Geschäftslogik auf der Benutzeroberfläche
  • Hauptprozess-Einheitstests für Menüs, Dateioperationen und Entscheidungen zum Lebenszyklus der App
  • Tests für den IPC-Vertrag für die Form der Nachrichten und die erwarteten Antworten

Beispiel für einen 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' });
});

Wenn Sie später die interne Implementierung von einem Helper zu einem anderen ändern, hält sich dieser Test noch immer, da er die verhaltensrelevanten Aspekte überprüft. Das ist der Standard, den Sie für Desktop- und Mobilgeräte wollen code.

Häufig gestellte Fragen zu JavaScript-Einheitstests

Was ist der Unterschied zwischen Einheitstests und Integrationstests

A Einheitstest überprüft einen kleinen Teil der Logik in Isolation. Ein Integrationstest überprüft, ob einige Komponenten oder Dienste korrekt zusammenarbeiten. End-to-End-Test Übt eine Benutzerreise durch das laufende Anwendungsprogramm aus.

Verwenden Sie Einheitstests für schnelle Vertrauen in Geschäftsregeln. Verwenden Sie Integrationstests für Nahtstellen wie Speicher, Plugin-Wrapper und IPC. Verwenden Sie E2E-Tests sparsam für die Workflows, die ernsthafte Schäden verursachen würden, wenn sie zusammenbrechen.

Sollten wir uns auf eine vollständige Abdeckung konzentrieren?

Nein. Eine vollständige Abdeckung kann Teams dazu bringen, sich auf niedrigwertige Tests zu konzentrieren.

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 anfällig ist, wird mehr Abdeckung es nicht retten.

Wie fügen wir Tests zu einem bestehenden Codebase hinzu?

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

Ein praktischer Sequenz sieht wie folgt aus:

  • Schützen Sie aktive code zuerst indem Sie Tests zu Modulen hinzufügen, die Sie während der Feature-Arbeit oder bei Bug-Fixes berühren
  • Entfernen Sie reine Logik von schwer zu testenden Dateien, damit Geschäftsregeln ohne Framework- oder Laufzeitlärm getestet werden können
  • Add seam wrappers um native Plugins, Netzwerkclients, Dateisystemaufrufe und Electron-IPC umzugehen
  • Brittlenessmuster weigern Sie sich, wenn Sie Mocks einführen. Leitfaden zu den besten Praktiken für JavaScript-Tests ist hier besonders nützlich, da er das oft übersehene Problem der Über-Mockung und die daraus folgenden brüchigen Tests hervorhebt

Das Ziel ist nicht die sofortige Vollständigkeit. Es ist ein stetiger Fortschritt in den Bereichen, in denen Rückschritte dem Team am meisten kosten


Wenn Ihr Team Capacitor oder Elektronik Apps und benötigt einen sauberen Releaseprozess für JavaScript-Änderungen, Capgo CapacitorJS und Electron-Apps bieten live Updates an, mit Rollout-Kontrollen und Beobachtbarkeit, so dass Teams solide Einheitstests mit einer sicheren Route zum Versand von Web-Bundle-Änderungen ohne auf jede Korrektur im Store warten zu müssen,

Live-Updates für Capacitor-Apps

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

Menschliche Unterstützung von Martin

Los geht's jetzt

Neueste Beiträge aus unserem Blog

Capgo bietet Ihnen die besten Einblicke, die Sie benötigen, um eine wirklich professionelle Mobilanwendung zu erstellen.