Component Testing

Testing Library

Testing Library hilft Ihnen dabei, Komponenten so zu testen, wie ein Benutzer sie erlebt. Suchen Sie nach Rollen und Texten, interagieren Sie mit echten Events und hören Sie auf, Implementierungsdetails zu testen.

intermediate13 min readUpdated 15. Sept. 2026
Button.test.jsx
jsx
// Button.test.jsx
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { Button } from "./Button";

test("calls onClick when clicked", async () => {
  const onClick = vi.fn();
  render(<Button onClick={onClick}>Save</Button>);

  await userEvent.click(screen.getByRole("button", { name: "Save" }));

  expect(onClick).toHaveBeenCalledOnce();
});
Gewartet von
Dem Testing Library Team
Frameworks
React, Vue, Svelte, Angular
Queries
Nach Rolle, Label und Text
Events
userEvent
Async
findBy, waitFor
Philosophie
Die User Experience testen

Warum es wichtig ist

Warum Testing Library Komponententests verändert hat

Standardmäßig barrierefrei

Die Abfrage nach Rolle und zugreifbarem Namen führt Sie zu einem semantischen, Screenreader-freundlichen Markup.

Resistent gegen Refactorings

Tests, die die Sicht des Benutzers auf die Seite nutzen, überstehen interne Änderungen an Komponenten und dem State.

Funktioniert mit jedem Runner

Testing Library ist Runner-agnostisch und lässt sich gleichermaßen gut mit Vitest, Jest oder einem anderen Framework kombinieren.

Das Gesamtbild

Die drei Grundideen hinter Testing Library

Fragen Sie den DOM so ab, wie Benutzer Dinge finden, interagieren Sie mit echten Events und prüfen Sie, was der Benutzer sieht.

Queries

Finden

Lokalisieren Sie Elemente anhand ihrer Rolle, ihres Labels, ihres Textes oder anderer für den Benutzer sichtbarer Attribute.

userEvent

Interagieren

Simulieren Sie echte Benutzerinteraktionen wie Tippen, Klicken und Tabben.

Assertions

Verifizieren

Prüfen Sie, was der Benutzer sieht, mithilfe von jest-dom Matchern für den DOM-Zustand.

Testing Library auf einen Blick

Der Kern von Testing Library

getByRole

Die bevorzugte Query, die nachahmt, wie assistive Technologien Elemente finden.

getByLabelText

Finden Sie Formularsteuerelemente über ihr zugehöriges Label, genau wie Benutzer es tun.

getByText

Lokalisieren Sie Elemente anhand ihres sichtbaren Textinhalts.

userEvent

Lösen Sie realistische Events aus, einschließlich Fokus, Tippen und Tastaturinteraktionen.

findBy und waitFor

Warten Sie darauf, dass Elemente erscheinen, wenn Updates asynchron erfolgen.

jest-dom Matcher

toBeInTheDocument, toHaveTextContent, toBeDisabled und mehr.

Eine kurze Geschichte

Von Enzyme zu benutzerzentrierten Tests

  1. 2018

    React Testing Library

    Kent C. Dodds veröffentlicht eine kleine Library, die Komponenten über den DOM testet.

    18
  2. 2019

    Die Testing Library Familie

    Der Kern wird extrahiert und Adapter für Vue, Svelte, Angular und andere erscheinen.

    19
  3. 2021

    userEvent reift

    userEvent wird zur empfohlenen Methode, um Interaktionen zu simulieren.

    21
  4. 2022

    Enzyme veraltet

    Der Ansatz, Implementierungsdetails zu testen, schwindet und benutzerzentriertes Testen wird zur Norm.

    22
  5. Heute

    Der Standard

    Testing Library ist der Standardansatz für Komponententests über Framework-Grenzen hinweg.

    Heute

Der vollständige Leitfaden

Testing Library: Alles was Sie wissen müssen

Was ist Testing Library?

Testing Library ist eine Familie von Bibliotheken, die dir dabei helfen, UI-Komponenten so zu testen, wie ein Nutzer sie erlebt. Anstatt auf die internen Details einer Komponente zuzugreifen, renderst du sie, findest Elemente so, wie es ein Mensch tun würde – anhand ihrer Rolle, ihres Labels oder des sichtbaren Textes – und interagierst mit ihnen über realistische Events.

