Что такое кэширование тестового контекста

Ответ

Кэширование тестового контекста — это оптимизация в тестировании, когда данные или состояние, общие для нескольких тестов, создаются один раз и переиспользуются между тестами. Это ускоряет выполнение тестов, особенно если подготовка контекста затратна (например, создание БД, моки API).

Пример в Jest:

let sharedResource;

beforeAll(() => {
  sharedResource = initializeExpensiveResource(); // Выполнится 1 раз для всех тестов
});

test('test 1', () => {
  expect(sharedResource).toBeDefined();
});

test('test 2', () => {
  expect(sharedResource.property).toEqual('value');
});

Нюансы:

  • Изменения контекста в одном тесте влияют на другие (антипаттерн)
  • Для изоляции лучше использовать beforeEach вместо beforeAll
  • Особенно полезно для интеграционных и E2E тестов

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа придумана! Кэширование тестового контекста, ёпта. Это ж когда ты, блядь, не хочешь каждый раз, как обезьяна, одно и то же делать перед каждым тестом.

Представь: тебе надо базу данных накатить, или там API замокать — дело долгое, пиздец как затратное. А тут раз — и сделал один раз перед всеми, и пошёл тесты гонять, как угорелый. Скорость, блядь, растёт, как на дрожжах!

Вот смотри, как в Jest это выглядит, тут всё просто:

let sharedResource; // Вот эта переменная — наша палочка-выручалочка

beforeAll(() => {
  sharedResource = initializeExpensiveResource(); // Всё, блядь, инициализировали ОДИН РАЗ на всех
});

test('test 1', () => {
  expect(sharedResource).toBeDefined(); // И тут она уже есть, готовая
});

test('test 2', () => {
  expect(sharedResource.property).toEqual('value'); // И тут, сука, та же самая!
});

Но тут, блядь, главное — не наступить на грабли, а то лоб себе расшибёшь! Запомни раз и навсегда: если один тест эту sharedResource по-тихому изменит, то следующий тест её уже в изменённом виде получит. И пойдёт пляска с бубном: "А почему у меня тест падает, я же нихуя не трогал?". Это, блядь, классический антипаттерн, источник плавающих багов, которые ебут мозг.

Поэтому, если тесты должны быть изолированными, как монахи в кельях, то юзай beforeEach. Он, конечно, медленнее, зато каждый тест начинает с чистого листа, и волнение ебать — ноль.

А вот для интеграционных тестов, где надо поднять целую инфраструктуру, — тут да, beforeAll просто царь и бог. Один раз настроил — и овердохуища тестов прогнал. Красота!