Рубрики
Uncategorized

Объединение нашего набора тестов Frontend (… и исправить то, что мы нашли)

Автор: Билли Вонг и Скотт Купер, добавляя инструменты в шутку Здесь, в Sentry, нам нравится … Tagged с производительностью, мониторингом, DevOps, JavaScript.

By: Билли Вонг & Скотт Купер

Здесь, в Sentry, нам нравится как можно больше Dogfood нашего продукта. Иногда это приводит к необычным приложениям нашего продукта, а иногда эти необычные приложения окупаются значимым образом. В этом сообщении мы рассмотрим один такой случай, когда мы используем Sentry JavaScript SDK для инструмента Шутка (который запускает наш набор тестов Frontend) и как мы решали проблемы, которые мы нашли.

У нас есть показатели высокого уровня для того, насколько хорошо (или нет) наш CI работает. Это полезно, чтобы получить общее представление о здоровье системы, однако это не помогает при более глубоком погружении в то, почему система медленная. Мы решили придумать наши задания CI на уровне Test Runner, чтобы получить представление о производительности отдельных тестов. Нам нужно было увидеть, замедляется ли наш тестовый набор, потому что мы добавляли больше тестов или это было потому, что у нас были плохие испытания.

Как упомянуто выше, мы используем Jest в качестве нашего тестового бегуна. Важно отметить, что наш метод инструментов требует использования Jest-Circus Тестовый бегун. Это по умолчанию для Jest версии 27, однако, его можно использовать с более ранними версиями Jest. Jest-Circus требуется, потому что это позволяет нам слушать события из шутки, используя Пользовательская среда и определение HandleteStevent метод Ниже приведен базовый тестовый фрагмент, аннотированный с приближением, где Jest-Circus События увольняются.

// --> setup
// --> add_hook
// --> start_describe_definition
// --> add_hook
// --> add_hook
// --> add_hook
// --> add_hook
// --> add_test
// --> finish_describe_definition
// --> run_start
describe('describe', function () {
  // --> run_describe_start
  // --> hook_start
  // --> hook_success

  beforeAll(function () {});
  beforeEach(function () {});
  afterEach(function () {});
  afterAll(function () {});

  // --> test_start
  // --> hook_start
  // --> hook_success
  it('test', function () {
    // --> test_fn_start
    expect(true).toBe(true);
  }); // --> test_fn_success
  // --> hook_start
  // --> hook_success
  // --> test_done

  // --> hook_start
  // --> hook_success
}); // --> run_describe_finish
// --> run_finish
// --> teardown

Инструментация мониторинга производительности Sentry является деревьями по структуре с транзакцией в качестве корневого узла и охватывает как детские узлы. Мы можем использовать комбинацию имени события и имени теста, чтобы определить, следует ли либо создать транзакцию, создать детский промежуток из существующей транзакции, либо прекратить пролет/транзакцию. Вот Пример того, как мы это реализовали Анкет

Начать исследование медленного шумового теста немного похоже на то, чтобы заглянуть в черный ящик, потому что там так много абстракции. Итак, первые шаги — выясните, на какие тесты посмотреть, а затем выясните, что они тратят время. Самыми медленными тестами были все более крупные представления страниц со многими подкомпонентами и компонентами, которые получают доступ к данным из наших хранилищ данных. Большие компоненты должны быть медленнее, верно?

Глядя на тест «Индекс правил оповещения», мы видим, что Передеда Функция становится медленнее после каждого теста, но код в Передеда Блок остается прежним и должен занять столько же времени на первом тесте, сколько и на последнем тесте. Глядя на то, что в Передеда Функции было недостаточно, чтобы решить, что замедляет его. Передеда содержал несколько макетов API и призыв к ProjectStore.loadInitialData ([]); Это инициализировало магазин проекта с пустым массивом. Но ничего из этого не должно быть медленным, поэтому давайте пусть узел скажет нам, что происходит.

Начните шутить, используя отладчик узла только в одном тестовом файле. -INSpect-Brk Флаг говорит Узел, чтобы подождать, пока мы не приедуем нашего профилировщика.

node --inspect-brk node_modules/.bin/jest --runInBand --no-cache tests/js/spec/views/alerts/rules/index.spec.jsx

После профилирования теста и масштабирования в область, где проводятся тесты, мы обнаружили код, который работает во время Передеда Анкет На этом скриншоте мы переименовали анонимные Передеда Функция к именованной функции badbeforeeach Так что это можно найти проще. Ниже это один вызов ProjectSstore.loadInitialData Затем последовали несколько вызовов SetState и куча реагирующих работ, которую снимают. Этого не должно происходить, так как еще не должно быть компонента, слушая магазин.

Это заставило нас проверить, что компонент не был установлен после каждого теста. Мы добавили ComponentWillunMount к тестируемому компоненту класса с Консоль.log Когда мы не видели Консоль.log , мы проверили его вручную, отключив компонент после каждого теста.

Результат: наш Передеда Функция занимает долю секунды, каждую итерацию вместо того, чтобы выявлять обнаружение изменений в компонентах, которые должны были быть размонтированы, и наш тест имеет общее общее время сокращено почти вдвое. Ферментные документы предупредить вас, что призвание устанавливать вместо неглубокий Будет сохранить компоненты в DOM, и причина, по которой мы видим большее влияние на этот тест, заключается в том, что магазин все еще вызывает обнаружение изменений в компонентах, которые должны были быть уничтожены.

Используя функцию Sentry’s Trends Trends, мы можем подтвердить влияние на производительность этих изменений на тесты.

Мы представили пример Jest Environment что вы можете использовать, если вы заинтересованы в инструментировании своих собственных Jest -тестов. Вам нужно установить Jest-Sentry-Environment Упакуйте и обновите свою конфигурацию Jest, чтобы использовать предварительный пакет, а также предоставить ваш часовой DSN. Для получения дополнительных инструкций см. Репозиторий Анкет

Оригинал: «https://dev.to/sentry/instrumenting-our-frontend-test-suite-and-fixing-what-we-found-55»