Wyobraź sobie Park Jurajski bez systemu weryfikacji DNA dinozaurów. Każdy nowo sklonowany gatunek mógłby mieć ukryte defekty genetyczne, które ujawniłyby się dopiero wtedy, gdy tyranozaur wyrwie się z wybiegu. W świecie programowania testowanie pełni dokładnie tę samą rolę - to system wczesnego ostrzegania, który wyłapuje błędy zanim trafią do użytkowników.
Testowanie manualne to jak osobiste sprawdzanie każdego dinozaura w parku - czasochłonne, podatne na ludzkie błędy i niemożliwe do powtórzenia w identyczny sposób.
1// Testowanie manualne - musisz sam sprawdzić wynik
2function calculateDinosaurAge(birthYear) {
3 return 2024 - birthYear;
4}
5
6// Ręczne sprawdzenie w konsoli:
7console.log(calculateDinosaurAge(2020)); // Czy to 4? Muszę sam sprawdzić...
8console.log(calculateDinosaurAge(2015)); // A to 9? Znowu sam sprawdzam...Testowanie automatyczne to jak zainstalowanie sensorów w każdym wybiegu - działają 24/7, natychmiast alertują o problemach i zawsze sprawdzają te same warunki.
1// Testowanie automatyczne - komputer sprawdza za Ciebie
2function calculateDinosaurAge(birthYear) {
3 return 2024 - birthYear;
4}
5
6// Test automatyczny:
7test('oblicza wiek dinozaura', () => {
8 expect(calculateDinosaurAge(2020)).toBe(4);
9 expect(calculateDinosaurAge(2015)).toBe(9);
10 expect(calculateDinosaurAge(2024)).toBe(0);
11});
12// Wynik: PASS lub FAIL - natychmiast wiesz!W świecie testowania istnieje koncepcja piramidy testów. Na jej dole znajdują się testy jednostkowe (unit tests), w środku testy integracyjne (integration tests), a na szczycie testy end-to-end (E2E).
1// 1. Testy jednostkowe (Unit Tests) - testują pojedynczą funkcję
2// Najszybsze, najtańsze, najwięcej ich potrzebujemy
3test('sprawdza gatunek dinozaura', () => {
4 expect(getSpecies('T-Rex')).toBe('Tyrannosaurus Rex');
5});
6
7// 2. Testy integracyjne (Integration Tests) - testują współpracę modułów
8// Sprawdzają, czy moduły poprawnie ze sobą komunikują
9test('system karmienia współpracuje z bazą dinozaurów', () => {
10 const dino = getDinosaur('Rex-001');
11 const result = feedDinosaur(dino, 'meat');
12 expect(result.status).toBe('fed');
13 expect(dino.hunger).toBe(0);
14});
15
16// 3. Testy E2E (End-to-End) - testują całą aplikację
17// Najwolniejsze, najdroższe, najmniej ich potrzebujemy
18test('użytkownik może zarezerwować wizytę w parku', async () => {
19 await page.goto('/booking');
20 await page.click('#select-date');
21 await page.fill('#name', 'John Hammond');
22 await page.click('#submit');
23 expect(await page.textContent('.confirmation')).toContain('Rezerwacja potwierdzona');
24});Optymalna piramida testów wygląda następująco:
Testowanie to nie strata czasu - to inwestycja. Oto główne korzyści: