есть ли способ для глобального beforeAll?
Я могу определить beforeAll в каждом тестовом файле, но это будет запускать beforeAll один раз для каждого тестового файла.
есть ли какое-либо глобальное значение beforeAll, которое будет запущено один раз и завершится до первого запуска теста?
Вы видели 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 ошибки 😓
см. здесь
также #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# комментарий к
Самый полезный комментарий
+1 за глобальную настройку. Как и другие пользователи, я хотел бы настроить и отключить приложение/БД только один раз.