Co to robi: Symuluje środowisko przeglądarki (DOM, window, document)
Dlaczego: Twoje komponenty React potrzebują DOM
Alternatywa: happy-dom (szybszy, ale mniej kompatybilny) - zostań przy jsdom
Co to robi: Możesz pisać describe, it, expect bez importów
Przykład:
// Bez globals:
import { describe, it, expect } from "vitest";
// Z globals (prostsze!):
describe("MyComponent", () => {
it("should render", () => {
expect(true).toBe(true);
});
});Co to robi: Uruchamia ten plik przed wszystkimi testami Co jest w środku:
@testing-library/jest-dom(matchery jaktoBeInTheDocument())- Mocki Next.js (
useRouter,usePathname, itp.) - Mocki next-intl, next-themes
- MSW (Mock Service Worker) setup
Co to robi: Nie failuje gdy importujesz CSS w komponentach Przykład:
// Bez css: true → ERROR
import "./Button.css";
// Z css: true → OK ✅
import "./Button.css";Co to robi:
text- pokazuje wyniki w terminaluhtml- generuje stronę HTML wcoverage/index.html
Usunięte: json i lcov (niepotrzebne bez CI/CD)
Co to robi: Minimalny % pokrycia kodu Zmienione z 70% na 60% - łatwiej na początek
4 typy pokrycia:
- lines: % linii kodu które zostały uruchomione
- functions: % funkcji które zostały wywołane
- branches: % ścieżek (if/else) które zostały przetestowane
- statements: % instrukcji które zostały wykonane
Co się stanie jak spadnie poniżej 60%?
npm run test:coverage
# ERROR: Coverage threshold not met!Co to robi: Te pliki nie liczą się do pokrycia Co wykluczamy:
src/test/- same testy**/*.config.*- pliki konfiguracyjne (vitest.config.ts, itp.)src/db/database.types.ts- auto-generowane przez Supabasesrc/middleware.ts- middleware Next.js (trudne do testowania)
Co to robi: Możesz pisać @/components zamiast ../../../components
Przykład:
// Zamiast:
import { Button } from "../../../components/ui/Button";
// Piszesz:
import { Button } from "@/components/ui/Button";# Watch mode (rekomendowane podczas developmentu)
npm run test
# Uruchom raz (dla CI lub szybkiego checku)
npm run test:run
# Z UI (najlepsze do debugowania!)
npm run test:ui
# Z pokryciem kodu
npm run test:coverage
# Otwórz: coverage/index.html// src/components/Button.test.tsx
import { render, screen } from '@testing-library/react';
import { Button } from './Button';
describe('Button', () => {
it('should render text', () => {
render(<Button>Click me</Button>);
expect(screen.getByText('Click me')).toBeInTheDocument();
});
});npm run test
# Vitest automatycznie znajdzie *.test.tsxnpm run testVitest automatycznie uruchomi testy gdy zapiszesz plik!
npm run test:uiZobaczysz GUI z:
- Listą wszystkich testów
- Wynikami w czasie rzeczywistym
- Stack traces
- Console logi
# Tylko testy z "Button" w nazwie
npm run test -- Button
# Tylko konkretny plik
npm run test -- src/components/Button.test.tsxZacznij od pisania testów, coverage przyjdzie z czasem.
Kiedy sprawdzać coverage:
- Przed mergem do main
- Co jakiś czas, żeby zobaczyć progress
npm run test:coverage
# Otwórz coverage/index.html
# Zobaczysz które linie NIE są pokryte (czerwone)src/
components/
Button.tsx
Button.test.tsx ✅
describe("Button", () => {
describe("when disabled", () => {
it("should not call onClick", () => {
// test
});
});
describe("when enabled", () => {
it("should call onClick", () => {
// test
});
});
});// ❌ Źle
it("works", () => {});
// ✅ Dobrze
it("should call onClick when button is clicked", () => {});Nie pisz testów tylko po to żeby mieć 100% coverage. Pisz testy które testują zachowanie Twojej aplikacji.
thresholds: {
lines: 80,
functions: 80,
branches: 75,
statements: 80,
}reporter: ["text", "html", "lcov"],LCOV używa się do integracji z narzędziami jak Codecov.
environment: "node", // Zamiast "jsdom"Szybsze, ale nie zadziała dla komponentów React!
Q: Czym różni się od Jest? A: Vitest to "Jest dla Vite". Jest szybszy i lepiej zintegrowany z nowoczesnym JS/TS.
Q: Czy muszę importować describe/it/expect?
A: Nie! globals: true robi to za Ciebie.
Q: Co to jest toBeInTheDocument()?
A: To matcher z @testing-library/jest-dom. Jest dodany w setup-tests.ts.
Q: Dlaczego middleware.ts jest wykluczony? A: Middleware Next.js jest trudny do testowania jednostkowego. Testujesz go E2E z Playwright.
Q: Co jeśli mój coverage spadnie poniżej 60%?
A: npm run test:coverage zafailuje. To przypomnienie żeby pisać testy! Możesz obniżyć próg jeśli potrzebujesz.
Q: Czy powinienem mieć 100% coverage? A: Nie! 60-80% to dobry cel. 100% często oznacza testowanie implementacji zamiast zachowania.
-
Coverage reporter: 4 → 2
- Usunięto
jsonilcov(niepotrzebne bez CI/CD) - Zostały
text(terminal) ihtml(przeglądarka)
- Usunięto
-
Thresholds: 70% → 60%
- Łatwiej na początek
- Zwiększysz jak będziesz mieć więcej testów
-
Dodano komentarze
- Każde ustawienie wyjaśnione
- Łatwiej zrozumieć co robi
Config był już dobry, tylko lekko zoptymalizowany dla początkującego.