Die Kernidee ist eine Reaktion auf das Testen von Implementierungsdetails. Ältere Ansätze renderten eine Komponente und prüften dann den internen State, Props oder eine spezifische DOM-Struktur. Solche Tests brachen bei jedem Refactoring zusammen, während sie nur sehr wenige echte Bugs fanden. Testing Library dreht die Perspektive um: Wenn der Nutzer es sehen und benutzen kann, kannst du es testen – und der Test überlebt Änderungen an der internen Funktionsweise der Komponente.

Rendering und Querying

Du renderst eine Komponente und fragst anschließend das resultierende DOM über screen ab.

// LoginForm.test.jsx
import { render, screen } from "@testing-library/react";
import { LoginForm } from "./LoginForm";

test("shows the email field", () => {
  render(<LoginForm />);

  expect(screen.getByLabelText("Email")).toBeInTheDocument();
  expect(screen.getByRole("button", { name: "Sign in" })).toBeInTheDocument();
});

screen ist die empfohlene Query-Oberfläche. Sie durchsucht das gesamte gerenderte Dokument, was eher widerspiegelt, wie ein Nutzer die Seite wahrnimmt, anstatt nur einen bestimmten Container zu betrachten.

Die richtige Query auswählen

Testing Library bietet viele Queries an, wobei die Reihenfolge entscheidend ist. Bevorzuge diejenigen, die am nächsten an der Perspektive des Nutzers liegen:

  1. getByRole — Buttons, Links, Überschriften, Inputs und mehr, gematcht über den accessible name. Dies ist der beste Standard.
  2. getByLabelText — Formularsteuerungen, die über ihr Label gefunden werden.
  3. getByPlaceholderText — wenn ein Placeholder das einzige verfügbare Label ist.
  4. getByText — nicht-interaktive Textinhalte.
  5. getByDisplayValue — der aktuelle Wert eines Formularelements.
  6. getByAltText — Bilder über ihren Alt-Text.
  7. getByTitle und getByTestId — als letzte Auswege.
// queries.jsx
screen.getByRole("heading", { level: 1, name: "Dashboard" });
screen.getByLabelText("Password");
screen.getByText("Welcome back");
screen.getByAltText("Company logo");
screen.getByTestId("chart");

getByRole ist besonders leistungsfähig, da es gleichzeitig als Accessibility-Check dient. Wenn ein Element keinen accessible name hat, schlägt die Query fehl – was bedeutet, dass dein Markup wahrscheinlich ebenfalls nicht barrierefrei ist.

Jede Query hat verschiedene Varianten: getBy wirft einen Fehler, wenn nichts matcht, queryBy gibt null zurück und findBy gibt ein Promise zurück, das wartet. Nutze queryBy, um zu prüfen, ob etwas nicht vorhanden ist, und findBy nach einem asynchronen Update.

Interaktion mit userEvent

userEvent simuliert die vollständige Ereignissequenz, die ein echter Benutzer auslöst.

// Search.test.jsx
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { Search } from "./Search";

test("submits the query", async () => {
  const onSearch = vi.fn();
  render(<Search onSearch={onSearch} />);

  await userEvent.type(screen.getByLabelText("Search"), "vitest");
  await userEvent.click(screen.getByRole("button", { name: "Go" }));

  expect(onSearch).toHaveBeenCalledWith("vitest");
});

userEvent verarbeitet Fokus-, Tastatur- und Pointer-Events gemeinsam, wodurch Bugs gefunden werden, die ein einzelnes fireEvent.change übersehen würde. Bevorzuge es für alles, außer in den seltenen Fällen, in denen es nicht ausreicht.

Asynchrones Verhalten

Die meisten Komponenten aktualisieren sich asynchron, sei es durch einen fetch, einen Timer oder eine Transition. Verwenden Sie findBy und waitFor anstelle von willkürlichen Verzögerungen.

// Users.test.jsx
test("renders users after loading", async () => {
  render(<Users />);

  expect(screen.getByText("Loading…")).toBeInTheDocument();

  const items = await screen.findAllByRole("listitem");
  expect(items).toHaveLength(3);
});

findBy wartet auf ein passendes Element und schlägt mit einer hilfreichen Fehlermeldung fehl, falls dieses nie erscheint. waitFor wird verwendet, um auf eine Assertion oder eine Bedingung zu warten, die keine einfache Elementsuche ist. Verwenden Sie niemals echte Timeouts; diese machen Tests langsam und instabil.

