Когда целесообразно использовать end to end тесты с учетом их влияния на скорость CI

Ответ

E2E-тесты стоит использовать для проверки критических пользовательских сценариев, где важно взаимодействие между компонентами системы. Они медленные и хрупкие, поэтому:

  1. Основные сценарии: логин, оформление заказа, ключевые переходы
  2. Не заменяют unit/integration тесты - только дополняют их
  3. Минимум тестов - 5-10 ключевых сценариев обычно достаточно
  4. Запускать реже - не на каждый коммит, а перед релизом или ночью

Пример Cypress теста:

describe('Checkout flow', () => {
  it('should complete purchase', () => {
    cy.login()
    cy.addToCart()
    cy.checkout()
    cy.contains('Order confirmed').should('be.visible')
  })
})

Лучше запускать их параллельно в CI и использовать стабильные тестовые данные.

Ответ 18+ 🔞

Да ты посмотри на них, на этих E2E-тестов! Ну прям как слоны в посудной лавке, блядь. Медленные, хрупкие, каждое изменение в кнопке — и они уже орут, как сучки на сковородке.

Так вот, слушай сюда, главная мысль, чтобы в башке отложилось: юзай их только для самого пиздецово важного. Ну, понимаешь, сценарии, от которых у заказчика сразу волосы дыбом и жопа в огне, если они сломаются. Логин, оформление заказа, оплата — вот это вот всё, где система целиком должна работать, как швейцарские часы, а не как моя старенькая «девятка».

И запомни раз и нахуй: они не заменяют юниты и интеграционки! Это как сравнивать хирургический скальпель и кувалду. Юнитами ты аккуратно каждую детальку проверяешь, а E2E — это уже кувалдой по всей системе въебаться, чтобы посмотреть, не развалится ли. Одно дополняет другое, а не наоборот!

Держи в голове простые правила, а то накосячишь:

  1. Главные сценарии и всё. Не надо тестить ебушки-воробушки, каждый попсовый клик. Бери 5-10, ну максимум 15 самых ходовых пользовательских путей. Если больше — ты уже еблан, который просто тратит время и ресурсы.
  2. Это дополнение, а не основа. Повторюсь, потому что многие, блядь, как обезьяны с гранатой: натыкают E2E, а потом охуевают, почему сборка по три часа идёт. Юниты — быстро, E2E — медленно. Запоминай.
  3. Минимум, блять, тестов! Серьёзно, тебе не нужна тысяча сценариев. Горстки ключевых — за глаза. Остальное отловится на других уровнях.
  4. Гоняй их реже. Это не для каждого коммита, ёпта. Это тяжёлая артиллерия. Запускай перед тем, как что-то в прод выкатывать, или пусть ночью сами на CI тихонько потрутся.

Вот, смотри, как это примерно выглядит, на примере этого Cypress:

describe('Checkout flow', () => {
  it('should complete purchase', () => {
    cy.login() // Залогинились
    cy.addToCart() // В корзину пихнули
    cy.checkout() // Оформили
    cy.contains('Order confirmed').should('be.visible') // И охуенно, заказ есть!
  })
})

И последний совет, чтобы не обосраться: в CI гоняй их параллельно, чтобы не ждать овердохуища, и используй стабильные, предсказуемые тестовые данные. А то подгонишь рандомные и потом полдня будешь хуй пойми почему тесты плачут.

Короче, думай башкой. E2E — это мощный инструмент, но в руках идиота он себе же и яйца отрежет.