Code Coverage in TypeScript: Die besten Tools und Metriken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Code Coverage in TypeScript: Wie man aufhört zu raten und anfängt zu messen

\n\n

Stellen Sie sich vor, Sie bauen einen komplexen Mechanismus mit vielen Zahnrädern. Sie sind sicher, alles richtig zusammengebaut zu haben, aber sobald Sie den Startknopf drücken, ertönt ein Knirschen und der Mechanismus blockiert. Eine vertraute Situation? In der Welt der TypeScript-Entwicklung sind solche „Mechanismen“ unsere Anwendungen. Und Code Coverage ist die Kontrollmontage, die zeigt, welche Teile wir überprüft haben und welche wir dem Zufall überlassen haben.

\n\n

Viele Entwickler stehen Metriken zur Code Coverage skeptisch gegenüber: „Die Jagd nach Prozenten ist böse“, „100% Coverage garantiert keine fehlerfreie Software“. Und das stimmt. Aber wie jedes Werkzeug kann Code Coverage nützlich oder schädlich sein – alles hängt davon ab, wie man es einsetzt. In diesem Artikel werden wir untersuchen, wie man Coverage in TypeScript richtig misst, welche Tools es dafür gibt und wie man Metriken nicht zum Selbstzweck macht.

\n\n

Was ist Code Coverage und warum TypeScript keine Ausnahme ist

\n\n

Code Coverage ist eine Metrik, die angibt, welcher Teil des Quellcodes während der Tests ausgeführt wurde. In TypeScript, das nach JavaScript kompiliert wird, erfolgt die Coverage-Messung auf der Ebene des kompilierten Codes, aber moderne Tools können die Ergebnisse schön in Begriffen des ursprünglichen TS-Codes darstellen.

\n\n

Die wichtigsten Coverage-Metriken, die Sie kennen sollten:

\n\n
    \n
  • Line coverage – Prozentsatz der Codezeilen, die mindestens einmal ausgeführt wurden.
  • \n
  • Branch coverage – Prozentsatz der Verzweigungen (if/else, switch, ternäre Operatoren), die getestet wurden.
  • \n
  • Function coverage – Prozentsatz der Funktionen/Methoden, die aufgerufen wurden.
  • \n
  • Statement coverage – Prozentsatz der einzelnen Anweisungen (Operatoren) im Code.
  • \n
\n\n

Für TypeScript-Projekte ist besonders die Branch coverage wichtig, da die strenge Typisierung nicht vor logischen Fehlern in Bedingungen schützt. Sie können alle Variablen korrekt typisieren, aber den Fall vergessen, dass ein Array leer ist, während eine Funktion mindestens ein Element erwartet.

\n\n

Tools zur Messung der Code Coverage in TypeScript

\n\n

1. Istanbul (nyc) – der Urvater aller Coverage-Tools

\n\n

Istanbul ist das beliebteste Tool zur Messung der Code Coverage von JavaScript- und TypeScript-Code. Es funktioniert als eigenständiges Dienstprogramm (über das Paket nyc) oder als integriertes Modul in Test-Frameworks.

\n\n

Um mit Istanbul in einem TypeScript-Projekt zu beginnen, installieren Sie:

\n\n
npm install --save-dev nyc typescript ts-node
\n\n

Erstellen Sie eine Konfigurationsdatei .nycrc:

\n\n
{\n  "extends": "@istanbuljs/nyc-config-typescript",\n  "all": true,\n  "include": ["src/**/*.ts"],\n  "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"],\n  "reporter": ["text", "html", "lcov"],\n  "check-coverage": true,\n  "branches": 80,\n  "lines": 85,\n  "functions": 85,\n  "statements": 85\n}
\n\n

Tests mit Coverage ausführen:

\n\n
npx nyc mocha --require ts-node/register src/**/*.test.ts
\n\n

Istanbul generiert Berichte in der Konsole (text) und als HTML-Seiten, auf denen abgedeckter Code grün und nicht abgedeckter Code rot hervorgehoben wird. Das ist sehr anschaulich.

\n\n

2. Jest – alles in einem

\n\n

Jest ist das beliebteste Test-Framework für TypeScript. Es enthält bereits ein integriertes Coverage-Tool basierend auf Istanbul. Sie müssen nichts zusätzlich installieren.

\n\n

Grundlegende Konfiguration in jest.config.ts:

\n\n
import type { Config } from 'jest';\n\nconst config: Config = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n  collectCoverage: true,\n  coverageDirectory: 'coverage',\n  coverageReporters: ['text', 'html', 'lcov'],\n  collectCoverageFrom: [\n    'src/**/*.ts',\n    '!src/**/*.test.ts',\n    '!src/**/*.spec.ts',\n    '!src/types/**/*.ts'\n  ],\n  coverageThresho                

Blogs

Buchempfehlungen