← Теория

⚡ Блок 05 — Программирование (JS/TS) Ozon

JavaScript · TypeScript · Типы данных · Асинхронность · Тестирование (Jest, Playwright)

📜 1. JavaScript — основы

Объявление переменных

Ключевое словоМожно переназначить?Область видимостиИспользовать
varФункция❌ Устарело
letБлок { }✅ Если значение меняется
constБлок { }✅ По умолчанию

Типы данных

ТипПримерПримитив?
string"hello"
number42, 3.14
booleantrue / false
nullnull (намеренно пусто)
undefinedundefined (не присвоено)
object{"key": "value"}❌ Ссылочный
array[1, 2, 3]❌ Ссылочный (вид объекта)

null vs undefined

let a; // undefined
let b = null; // null (явно)
typeof null // "object" (баг JS!)
typeof undefined // "undefined"
На собе: "const — по умолчанию, let — если значение меняется, var — устарело. null = намеренно пусто, undefined = не присвоено."

⚡ 2. Асинхронность

JS — однопоточный. Асинхронность позволяет не ждать медленных операций (запрос к серверу, таймер).

Три уровня

Callbacks (старый способ)

fetchData(url, function(result) {
  console.log(result);
});
// Callback hell — вложенность становится нечитаемой

Promise (современный)

fetch(url)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

Promise — обещание: операция завершится позже. Три состояния:

async/await (самый читаемый)

async function getUser() {
  try {
    const response = await fetch(url);
    const data = await response.json();
    return data;
  } catch (error) {
    console.error(error);
  }
}
На собе: "async/await — самый читаемый способ работы с асинхронным кодом. await «ждёт» результат Promise. Обязательно try/catch для обработки ошибок."

🔷 3. TypeScript — зачем и что

TypeScript = JavaScript + типы. Компилируется в обычный JS. В вакансии Ozon фронт на TS.

Зачем

Примеры типов

// JS — нет типов
function add(a, b) { return a + b; }
add("1", "2") // "12" — не ошибка, но баг!

// TS — типы указаны
function add(a: number, b: number): number {
  return a + b;
}
add("1", "2") // ❌ Ошибка компиляции!

Основные типы TS

ТипПример
stringlet name: string = "Test"
numberlet age: number = 25
booleanlet active: boolean = true
string[]let items: string[] = ["a", "b"]
interfaceinterface User { name: string; age: number }
anyОтключает проверку типов ❌
На собе: "TypeScript — это JavaScript с типами. Позволяет ловить ошибки на этапе компиляции, а не в рантайме. Основная выгода: безопасность кода и подсказки IDE."

🧪 4. Jest — тестирование JS/TS

Jest — самый популярный фреймворк тестирования для JS/TS (от Meta/Facebook).

Структура теста

describe("Login", () => {
  test("успешный логин", () => {
    const result = login("test@mail.com", "123");
    expect(result.status).toBe(200);
    expect(result.name).toBe("Test");
  });
});

Ключевые методы

МетодЧто делает
describeГруппировка тестов (сьют)
test / itОдин тест
expect()Проверка (assertion)
toBe()Строгое сравнение (===)
toEqual()Глубокое сравнение объектов
beforeEachВыполняется перед каждым тестом (setup)
afterEachВыполняется после каждого теста (teardown)

toBe vs toEqual

const a = { name: "Test" };
const b = { name: "Test" };

expect(a).toBe(b); // ❌ Разные объекты в памяти
expect(a).toEqual(b); // ✅ Одинаковое содержимое
На собе: "Jest — фреймворк тестирования JS. describe — группировка, test/it — тест, expect — проверка. toBe для примитивов, toEqual для объектов."

🎭 5. Playwright — автотесты UI

Playwright — фреймворк от Microsoft для автотестов UI. Поддерживает JS/TS, мультибраузерность.

Пример теста

import { test, expect } from '@playwright/test';

test('логин', async ({ page }) => {
  await page.goto('https://example.com/login');
  await page.fill('[data-testid="email"]', 'test@mail.com');
  await page.fill('[data-testid="password"]', '123456');
  await page.click('[data-testid="login-btn"]');
  await expect(page).toHaveURL('/dashboard');
});

Ключевые методы

ДействиеМетод
Открыть URLpage.goto(url)
Кликнутьpage.click(selector)
Ввести текстpage.fill(selector, text)
Проверить текстexpect(el).toHaveText('...')
Проверить URLexpect(page).toHaveURL('/path')
Скриншотpage.screenshot()
Ждать элементpage.waitForSelector(sel)

Почему Playwright, а не Selenium

На собе: "Playwright — современный фреймворк UI-тестов. Главное преимущество: auto-waiting (сам ждёт элементы), быстрый, поддерживает несколько браузеров. Локаторы: data-testid, CSS, XPath."

🔧 6. beforeEach / afterEach (фикстуры)

В Jest/Playwright beforeEach и afterEach — это аналог фикстур из PyTest.

describe('Корзина', () => {
  beforeEach(async () => {
    // Setup — логинимся перед каждым тестом
    await page.goto('/login');
    await login(page, 'test@mail.com', '123');
  });

  afterEach(async () => {
    // Teardown — очищаем корзину
    await clearCart(page);
  });

  test('добавить товар', async () => {
    await addToCart(page, 'item-1');
    await expect(cartCount(page)).resolves.toBe(1);
  });
});

Все хуки

ХукКогда выполняетсяДля чего
beforeAll1 раз перед всеми тестамиПодключение к БД, запуск сервера
beforeEachПеред каждым тестомЛогин, очистка данных
afterEachПосле каждого тестаОчистка состояния
afterAll1 раз после всех тестовЗакрытие соединений
На собе: "beforeEach / afterEach — это setup и teardown. beforeEach выполняется перед каждым тестом (например, логин), afterEach — после (очистка). beforeAll / afterAll — один раз на весь сьют."

💬 Вопросы для самопроверки