jest-puppeteer не может запустить сервер по https
У меня есть приложение, которое работает с использованием https. Для этого мне нужно настроить среду тестирования e2e.
Если я установлю в jest-puppeteer.config.js
опция сервера protocol
в 'http' тестовый исполнитель игнорирует сервер, запущенный по адресу https://localhost:3000/ и завершившийся по таймауту без выполнения тестов. Выход
yarn run v1.9.4
$ NODE_ENV=test jest --useStderr --forceExit --runInBand --no-cache --detectOpenHandles --config config/jest/config.e2e.js
Determining test suites to run...
Jest dev-server output:
[Jest Dev server] $ node --max-old-space-size=4096 ./scripts/start.js
[Jest Dev server] NODE_ENV: test
[Jest Dev server] Starting the development server...
[Jest Dev server] start detecting webpack modules cycles
[Jest Dev server] end detecting webpack modules cycles
[Jest Dev server] start detecting webpack modules cycles
[Jest Dev server] end detecting webpack modules cycles
[Jest Dev server]
Compile done in: 159.054s
[Jest Dev server] Compiled with warnings.
[Jest Dev server] Warning in ./~/ajv/lib/async.js
96:20-33 Critical dependency: the request of a dependency is an expression
at process._tickCallback (internal/process/next_tick.js:180:9)
Warning in ./~/ajv/lib/async.js
119:15-28 Critical dependency: the request of a dependency is an expression
at process._tickCallback (internal/process/next_tick.js:180:9)
Warning in ./~/ajv/lib/compile/index.js
13:21-34 Critical dependency: the request of a dependency is an expression
at process._tickCallback (internal/process/next_tick.js:180:9)
You may use special comments to disable some warnings.
Use // eslint-disable-next-line to ignore the next line.
Use /* eslint-disable */ to ignore all warnings in a file.
Server has taken more than 240000ms to start.
☝️ You can set "server.launchTimeout" in jest-puppeteer.config.js
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Если в jest-puppeteer.config.js
Я пропускаю опцию сервера protocol
или установите его null
исполнитель тестов запускает выполнение тестов сразу после вызова запуска сервера (не дожидаясь запуска приложения). Мое приложение компилируется до 4 минут. Поэтому, чтобы избежать прерывания по таймауту, я удалил ограничение тайм-аута из page.goto и установил тайм-аут теста в 4 минуты. Однако, как только приложение скомпилировано, я получаю net::ERR_SPDY_PROTOCOL_ERROR at https://localhost:3000/login
ошибка. Выход
yarn run v1.9.4
$ NODE_ENV=test jest --useStderr --forceExit --runInBand --no-cache --detectOpenHandles --config config/jest/config.e2e.js
Determining test suites to run...
Jest dev-server output:
[Jest Dev server] $ node --max-old-space-size=4096 ./scripts/start.js
[Jest Dev server] NODE_ENV: test
[Jest Dev server] Starting the development server...
[Jest Dev server] start detecting webpack modules cycles
end detecting webpack modules cycles
[Jest Dev server] start detecting webpack modules cycles
[Jest Dev server] end detecting webpack modules cycles
[Jest Dev server]
Compile done in: 157.259s
FAIL tests/e2e/home.test.js (157.404s)
home page
✕ contains a particular text (155336ms)
● home page › contains a particular text
net::ERR_SPDY_PROTOCOL_ERROR at https://localhost:3000/login
at navigate (node_modules/puppeteer/lib/Page.js:622:37)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 158.343s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Обратите внимание, что если я использую http (не https) в приложении, в тестовом примере и в jest-puppeteer.config.js
все хорошо, т. е. тестовый набор проходит и выполняется после запуска приложения, но мне нужно использовать https.
Прецедент
/*global TimeoutLength windowSize*/
import puppeteer from 'puppeteer';
import expect from 'expect-puppeteer';
describe('home page', () => {
let browser;
let page;
beforeAll(async () => {
jest.setTimeout(TimeoutLength);
browser = await puppeteer.launch({
headless: false,
args: [`--window-size=${windowSize.width},${windowSize.height}`],
ignoreHTTPSErrors: true
});
page = await browser.newPage();
await page.setViewport(windowSize);
});
it('contains a particular text', async () => {
await page.goto('https://localhost:3000/login', {
timeout: 0
});
await expect(page).toMatch('My Accounts');
}, TimeoutLength);
afterAll(() => {
browser.close();
});
});
Шутка-puppeteer.config.js
module.exports = {
server: {
command: 'NODE_ENV=test yarn start',
debug: true,
launchTimeout: 240000,
port: 3000,
protocol: 'http',//or skipped i.e. protocol: null
usedPortAction: 'kill'
}
};
Jest config
module.exports = {
rootDir: '../..',
testURL: 'http://localhost',
setupFiles: [
'<rootDir>/config/jest/setup.js'
],
transform: {
'^.+\\.(js|jsx)?$': '<rootDir>/config/jest/transform.js'
},
moduleDirectories: [
'node_modules',
'src'
],
globals: {
TimeoutLength: 240000,
windowSize: {
width: 1200,
height: 900
}
},
verbose: true,
preset: 'jest-puppeteer',
setupTestFrameworkScriptFile: 'expect-puppeteer',
testRegex: '.*\\.(test)\\.js$',
testPathIgnorePatterns: [
'config/babel.test.js'
]
};