Jest: глобальный перед всем

Созданный на 15 июн. 2017  ·  36Комментарии  ·  Источник: facebook/jest

есть ли способ для глобального beforeAll?

Я могу определить beforeAll в каждом тестовом файле, но это будет запускать beforeAll один раз для каждого тестового файла.

есть ли какое-либо глобальное значение beforeAll, которое будет запущено один раз и завершится до первого запуска теста?

Самый полезный комментарий

+1 за глобальную настройку. Как и другие пользователи, я хотел бы настроить и отключить приложение/БД только один раз.

Все 36 Комментарий

Вы видели setupFiles ?

Для справки, мой проект использует setupFiles следующим образом:

package.json

{
  "jest": {
    "setupFiles": [
      "./private/mocks/runtime.js"
    ]
  }
}

./private/mocks/runtime.js

global.__meteor_runtime_config__ = {ROOT_URL: 'localhost'};

FYI Stack Overflow может быть лучшим местом для такого рода вопросов. (вопрос об использовании вместо отчета об ошибке / запроса функции).

Кроме того, я отписался от этой проблемы, поэтому не буду получать уведомления, если вы ответите.

Я использую приложение create-реагировать.
и setupFiles запускаются снова для каждого тестового файла.

дать ответ, который не является правильным, и закрыть вопрос после него. Браво!

@cpojer @ashtonsix Я ​​не думаю, что это нужно закрывать, и ответ неверен, для каждого набора тестов запускается как setupFiles , так и setupTestFrameworkScriptFile , поэтому не существует «глобального» beforeAll где мы можем установить такие мысли, как очистка тестовой базы данных перед тестированием

У вас может быть pretest в package.json?

@ Negan1911 - возможно, но трудно сказать, что имеется в виду в ОП. Вы могли бы подумать о создании второго выпуска, если считаете, что это полезная функция и хотите внести больше ясности в этот запрос функции?

@cpojer @ashtonsix Если я правильно понимаю, в настоящее время невозможно выполнить глобальную настройку и демонтаж, как описано здесь, в Mocha .
Вариант использования, который есть у меня (и, вероятно, у OP), заключается в том, что я хочу запустить сервер, и только затем все мои интеграционные тесты (и, вероятно, после того, как все они будут запущены, сбросить тестовую БД).
Есть ли у вас какие-либо советы или лучшие практики для этого?
Что я обнаружил, так это то, что люди в основном советуют запускать сервер и закрывать его для каждого набора тестов в «локальном» beforeAll/afterAll, например, здесь @kentcdodds , но подразумевает много дублирования, нет?

+1 за глобальную настройку, в моем случае я также хочу запустить прокси-сервер

@ashtonsix , чего бы это ни стоило, на мой взгляд, ОП был ясен. Я бы хотел, чтобы этот вопрос был вновь открыт.

Вы можете создать собственный jest-environment , посмотреть jest-environment-node или jest-environment-jsdom и подклассировать его. Это должно позволить вам настроить среду так, как вам нравится. Мы также обсудили добавление асинхронного хука для этого, и я с радостью приму для него PR.

+1 Хотел попробовать шутку из мокко и был впечатлен простотой jest-codemods и документацией, пока не столкнулся с той же проблемой.

Каждый первый describe каждого отдельного файла выполнялся на удивление долго. Оказывается, установка, как объяснялось в предыдущих комментариях, запускалась один раз для каждого файла, что приводило к множеству ненужных трудоемких операций, таких как DROP DATABASE , CREATE DATABASE и т. д.

К сожалению, в документах нет обходного пути (который, в свою очередь, привел меня сюда), кроме как запустить node setup.js && jest , что не идеально.

+1 за глобальную настройку. Как и другие пользователи, я хотел бы настроить и отключить приложение/БД только один раз.

+1

Исправлено в #4506

Существуют следующие варианты шутки globalSetup и globalTeardown . https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -строка

Я пытался использовать globalSetup , однако я продолжаю получать следующую ошибку. Я думаю, что эта опция может помочь @shai32. Тем не менее, я не могу заставить его работать 🤣 ...

"jest": "^21.2.1"
 "jest": {
    "globalSetup": "./jest-config.js"
  }



md5-d3a1dcf99642fcf0b9c99c838aadb689



