Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

Jest -- Silnik Rakietowy Testów

Jest to framework testowy stworzony przez Facebooka (Meta), który stanowi fundament testowania aplikacji React. Pomyśl o nim jak o głównym silniku rakietowym -- bez niego żaden test nie ruszy z miejsca.

Struktura testu -- describe i it/test

Testy organizujemy w bloki

describe
(opisujące grupę testów) i
it
lub
test
(pojedyncze testy):

1describe('SpaceShip', () => {
2  it('should have full fuel at start', () => {
3    const ship = createSpaceShip();
4    expect(ship.fuel).toBe(100);
5  });
6
7  it('should consume fuel during travel', () => {
8    const ship = createSpaceShip();
9    ship.travel(50);
10    expect(ship.fuel).toBeLessThan(100);
11  });
12
13  test('should not travel without fuel', () => {
14    const ship = createSpaceShip();
15    ship.fuel = 0;
16    expect(() => ship.travel(10)).toThrow('No fuel');
17  });
18});

it
i
test
to aliasy -- robią dokładnie to samo. Konwencja mówi:
it('should...')
lub
test('returns...')
.

Matchery (Assertions) -- Czujniki Diagnostyczne

Matchery to funkcje, które sprawdzają, czy wynik jest taki, jak oczekujemy. Jest oferuje bogaty zestaw:

Porównanie wartości

1// Dokładna równość
2expect(2 + 2).toBe(4);
3
4// Porównanie obiektów (deep equality)
5expect({ name: 'Apollo' }).toEqual({ name: 'Apollo' });
6
7// Negacja
8expect(fuel).not.toBe(0);

Prawdziwość

1expect(null).toBeNull();
2expect(undefined).toBeUndefined();
3expect('Apollo').toBeDefined();
4expect(true).toBeTruthy();
5expect(0).toBeFalsy();

Liczby

1expect(speed).toBeGreaterThan(0);
2expect(fuel).toBeLessThanOrEqual(100);
3expect(0.1 + 0.2).toBeCloseTo(0.3);

Stringi

1expect('Mission Control').toMatch(/mission/i);
2expect('Apollo 13').toContain('Apollo');

Tablice i obiekty

1expect(['Earth', 'Mars', 'Jupiter']).toContain('Mars');
2expect(crewMembers).toHaveLength(5);
3expect(spaceship).toHaveProperty('engine');
4expect(spaceship).toHaveProperty('crew.captain', 'Nova');

Wyjątki

1expect(() => launchWithoutFuel()).toThrow();
2expect(() => divideByZero()).toThrow('Division by zero');
3expect(() => invalidInput()).toThrow(ValidationError);

Setup i Teardown -- Przygotowanie do Startu

Często testy wymagają przygotowania i czyszczenia środowiska:

1describe('MissionControl', () => {
2  let missionControl;
3
4  // Przed KAŻDYM testem
5  beforeEach(() => {
6    missionControl = new MissionControl();
7    missionControl.initialize();
8  });
9
10  // Po KAŻDYM teście
11  afterEach(() => {
12    missionControl.shutdown();
13  });
14
15  // Przed WSZYSTKIMI testami w grupie
16  beforeAll(() => {
17    console.log('Starting mission control tests');
18  });
19
20  // Po WSZYSTKICH testach w grupie
21  afterAll(() => {
22    console.log('All tests completed');
23  });
24
25  it('should have zero active missions at start', () => {
26    expect(missionControl.activeMissions).toBe(0);
27  });
28});

Testowanie asynchroniczne w Jest

Wiele operacji w kosmosie wymaga czasu -- tak samo w kodzie:

1// Zwracanie Promise
2test('fetches crew data', () => {
3  return fetchCrewData().then(data => {
4    expect(data).toHaveLength(5);
5  });
6});
7
8// Async/await (preferowane)
9test('fetches crew data', async () => {
10  const data = await fetchCrewData();
11  expect(data).toHaveLength(5);
12});
13
14// Testowanie odrzuconego Promise
15test('throws on invalid mission', async () => {
16  await expect(fetchMission(-1)).rejects.toThrow('Invalid mission ID');
17});

Jest Mock Functions -- Symulatory Lotów

Mock functions pozwalają symulować zachowanie funkcji bez ich prawdziwego wywoływania:

1// Tworzenie mock function
2const mockLaunch = jest.fn();
3
4// Wywołanie
5mockLaunch('Apollo', 'Moon');
6
7// Sprawdzenie
8expect(mockLaunch).toHaveBeenCalled();
9expect(mockLaunch).toHaveBeenCalledTimes(1);
10expect(mockLaunch).toHaveBeenCalledWith('Apollo', 'Moon');
11
12// Mock z wartością zwrotną
13const mockFuel = jest.fn().mockReturnValue(100);
14expect(mockFuel()).toBe(100);
15
16// Mock z implementacją
17const mockCalculateRoute = jest.fn((from, to) => {
18  return { distance: 1000, estimatedTime: '2h' };
19});

Uruchamianie testow

Jest oferuje kilka przydatnych komend do uruchamiania testow:

1# Uruchom wszystkie testy
2npm test
3
4# Uruchom testy w trybie watch (automatycznie po zmianach)
5npm test -- --watch
6
7# Uruchom testy z konkretnego pliku
8npm test -- SpaceShip.test.js
9
10# Uruchom testy pasujace do wzorca
11npm test -- --testPathPattern="mission"
12
13# Uruchom z raportem pokrycia kodu
14npm test -- --coverage

Dobre praktyki testowania z Jest

  1. Jeden test = jedna asercja -- kazdy test powinien sprawdzac jedna konkretna rzecz
  2. Nazwy opisowe --
    it('should calculate fuel consumption for 100km trip')
    zamiast
    it('test fuel')
  3. Arrange-Act-Assert -- przygotuj dane, wykonaj akcje, sprawdz wynik
  4. Izolacja -- testy nie powinny zalezec od siebie nawzajem ani od kolejnosci uruchamiania

Jest to potezny silnik rakietowy testow -- opanowanie go da Ci pewnosc, że Twoja aplikacja dziala poprawnie w kazdych warunkach kosmicznych!

Przejdź do CodeWorlds