Assertions mit jest-dom

Das begleitende @testing-library/jest-dom Paket fügt Matcher hinzu, die den DOM-Zustand auf natürliche Weise beschreiben.

// matchers.test.jsx
expect(button).toBeDisabled();
expect(input).toHaveValue("[email protected]");
expect(dialog).not.toBeInTheDocument();
expect(heading).toHaveTextContent("Dashboard");
expect(link).toHaveAttribute("href", "/docs");

Diese Matcher machen die Absicht deutlicher als reine Prüfungen von DOM-Properties und liefern bessere Fehlermeldungen.

Accessibility-first Testing

Da getByRole auf zugängliche Rollen und Namen setzt, werden Barrierefreiheit-Probleme durch diese Art des Testens frühzeitig aufgedeckt. Wenn Sie einen Button nicht über seine Rolle finden können, können das Screenreader-Nutzer ebenfalls nicht. Das Hinzufügen von getByRole und toHaveAccessibleName zu Ihren Tests ist einer der effizientesten Wege, um die Barrierefreiheit zu verbessern, und ersetzt oft die Notwendigkeit eines separaten automatisierten Audits.

Testing Library über Frameworks hinweg

Die Library bietet Adapter für React, Vue, Svelte, Angular und weitere. Die Query-API ist identisch, sodass das mentale Modell übertragbar bleibt, selbst wenn sich das Setup unterscheidet. Der React-Adapter ist am weitesten verbreitet und wird hier beispielhaft gezeigt.

Best Practices

  • Suchen Sie zuerst nach der Rolle, dann nach dem Label und schließlich nach dem Text; verwenden Sie Test-IDs nur als letzten Ausweg.
  • Verwenden Sie userEvent anstelle von fireEvent.
  • Nutzen Sie await für findBy und waitFor, anstatt feste Verzögerungen (Delays) einzubauen.
  • Prüfen Sie das, was der Benutzer sieht, und nicht den internen Zustand.
  • Halten Sie Tests fokussiert auf jeweils ein einziges Verhalten.
  • Bereinigen Sie die Umgebung automatisch zwischen den Tests; Testing Library erledigt dies standardmäßig.
  • Betrachten Sie ein fehlgeschlagenes getByRole als Hinweis auf ein Accessibility-Problem.

Häufige Fehler

  • Die Nutzung von container.querySelector und das Testen von Klassennamen.
  • Die Verwendung von fireEvent, wenn userEvent mehr abdecken würde.
  • Willkürliche setTimeout-Wartezeiten anstelle von findBy.
  • Snapshots des gesamten gerenderten Trees.
  • Assertions auf dem Component-State oder den Props anstatt auf dem DOM.
  • Test-IDs an jedem Element hinzufügen und dadurch die Vorteile der Accessibility verlieren.

Wie geht es weiter?

Testing Library ist die Komponentenebene einer soliden Teststrategie. Nutzen Sie sie zusammen mit Vitest oder Jest, vertiefen Sie Ihr React-Wissen, um Komponenten testbar zu gestalten, und decken Sie vollständige User Journeys mit Playwright ab. Nehmen Sie sich anschließend eine bereits bestehende Komponente vor und schreiben Sie einen Test aus der Perspektive des Nutzers.

Ein Element finden

Nutzen Sie die Query nach Rolle, damit der Test mit der Art übereinstimmt, wie ein Benutzer und assistive Technologien das Steuerelement finden, und fehlschlägt, wenn es nicht barrierefrei ist.

Bevorzugt
const button = screen.getByRole("button", {
  name: "Save",
});
Vermeiden
const button = container.querySelector(
  ".btn.btn-primary",
);

Interaktion simulieren

userEvent löst die vollständige Sequenz von Events aus, die ein echter Benutzer erzeugt, einschließlich Fokus und Tastaturverhalten.

Bevorzugt
await userEvent.type(
  screen.getByLabelText("Email"),
  "[email protected]",
);
Vermeiden
fireEvent.change(
  screen.getByLabelText("Email"),
  { target: { value: "[email protected]" } },
);

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Testing Library zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Testing Library — mit Quizzen und echtem Code, den Sie im Browser ausführen können.