● Validation Warning:

  Unknown option "globalSetup" with value "./jest-setup.js" was found.
  This is probably a typing mistake. Fixing it will remove this message.

  Configuration Documentation:
  https://facebook.github.io/jest/docs/configuration.html

Он еще не выпущен. Jest 22 прибудет со дня на день 🙂

Исправлено в #4506

Я знаю, что там есть ссылка, но для тех, кто ищет: https://github.com/facebook/jest/pull/4716

@btav это 2 ошибки 😓

  1. вы должны использовать абсолютный путь на данный момент или ("../../../~ root ~")
  2. предупреждения проверки являются ложными срабатываниями

см. здесь
также #5093

ошибки должны быть исправлены с помощью #5095 #5096

Можно ли это использовать для установки глобальной переменной? Я пытался, но это не работает .... это так задумано?

Мой вариант использования: у меня есть пользовательская функция журнала, которую я хочу установить глобально. Я пробовал _setup.test.js , но мои глобальные переменные не переносятся.

@zwhitchcox используйте параметр конфигурации setupFiles: https://facebook.github.io/jest/docs/en/configuration.html#setupfiles -array

Иногда может быть полезно поделиться глобальной переменной, настроенной с помощью асинхронной функции. Например, было бы полезно один раз настроить браузер puppeteer в globalSetup, а затем создавать новую страницу в каждом тесте/наборе тестов.

@tdenovan Это именно то, что я пытаюсь сделать прямо сейчас. Но, похоже, это не работает. Я делал это в мокко раньше, и это было легко, но в шутку я думаю, что мне нужно найти другие способы.
Это мой шуточный конфиг

"jest": {
    "verbose": true,
    "testEnvironment": "node",
    "globalSetup": "<rootDir>/scripts/testSetup.js",
    "globalTeardown": "<rootDir>/scripts/testTeardown.js"
  },
// globalSetup.js
module.exports = async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  bot = Bot(browser, page);
  await bot.goto(bot.baseUrl);
  global.bot = bot;
}

Но я не могу получить доступ к боту в своих тестовых примерах.

ПГВП! Просто решил это.

"e2e": "jest --testRegex '.*.e2e.js'"
// globalTeardown.js
module.exports = async () => {
  if (process.testSetup) {
    process.testSetup.bot.close();
  }
}

 process.testSetup = { bot };
// and then im my tests
const { bot } = process.testSetup;

и кому интересно, что такое бот,

const Bot = (browser, page) => ({
  browser: browser,
  page: page,
  baseUrl: 'http://localhost:4000',
  user: {
    name: faker.name.findName(),
    email: faker.internet.email(),
    password: 'Test<strong i="13">@123</strong>',
  },
  oldUser: {
    email: '[email protected]',
    password: 'Test<strong i="14">@123</strong>',
  },
  clearSession: async () => {
    await page.evaluate(() => sessionStorage.clear());
  },
  goto: async (url) => {
    await page.goto(url);
  },
  clickButton: async (id) => {
    await page.waitForSelector(id);
    await page.click(id);
  },
  checkText: async (expect, id, text) => {
    await page.waitForSelector(id);
    const elText = await page.$eval(id, el => el.innerHTML);
    expect(elText).toContain(text);
  },
  type: async (id, text) => {
    await page.waitForSelector(id);
    await page.$eval(id, el => el.value = '');
    await page.type(id, text);
  },
  wait: async () => {
    await page.waitForNavigation();
  },
  close: () => {
    browser.close();
  },
});

На сайте есть руководство для кукольника: https://facebook.github.io/jest/docs/en/puppeteer.html

Да, но это говорит о том, что установка глобального в асинхронном методе globalSetup возможна, что, согласно приведенному выше, не похоже на b

@SimenB ааа .. чувак ... Я пытался понять это, а также довольно долго был в документации по шуткам и никогда не замечал этого раздела. Пустая трата моего времени.

У меня возникла проблема, из-за которой глобальные объекты, заданные в globalSetup, недоступны, если параллельно запущено несколько наборов тестов (по умолчанию). Запуск одного теста набора объектов доступен или если я установил --runInBand для последовательного запуска тестов. Как я могу получить доступ к переменным, заданным в globalSetup, если тесты выполняются параллельно?
Я попробовал пример, использованный выше (с использованием объекта процесса), а также попробовал версию, в которой я использую пользовательскую среду TestEnvironment, но безуспешно:

const PuppeteerJsdomEnvironment = require('jest-puppe-shots/lib/jsdom-environment');

class JestPuppeShotsEnv extends PuppeteerJsdomEnvironment {

  async setup(config) {
    await super.setup(config);
    const { allThemesCss } = global;

    // make the allThemesCss object available in test suites
    Object.assign(this.global, {
      allThemesCss
    });
  }
}

module.exports = JestPuppeShotsEnv;

Это получение allThemesCss из globalSetup.js и проверка его передачи в наборы тестов.

@ovidiu-lapadus Мне удалось заставить работать globalSetup, используя process вместо global. Он работает с --runInBand и без него. Например

// globalSetup.js
module.exports = async () => {
  process.FOOT = 'BALL';
};
// globalTeardown.js
module.exports = async () => {
  console.log(process.FOOT) // BALL 
};
// some.test.js
it('expects 1 to be 1', () => {
    expect(1).toBe(1);
     console.log(process.FOOT); // BALL
});

Что касается команды jest, я не уверен, почему global s не определены в тестах ( babel-jest 22.2.2 ), но определены в globalTeardown.js . Возможно, это ошибка. Пока я просто использую process . Ваше здоровье!

Спасибо @cellis , вы спасли мой день! Я бился головой о стену, пытаясь понять, почему global.FOO не работает. process.FOO делает свое дело :-)

@kaluteo Есть несколько предостережений по использованию process.FOO. Во-первых, я не думаю, что вы можете делать глубоко вложенные переменные в process или process.env. Я нашел еще лучший способ заставить глобальные работать, но я ждал, чтобы опубликовать его. Что я сделал, так это использовал пакет jest-environment для создания собственного dbEnvironment . Там я проверяю, определены ли глобальные базы данных, и если нет, я их переопределяю. Среда базы данных запускается только для тестов БД, у меня есть другая конфигурация только для тестов внешнего интерфейса. Таким образом, я не трачу время на запуск тестов БД для каждого изменения внешнего интерфейса. Во-вторых, у меня есть способ настроить несколько БД-реплик, которые всегда «горячие» — вам не нужно мигрировать или сбрасывать их при каждом запуске шутки, так как я мигрирую их вместе с БД dev (вы можете увидеть проблески это в сути, которой я поделился), что позволяет запускать тесты еще быстрее. Я настраиваю пул этих реплик, чтобы добиться максимального параллелизма в тестах. Это как бы задокументировано в документации по шутке, но недостаточно хорошо объяснено. В любом случае, вот суть: https://gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2

@ovidiu-lapadus При ближайшем рассмотрении я думаю, что, возможно, ваша проблема в том, что вы вызвали super.setup() перед назначением своих глобальных переменных. Пожалуйста, ознакомьтесь с сутью, которую я разместил выше, для рабочего решения.

@cellis спасибо за эту ценную информацию. Я попробую с пользовательской средой, как вы описали

Ребята, разве globalSetup не должен включать сюда все задачи, такие как babel-polyfill , в сочетании с chai , требуют jest-extended ?
Кажется, что globalSetup работает совсем иначе, чем setupTestFrameworkScriptFile , и то, что работало там, не работает в globalSetup .
Я знаю, что каждый шуточный тестовый пример запускается в его snadboxed среде, но если делать что-то в setupTestFrameworkScriptFile , то тест будет работать очень медленно.

Мокко: 9 с
Шутка: 60с, в режиме часов: 170-200с

?

Использование process — это хак, который, вероятно, сломается (это ошибка).

Вы, вероятно, хотите подписаться на # 7184

Это не глобальный beforeAll() , как было задано в вопросе, но с этим вы легко избегаете дублирования кода. Вы можете создать среду узла, которая будет настроена для всех ваших тестовых файлов: https://stackoverflow.com/a/61260044/4934640


Обновлять

Я только что узнал, что могу установить переменную среды на globalSetup , что означает, что я могу поделиться адресом сервера между тестовыми наборами/наборами/файлами: https://github.com/facebook/jest/issues/7184# комментарий к

Была ли эта страница полезной?
0 / 5 - 0 рейтинги