cypress: CT Performance Improvements: v10 slower than v9

Edit from @lmiller1990: this is getting worked on: https://github.com/cypress-io/cypress/pull/23104. Component Testing performance will be improved, initially released under an experimental flag to let use continue making incrementally performance updates. See latest comments for latest updates.

Edit: Try using the new experimentalSingleTabRunMode flag in your component property in cypress.config. It is up to 40% faster for larger suites. Read more in the docs here.

Current behavior

After upgrading to the latest version, we have an issue with slowness when we run cypress run --component. The tests themselves are not slow, but it seems there is some delay between specs runs as you can see in this video 👇 .

https://user-images.githubusercontent.com/6830426/174029644-aa31da35-ee35-4a04-8474-b0eab9a72869.mp4

We were not able to detect the exact issue, but we would appreciate any help 🙏

I was trying to run the tests with DEBUG and this might be potentially the issue 👇 image

Desired behavior

The tests should run smoothly without any delay.

Test code to reproduce

We use cypress on public repo https://github.com/toptal/picasso.

We have cypress 10 on the current master.

yarn
yarn test:integration

for debugging it is faster to run

# these need to be run only once
yarn
yarn build:package

yarn test:setup cypress run --component

Cypress Version

10.1.0

Other

We use cypress with Happo for visual testing. The first idea was that it might be the problem since Happo didn’t adapt to v10 yet, but it is not the case, I have tried to remove it from the repo and it didn’t help.

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Reactions: 10
  • Comments: 39 (23 by maintainers)

Most upvoted comments

Summary

Ok, I looked into it. It turns out creating a new tab (and associated processes) does impact the performance. Here’s a branch with the 9.7.0 behavior, which is one tab -> run all specs in there, as opposed to the current implementation which is to create a new tab per spec.

There’s a build of this branch you can install for linux x64, get it here. There’s likely some bugs, but npx cypress run --component seems to work fine - if you are running linux, you could give it a try. I’ll get a more reliable build up for windows/mac soon.

Note: these numbers are from 1 time runs - not the most scientific. To be more accurate, I’d run them all many times and take the average, but these are good enough to validate that opening a new tab is the primary reason we are slower.

Toy repo

Metric 9.7.0 10.3.0 10.3.0 (one tab)
Run time 175s 226s 146s
Average ms per spec 899ms 984ms 860ms

For the run time: (+18% Cypress 9.7.0, +37% Cypress 10.3.0)

These numbers are a bit exaggerated, since I’m running 1 test per spec, which is not common. Normally, a single spec file will have 10s or 100s of tests. Either way, this experiment implies a ~300ms cost for creating a new tab, which is significant.

picasso repo https://github.com/toptal/picasso (run locally)

9.7.0 10.3.0 10.3.0 (one tab) % improvement
? 138s 78s 43%

It’s 43% faster! I guess this mostly accounts for the 2x slowdown described.

Cypress internal component tests (local, no parallel, no video)

package 10.3.0 10.3.0 (one tab) # specs % improvement
packages/frontend-shared 150s 106s 41 29%
packages/app 326s 232s 75 28%
packages/launchpad 102s 73s 27 28%

Run locally. I turned off video, which makes everything slower in a linear fashion, so it shouldn’t impact the relative differences. 30% is a solid improvement.

Discussion

I think it’s death by many a thousand paper cuts - just opening a new tab is not a single performance killer, but it looks like we do some cleanup between specs, and reset a bunch of things. I need to go deeper, but I suspect at least some of these things are absolutely necessary to guarantee spec isolation and determinism in E2E, which is why E2E has done the “new browser per spec” things since forever. I’ll look more into this, and if it’s necessary for component testing.

As shown on my toy repo with 100 of the space spec, as as predicted, the actual test execution time is identical, since your production code and specs hasn’t changed changed.

Next Steps

  • build pre-release binary, share download link and solicit feedback - although it’s faster in my example repo and picasso, is it also faster for everyone else?
  • investigate implications of same-tab vs new-tab (for component testing only)
  • consider implications of slightly different behavior for E2E (new tab per spec) and CT (same tab per spec) w.r.t performance

Thanks for the patience and assistance here everyone! I think we are on the right track. I’ll be focused on this until we have the performance issue solved.

There is definitely a slowdown here. Running your picasso tests, I see that:

  • CT tests on commit f692ca02 (with Cypress 10.1.0) take about ~200s
    • Command used: yarn test:setup cypress run --component
  • CT tests on commit b90712743a (with Cypress 9.7.0) take about ~80s
    • Command used: yarn test:setup cypress run-ct

It appears that with 10.x we do some cleanup work/reset some browser state between spec executions that is the bulk of the added time. This time increases linearly with the number of specs included with a given run. The debug log output from the 10.1.0 run is provided below.

Thanks again for the report. I’m going to direct this issue to the CT team to investigate mitigating factors.

10.1.0 debug output between spec run start and actually executing tests in the spec (click me)
  Running:  Autocomplete.spec.tsx                                                          (3 of 60)
[HAPPO] Happo is disabled. Here's how to enable it:
  - Use the `happo-e2e` wrapper.
  - Set `HAPPO_ENABLED=true`.

Docs:
  https://docs.happo.io/docs/cypress#usage-with-cypress-run
  https://docs.happo.io/docs/cypress#usage-with-cypress-open
  cypress:server:run about to run spec { spec: { fileExtension: '.tsx', baseName: 'Autocomplete.spec.tsx', fileName: 'Autocomplete', specFileExtension: '.spec.tsx', relativeToCommonRoot: 'Autocomplete.spec.tsx', specType: 'component', name: 'cypress/component/Autocomplete.spec.tsx', relative: 'cypress/component/Autocomplete.spec.tsx', absolute: '/Users/tyler/cypress-support/picasso/cypress/component/Autocomplete.spec.tsx' }, isHeadless: true, browser: { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.', isHeadless: true, isHeaded: false } } +2ms
  cypress:server:run video recording has been disabled. video: false +2ms
  cypress:server:run waiting for socket to connect and browser to launch... +0ms
  cypress:server:run waiting for socket connection... { id: 'rt3xk1lond' } +0ms
  cypress:server:run browser launched +0ms
  cypress:server:open_project resetting project state, preparing to launch browser electron for spec { fileExtension: '.tsx', baseName: 'Autocomplete.spec.tsx', fileName: 'Autocomplete', specFileExtension: '.spec.tsx', relativeToCommonRoot: 'Autocomplete.spec.tsx', specType: 'component', name: 'cypress/component/Autocomplete.spec.tsx', relative: 'cypress/component/Autocomplete.spec.tsx', absolute: '/Users/tyler/cypress-support/picasso/cypress/component/Autocomplete.spec.tsx' } options { width: 1280, height: 720, show: false, onCrashed: [Function: onCrashed], onNewWindow: [Function: onNewWindow], automationMiddleware: { onBeforeRequest: [Function: onBeforeRequest], onAfterResponse: [Function: onAfterResponse] }, projectRoot: '/Users/tyler/cypress-support/picasso', shouldLaunchNewTab: true, onWarning: [Function (anonymous)] } +3s
  cypress:server:project resetting project instance /Users/tyler/cypress-support/picasso +63ms
  cypress:network:cors Parsed URL { port: '80', tld: '', domain: '' } +6ms
  cypress:network:cors Parsed URL { port: '52701', tld: 'localhost', domain: '' } +0ms
  cypress:server:remote-states setting remote state { auth: undefined, origin: 'http://localhost:52701', strategy: 'file', fileServer: 'http://localhost', domainName: 'localhost', props: null } for http://localhost:52701 +6ms
  cypress:network:cors Parsed URL { port: '52701', tld: 'localhost', domain: '' } +1ms
  cypress:server:remote-states getting remote state: { auth: undefined, origin: 'http://localhost:52701', strategy: 'file', fileServer: 'http://localhost', domainName: 'localhost', props: null } for: http://localhost:52701 +1ms
  cypress:server:project_utils returning spec url http://localhost:8080/__/#/specs/runner?file=cypress/component/Autocomplete.spec.tsx +3s
  cypress:server:open_project open project url http://localhost:8080/__/#/specs/runner?file=cypress/component/Autocomplete.spec.tsx +1ms
  cypress:server:project project has config { configFile: '/Users/tyler/cypress-support/picasso/cypress.config.ts', env: { codeCoverageTasksRegistered: true }, testingType: 'component', defaultCommandTimeout: 6000, fixturesFolder: '/Users/tyler/cypress-support/picasso/cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: '/Users/tyler/cypress-support/picasso/cypress/screenshots', video: false, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: '/Users/tyler/cypress-support/picasso/cypress/support/component.ts', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: { module: [Object], resolve: [Object] } }, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso', rawJson: { defaultCommandTimeout: 6000, fixturesFolder: './cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: './cypress/screenshots', video: false, component: { viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: [Object] }, e2e: { setupNodeEvents: '[Function setupNodeEvents]', baseUrl: 'http://0.0.0.0:3000', slowTestThreshold: 10000, specPattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', supportFile: 'cypress/support/e2e.{js,ts}' }, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: [Object] }, envFile: {}, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso' }, morgan: false, isTextTerminal: true, socketId: 'rt3xk1lond', report: true, animationDistanceThreshold: 5, arch: 'x64', baseUrl: 'http://localhost:8080', blockHosts: null, clientCertificates: [], downloadsFolder: '/Users/tyler/cypress-support/picasso/cypress/downloads', execTimeout: 60000, experimentalFetchPolyfill: false, experimentalInteractiveRunEvents: false, experimentalSessionAndOrigin: false, experimentalSourceRewriting: false, fileServerFolder: '/Users/tyler/cypress-support/picasso', excludeSpecPattern: [ '**/__snapshots__/*', '**/__image_snapshots__/*' ], includeShadowDom: false, keystrokeDelay: 0, modifyObstructiveCode: true, numTestsKeptInMemory: 0, platform: 'darwin', pageLoadTimeout: 60000, port: 52701, projectId: null, redirectionLimit: 20, reporter: 'spec', reporterOptions: null, requestTimeout: 5000, resolvedNodePath: '/Users/tyler/.nvm/versions/node/v16.13.2/bin/node', resolvedNodeVersion: '16.13.2', responseTimeout: 30000, retries: { runMode: 0, openMode: 0 }, screenshotOnRunFailure: true, scrollBehavior: 'top', supportFolder: '/Users/tyler/cypress-support/picasso/cypress/support', taskTimeout: 60000, trashAssetsBeforeRuns: true, userAgent: null, videoCompression: 32, videosFolder: '/Users/tyler/cypress-support/picasso/cypress/videos', videoUploadOnPasses: true, waitForAnimations: true, watchForFileChanges: false, additionalIgnorePattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', autoOpen: false, browsers: [ { name: 'chrome', family: 'chromium', channel: 'stable', displayName: 'Chrome', version: '102.0.5005.115', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', minSupportedVersion: 64, majorVersion: 102 }, { name: 'chromium', family: 'chromium', channel: 'stable', displayName: 'Chromium', version: '100.0.4896.0', path: '/Applications/Chromium.app/Contents/MacOS/Chromium', minSupportedVersion: 64, majorVersion: 100 }, { name: 'chrome', family: 'chromium', channel: 'beta', displayName: 'Chrome Beta', version: '103.0.5060.53', path: '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta', minSupportedVersion: 64, majorVersion: 103 }, { name: 'firefox', family: 'firefox', channel: 'stable', displayName: 'Firefox', version: '101.0.1', path: '/Applications/Firefox.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 101, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'dev', displayName: 'Firefox Developer Edition', version: '100.0', path: '/Applications/Firefox Developer Edition.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'nightly', displayName: 'Firefox Nightly', version: '100.0a1', path: '/Applications/Firefox Nightly.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.' } ], clientRoute: '/__/', cypressBinaryRoot: '/Users/tyler/Library/Caches/Cypress/10.1.0/Cypress.app/Contents/Resources/app', devServerPublicPathRoute: '/__cypress/src', hosts: null, isInteractive: true, namespace: '__cypress', reporterRoute: '/__cypress/reporter', socketIoCookie: '__socket', socketIoRoute: '/__socket', version: '10.1.0', xhrRoute: '/xhrs/', indexHtmlFile: 'cypress/support/component-index.html', cypressEnv: 'production', resolved: { animationDistanceThreshold: { value: 5, from: 'default' }, arch: { value: 'x64', from: 'default' }, baseUrl: { value: null, from: 'default' }, blockHosts: { value: null, from: 'default' }, chromeWebSecurity: { value: false, from: 'config' }, clientCertificates: { value: [], from: 'default' }, defaultCommandTimeout: { value: 6000, from: 'config' }, downloadsFolder: { value: 'cypress/downloads', from: 'default' }, env: { codeCoverageTasksRegistered: [Object] }, execTimeout: { value: 60000, from: 'default' }, experimentalFetchPolyfill: { value: false, from: 'default' }, experimentalInteractiveRunEvents: { value: false, from: 'default' }, experimentalSessionAndOrigin: { value: false, from: 'default' }, experimentalSourceRewriting: { value: false, from: 'default' }, fileServerFolder: { value: '', from: 'default' }, fixturesFolder: { value: './cypress/fixtures', from: 'config' }, excludeSpecPattern: { value: [Array], from: 'default' }, includeShadowDom: { value: false, from: 'default' }, keystrokeDelay: { value: 0, from: 'default' }, modifyObstructiveCode: { value: true, from: 'default' }, numTestsKeptInMemory: { value: 0, from: 'config' }, platform: { value: 'darwin', from: 'default' }, pageLoadTimeout: { value: 60000, from: 'default' }, port: { value: null, from: 'default' }, projectId: { value: null, from: 'default' }, redirectionLimit: { value: 20, from: 'default' }, reporter: { value: 'spec', from: 'default' }, reporterOptions: { value: null, from: 'default' }, requestTimeout: { value: 5000, from: 'default' }, resolvedNodePath: { value: null, from: 'default' }, resolvedNodeVersion: { value: null, from: 'default' }, responseTimeout: { value: 30000, from: 'default' }, retries: { value: [Object], from: 'default' }, screenshotOnRunFailure: { value: true, from: 'default' }, screenshotsFolder: { value: './cypress/screenshots', from: 'config' }, slowTestThreshold: { value: 250, from: 'default' }, scrollBehavior: { value: 'top', from: 'default' }, supportFile: { value: 'cypress/support/component.{js,ts}', from: 'config' }, supportFolder: { value: false, from: 'default' }, taskTimeout: { value: 60000, from: 'default' }, trashAssetsBeforeRuns: { value: true, from: 'default' }, userAgent: { value: null, from: 'default' }, video: { value: false, from: 'config' }, videoCompression: { value: 32, from: 'default' }, videosFolder: { value: 'cypress/videos', from: 'default' }, videoUploadOnPasses: { value: true, from: 'default' }, viewportHeight: { value: 1024, from: 'config' }, viewportWidth: { value: 1280, from: 'config' }, waitForAnimations: { value: true, from: 'default' }, watchForFileChanges: { value: false, from: 'config' }, browsers: { value: [Array], from: 'runtime' }, hosts: { value: null, from: 'default' }, isInteractive: { value: true, from: 'default' }, specPattern: { value: 'cypress/component/*.spec.tsx', from: 'config' }, configFile: { value: '/Users/tyler/cypress-support/picasso/cypress.config.ts', from: 'plugin' }, testingType: { value: 'component' } }, componentTesting: true, remote: {}, browser: null, specs: [], proxyUrl: 'http://localhost:52701', browserUrl: 'http://localhost:8080/__/', reporterUrl: 'http://localhost:8080/__cypress/reporter', xhrUrl: '__cypress/xhrs/', proxyServer: 'http://localhost:52701', state: {} } +1ms
  cypress:network:cors Parsed URL { port: '52701', tld: 'localhost', domain: '' } +1ms
  cypress:server:remote-states getting remote state: { auth: undefined, origin: 'http://localhost:52701', strategy: 'file', fileServer: 'http://localhost', domainName: 'localhost', props: null } for: http://localhost:52701 +1ms
  cypress:server:open_project launching browser: { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.', isHeadless: true, isHeaded: false }, spec: cypress/component/Autocomplete.spec.tsx +2ms
  cypress:server:browsers getBrowserLauncher { browser: { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.', isHeadless: true, isHeaded: false } } +3s
  cypress:server:browsers:electron open { browser: { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.', isHeadless: true, isHeaded: false }, url: 'http://localhost:8080/__/#/specs/runner?file=cypress/component/Autocomplete.spec.tsx' } +29ms
  cypress:server:saved_state noop saved state +3s
  cypress:server:browsers:electron received saved state {} +0ms
  cypress:server:browsers:electron browser window options { width: 1280, height: 720, show: false, automationMiddleware: { onBeforeRequest: [Function: onBeforeRequest], onAfterResponse: [Function: onAfterResponse] }, projectRoot: '/Users/tyler/cypress-support/picasso', shouldLaunchNewTab: true, browsers: [ { name: 'chrome', family: 'chromium', channel: 'stable', displayName: 'Chrome', version: '102.0.5005.115', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', minSupportedVersion: 64, majorVersion: 102 }, { name: 'chromium', family: 'chromium', channel: 'stable', displayName: 'Chromium', version: '100.0.4896.0', path: '/Applications/Chromium.app/Contents/MacOS/Chromium', minSupportedVersion: 64, majorVersion: 100 }, { name: 'chrome', family: 'chromium', channel: 'beta', displayName: 'Chrome Beta', version: '103.0.5060.53', path: '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta', minSupportedVersion: 64, majorVersion: 103 }, { name: 'firefox', family: 'firefox', channel: 'stable', displayName: 'Firefox', version: '101.0.1', path: '/Applications/Firefox.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 101, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'dev', displayName: 'Firefox Developer Edition', version: '100.0', path: '/Applications/Firefox Developer Edition.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'nightly', displayName: 'Firefox Nightly', version: '100.0a1', path: '/Applications/Firefox Nightly.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.' } ], userAgent: null, proxyUrl: 'http://localhost:52701', proxyServer: 'http://localhost:52701', socketIoRoute: '/__socket', chromeWebSecurity: false, isTextTerminal: true, downloadsFolder: '/Users/tyler/cypress-support/picasso/cypress/downloads', experimentalSessionAndOrigin: false, browser: { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.', isHeadless: true, isHeaded: false }, url: 'http://localhost:8080/__/#/specs/runner?file=cypress/component/Autocomplete.spec.tsx', resizable: false, x: null, y: null, devTools: false, minWidth: 100, minHeight: 100, contextMenu: true, partition: 'persist:run-85316', trackState: { width: 'browserWidth', height: 'browserHeight', x: 'browserX', y: 'browserY', devTools: 'isBrowserDevToolsOpen' }, webPreferences: { sandbox: true, partition: null, webSecurity: true, nodeIntegration: false, backgroundThrottling: false }, frame: true, recordFrameRate: null } +1ms
  cypress:server:browsers:electron launching browser window to url: http://localhost:8080/__/#/specs/runner?file=cypress/component/Autocomplete.spec.tsx +1ms
  cypress:server:browsers:electron debugger attached +9ms
  cypress:server:browsers:electron clearing cache +0ms
  cypress:server:socket-base socket-disconnecting transport close +108ms
  cypress:server:socket-base socket-disconnect transport close +0ms
  cypress:server:util:socket_allowed allowed socket closed, removing { localPort: 52759 } +1s
  cypress:server:util:socket_allowed allowed socket closed, removing { localPort: 52770 } +0ms
  cypress:server:util:socket_allowed allowed socket closed, removing { localPort: 52776 } +1ms
  cypress:server:browsers:electron maybe recording video { onScreencastFrame: undefined } +121ms
  cypress:server:browsers:electron debugger: enable Console and Network +1ms
  cypress:server:project project has config { configFile: '/Users/tyler/cypress-support/picasso/cypress.config.ts', env: { codeCoverageTasksRegistered: true }, testingType: 'component', defaultCommandTimeout: 6000, fixturesFolder: '/Users/tyler/cypress-support/picasso/cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: '/Users/tyler/cypress-support/picasso/cypress/screenshots', video: false, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: '/Users/tyler/cypress-support/picasso/cypress/support/component.ts', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: { module: [Object], resolve: [Object] } }, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso', rawJson: { defaultCommandTimeout: 6000, fixturesFolder: './cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: './cypress/screenshots', video: false, component: { viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: [Object] }, e2e: { setupNodeEvents: '[Function setupNodeEvents]', baseUrl: 'http://0.0.0.0:3000', slowTestThreshold: 10000, specPattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', supportFile: 'cypress/support/e2e.{js,ts}' }, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: [Object] }, envFile: {}, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso' }, morgan: false, isTextTerminal: true, socketId: 'rt3xk1lond', report: true, animationDistanceThreshold: 5, arch: 'x64', baseUrl: 'http://localhost:8080', blockHosts: null, clientCertificates: [], downloadsFolder: '/Users/tyler/cypress-support/picasso/cypress/downloads', execTimeout: 60000, experimentalFetchPolyfill: false, experimentalInteractiveRunEvents: false, experimentalSessionAndOrigin: false, experimentalSourceRewriting: false, fileServerFolder: '/Users/tyler/cypress-support/picasso', excludeSpecPattern: [ '**/__snapshots__/*', '**/__image_snapshots__/*' ], includeShadowDom: false, keystrokeDelay: 0, modifyObstructiveCode: true, numTestsKeptInMemory: 0, platform: 'darwin', pageLoadTimeout: 60000, port: 52701, projectId: null, redirectionLimit: 20, reporter: 'spec', reporterOptions: null, requestTimeout: 5000, resolvedNodePath: '/Users/tyler/.nvm/versions/node/v16.13.2/bin/node', resolvedNodeVersion: '16.13.2', responseTimeout: 30000, retries: { runMode: 0, openMode: 0 }, screenshotOnRunFailure: true, scrollBehavior: 'top', supportFolder: '/Users/tyler/cypress-support/picasso/cypress/support', taskTimeout: 60000, trashAssetsBeforeRuns: true, userAgent: null, videoCompression: 32, videosFolder: '/Users/tyler/cypress-support/picasso/cypress/videos', videoUploadOnPasses: true, waitForAnimations: true, watchForFileChanges: false, additionalIgnorePattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', autoOpen: false, browsers: [ { name: 'chrome', family: 'chromium', channel: 'stable', displayName: 'Chrome', version: '102.0.5005.115', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', minSupportedVersion: 64, majorVersion: 102 }, { name: 'chromium', family: 'chromium', channel: 'stable', displayName: 'Chromium', version: '100.0.4896.0', path: '/Applications/Chromium.app/Contents/MacOS/Chromium', minSupportedVersion: 64, majorVersion: 100 }, { name: 'chrome', family: 'chromium', channel: 'beta', displayName: 'Chrome Beta', version: '103.0.5060.53', path: '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta', minSupportedVersion: 64, majorVersion: 103 }, { name: 'firefox', family: 'firefox', channel: 'stable', displayName: 'Firefox', version: '101.0.1', path: '/Applications/Firefox.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 101, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'dev', displayName: 'Firefox Developer Edition', version: '100.0', path: '/Applications/Firefox Developer Edition.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'nightly', displayName: 'Firefox Nightly', version: '100.0a1', path: '/Applications/Firefox Nightly.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.' } ], clientRoute: '/__/', cypressBinaryRoot: '/Users/tyler/Library/Caches/Cypress/10.1.0/Cypress.app/Contents/Resources/app', devServerPublicPathRoute: '/__cypress/src', hosts: null, isInteractive: true, namespace: '__cypress', reporterRoute: '/__cypress/reporter', socketIoCookie: '__socket', socketIoRoute: '/__socket', version: '10.1.0', xhrRoute: '/xhrs/', indexHtmlFile: 'cypress/support/component-index.html', cypressEnv: 'production', resolved: { animationDistanceThreshold: { value: 5, from: 'default' }, arch: { value: 'x64', from: 'default' }, baseUrl: { value: null, from: 'default' }, blockHosts: { value: null, from: 'default' }, chromeWebSecurity: { value: false, from: 'config' }, clientCertificates: { value: [], from: 'default' }, defaultCommandTimeout: { value: 6000, from: 'config' }, downloadsFolder: { value: 'cypress/downloads', from: 'default' }, env: { codeCoverageTasksRegistered: [Object] }, execTimeout: { value: 60000, from: 'default' }, experimentalFetchPolyfill: { value: false, from: 'default' }, experimentalInteractiveRunEvents: { value: false, from: 'default' }, experimentalSessionAndOrigin: { value: false, from: 'default' }, experimentalSourceRewriting: { value: false, from: 'default' }, fileServerFolder: { value: '', from: 'default' }, fixturesFolder: { value: './cypress/fixtures', from: 'config' }, excludeSpecPattern: { value: [Array], from: 'default' }, includeShadowDom: { value: false, from: 'default' }, keystrokeDelay: { value: 0, from: 'default' }, modifyObstructiveCode: { value: true, from: 'default' }, numTestsKeptInMemory: { value: 0, from: 'config' }, platform: { value: 'darwin', from: 'default' }, pageLoadTimeout: { value: 60000, from: 'default' }, port: { value: null, from: 'default' }, projectId: { value: null, from: 'default' }, redirectionLimit: { value: 20, from: 'default' }, reporter: { value: 'spec', from: 'default' }, reporterOptions: { value: null, from: 'default' }, requestTimeout: { value: 5000, from: 'default' }, resolvedNodePath: { value: null, from: 'default' }, resolvedNodeVersion: { value: null, from: 'default' }, responseTimeout: { value: 30000, from: 'default' }, retries: { value: [Object], from: 'default' }, screenshotOnRunFailure: { value: true, from: 'default' }, screenshotsFolder: { value: './cypress/screenshots', from: 'config' }, slowTestThreshold: { value: 250, from: 'default' }, scrollBehavior: { value: 'top', from: 'default' }, supportFile: { value: 'cypress/support/component.{js,ts}', from: 'config' }, supportFolder: { value: false, from: 'default' }, taskTimeout: { value: 60000, from: 'default' }, trashAssetsBeforeRuns: { value: true, from: 'default' }, userAgent: { value: null, from: 'default' }, video: { value: false, from: 'config' }, videoCompression: { value: 32, from: 'default' }, videosFolder: { value: 'cypress/videos', from: 'default' }, videoUploadOnPasses: { value: true, from: 'default' }, viewportHeight: { value: 1024, from: 'config' }, viewportWidth: { value: 1280, from: 'config' }, waitForAnimations: { value: true, from: 'default' }, watchForFileChanges: { value: false, from: 'config' }, browsers: { value: [Array], from: 'runtime' }, hosts: { value: null, from: 'default' }, isInteractive: { value: true, from: 'default' }, specPattern: { value: 'cypress/component/*.spec.tsx', from: 'config' }, configFile: { value: '/Users/tyler/cypress-support/picasso/cypress.config.ts', from: 'plugin' }, testingType: { value: 'component' } }, componentTesting: true, remote: {}, browser: null, specs: [], proxyUrl: 'http://localhost:52701', browserUrl: 'http://localhost:8080/__/', reporterUrl: 'http://localhost:8080/__cypress/reporter', xhrUrl: '__cypress/xhrs/', proxyServer: 'http://localhost:52701', state: {} } +139ms
  cypress:network:cors Parsed URL { port: '52701', tld: 'localhost', domain: '' } +139ms
  cypress:server:remote-states getting remote state: { auth: undefined, origin: 'http://localhost:52701', strategy: 'file', fileServer: 'http://localhost', domainName: 'localhost', props: null } for: http://localhost:52701 +139ms
  cypress:server:routes proxying static assets /__/assets/index.a96bfe29.js, params[0] index.a96bfe29.js +2s
  cypress:server:routes proxying static assets /__/assets/index.0128a075.css, params[0] index.0128a075.css +1ms
  cypress:server:server-base Got CONNECT request from localhost:8080 +2s
  cypress:network:connect successfully connected { opts: { port: 52701, host: 'localhost', getDelayMsForRetry: [Function: getDelayForRetry] }, iteration: 0 } +2s
  cypress:server:util:socket_allowed allowing socket { localPort: 52799 } +380ms
  cypress:server:server-base Got UPGRADE request from /__socket/?EIO=4&transport=websocket +3ms
  cypress:server:util:socket_allowed is incoming request allowed? { isAllowed: true, reqUrl: '/__socket/?EIO=4&transport=websocket', remotePort: 52799, remoteAddress: '127.0.0.1' } +1ms
  cypress:server:socket-base socket connected +407ms
  cypress:server:socket-ct do onSocketConnection +3s
  cypress:server:routes proxying static assets /__/assets/Specs.ec514639.js, params[0] Specs.ec514639.js +271ms
  cypress:server:routes proxying static assets /__/assets/Runner.12af604b.js, params[0] Runner.12af604b.js +2ms
  cypress:server:routes proxying static assets /__/assets/Runner.7591f1d0.css, params[0] Runner.7591f1d0.css +2ms
  cypress:server:routes proxying static assets /__/assets/add-large_x16.34ef0540.js, params[0] add-large_x16.34ef0540.js +1ms
  cypress:server:routes proxying static assets /__/assets/CreateSpecModal.7b82dc44.js, params[0] CreateSpecModal.7b82dc44.js +0ms
  cypress:server:routes proxying static assets /__/assets/SpecPatterns.5862fb95.js, params[0] SpecPatterns.5862fb95.js +0ms
  cypress:server:routes proxying static assets /__/assets/Switch.65e7a51e.js, params[0] Switch.65e7a51e.js +3ms
  cypress:server:routes proxying static assets /__/assets/refresh_x16.c36d090a.js, params[0] refresh_x16.c36d090a.js +1ms
  cypress:server:server-base Got CONNECT request from localhost:8080 +80ms
  cypress:network:connect successfully connected { opts: { port: 52701, host: 'localhost', getDelayMsForRetry: [Function: getDelayForRetry] }, iteration: 0 } +82ms
  cypress:server:util:socket_allowed allowing socket { localPort: 52810 } +81ms
  cypress:server:server-base Got UPGRADE request from /__socket-graphql +2ms
  cypress:server:util:socket_allowed is incoming request allowed? { isAllowed: true, reqUrl: '/__socket-graphql', remotePort: 52810, remoteAddress: '127.0.0.1' } +1ms
  cypress:server:project project has config { configFile: '/Users/tyler/cypress-support/picasso/cypress.config.ts', env: { codeCoverageTasksRegistered: true }, testingType: 'component', defaultCommandTimeout: 6000, fixturesFolder: '/Users/tyler/cypress-support/picasso/cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: '/Users/tyler/cypress-support/picasso/cypress/screenshots', video: false, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: '/Users/tyler/cypress-support/picasso/cypress/support/component.ts', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: { module: [Object], resolve: [Object] } }, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso', rawJson: { defaultCommandTimeout: 6000, fixturesFolder: './cypress/fixtures', chromeWebSecurity: false, screenshotsFolder: './cypress/screenshots', video: false, component: { viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: [Object] }, e2e: { setupNodeEvents: '[Function setupNodeEvents]', baseUrl: 'http://0.0.0.0:3000', slowTestThreshold: 10000, specPattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', supportFile: 'cypress/support/e2e.{js,ts}' }, viewportWidth: 1280, viewportHeight: 1024, slowTestThreshold: 250, specPattern: 'cypress/component/*.spec.tsx', supportFile: 'cypress/support/component.{js,ts}', setupNodeEvents: '[Function setupNodeEvents]', devServer: { framework: 'react', bundler: 'webpack', webpackConfig: [Object] }, envFile: {}, projectRoot: '/Users/tyler/cypress-support/picasso', projectName: 'picasso' }, morgan: false, isTextTerminal: true, socketId: 'rt3xk1lond', report: true, animationDistanceThreshold: 5, arch: 'x64', baseUrl: 'http://localhost:8080', blockHosts: null, clientCertificates: [], downloadsFolder: '/Users/tyler/cypress-support/picasso/cypress/downloads', execTimeout: 60000, experimentalFetchPolyfill: false, experimentalInteractiveRunEvents: false, experimentalSessionAndOrigin: false, experimentalSourceRewriting: false, fileServerFolder: '/Users/tyler/cypress-support/picasso', excludeSpecPattern: [ '**/__snapshots__/*', '**/__image_snapshots__/*' ], includeShadowDom: false, keystrokeDelay: 0, modifyObstructiveCode: true, numTestsKeptInMemory: 0, platform: 'darwin', pageLoadTimeout: 60000, port: 52701, projectId: null, redirectionLimit: 20, reporter: 'spec', reporterOptions: null, requestTimeout: 5000, resolvedNodePath: '/Users/tyler/.nvm/versions/node/v16.13.2/bin/node', resolvedNodeVersion: '16.13.2', responseTimeout: 30000, retries: { runMode: 0, openMode: 0 }, screenshotOnRunFailure: true, scrollBehavior: 'top', supportFolder: '/Users/tyler/cypress-support/picasso/cypress/support', taskTimeout: 60000, trashAssetsBeforeRuns: true, userAgent: null, videoCompression: 32, videosFolder: '/Users/tyler/cypress-support/picasso/cypress/videos', videoUploadOnPasses: true, waitForAnimations: true, watchForFileChanges: false, additionalIgnorePattern: 'cypress/integration/**/*.spec.{js,jsx,ts,tsx}', autoOpen: false, browsers: [ { name: 'chrome', family: 'chromium', channel: 'stable', displayName: 'Chrome', version: '102.0.5005.115', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', minSupportedVersion: 64, majorVersion: 102 }, { name: 'chromium', family: 'chromium', channel: 'stable', displayName: 'Chromium', version: '100.0.4896.0', path: '/Applications/Chromium.app/Contents/MacOS/Chromium', minSupportedVersion: 64, majorVersion: 100 }, { name: 'chrome', family: 'chromium', channel: 'beta', displayName: 'Chrome Beta', version: '103.0.5060.53', path: '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta', minSupportedVersion: 64, majorVersion: 103 }, { name: 'firefox', family: 'firefox', channel: 'stable', displayName: 'Firefox', version: '101.0.1', path: '/Applications/Firefox.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 101, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'dev', displayName: 'Firefox Developer Edition', version: '100.0', path: '/Applications/Firefox Developer Edition.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'firefox', family: 'firefox', channel: 'nightly', displayName: 'Firefox Nightly', version: '100.0a1', path: '/Applications/Firefox Nightly.app/Contents/MacOS/firefox', minSupportedVersion: 86, majorVersion: 100, warning: 'Your project has set the configuration option: \x1B[33mchromeWebSecurity\x1B[39m to \x1B[94mfalse\x1B[39m\n' + '\n' + 'This option will not have an effect in Firefox. Tests that rely on web security being disabled will not run as expected.' }, { name: 'electron', channel: 'stable', family: 'chromium', displayName: 'Electron', version: '100.0.4896.75', path: '', majorVersion: 100, info: 'Electron is the default browser that comes with Cypress. This is the default browser that runs in headless mode. Selecting this browser is useful when debugging. The version number indicates the underlying Chromium version that Electron uses.' } ], clientRoute: '/__/', cypressBinaryRoot: '/Users/tyler/Library/Caches/Cypress/10.1.0/Cypress.app/Contents/Resources/app', devServerPublicPathRoute: '/__cypress/src', hosts: null, isInteractive: true, namespace: '__cypress', reporterRoute: '/__cypress/reporter', socketIoCookie: '__socket', socketIoRoute: '/__socket', version: '10.1.0', xhrRoute: '/xhrs/', indexHtmlFile: 'cypress/support/component-index.html', cypressEnv: 'production', resolved: { animationDistanceThreshold: { value: 5, from: 'default' }, arch: { value: 'x64', from: 'default' }, baseUrl: { value: null, from: 'default' }, blockHosts: { value: null, from: 'default' }, chromeWebSecurity: { value: false, from: 'config' }, clientCertificates: { value: [], from: 'default' }, defaultCommandTimeout: { value: 6000, from: 'config' }, downloadsFolder: { value: 'cypress/downloads', from: 'default' }, env: { codeCoverageTasksRegistered: [Object] }, execTimeout: { value: 60000, from: 'default' }, experimentalFetchPolyfill: { value: false, from: 'default' }, experimentalInteractiveRunEvents: { value: false, from: 'default' }, experimentalSessionAndOrigin: { value: false, from: 'default' }, experimentalSourceRewriting: { value: false, from: 'default' }, fileServerFolder: { value: '', from: 'default' }, fixturesFolder: { value: './cypress/fixtures', from: 'config' }, excludeSpecPattern: { value: [Array], from: 'default' }, includeShadowDom: { value: false, from: 'default' }, keystrokeDelay: { value: 0, from: 'default' }, modifyObstructiveCode: { value: true, from: 'default' }, numTestsKeptInMemory: { value: 0, from: 'config' }, platform: { value: 'darwin', from: 'default' }, pageLoadTimeout: { value: 60000, from: 'default' }, port: { value: null, from: 'default' }, projectId: { value: null, from: 'default' }, redirectionLimit: { value: 20, from: 'default' }, reporter: { value: 'spec', from: 'default' }, reporterOptions: { value: null, from: 'default' }, requestTimeout: { value: 5000, from: 'default' }, resolvedNodePath: { value: null, from: 'default' }, resolvedNodeVersion: { value: null, from: 'default' }, responseTimeout: { value: 30000, from: 'default' }, retries: { value: [Object], from: 'default' }, screenshotOnRunFailure: { value: true, from: 'default' }, screenshotsFolder: { value: './cypress/screenshots', from: 'config' }, slowTestThreshold: { value: 250, from: 'default' }, scrollBehavior: { value: 'top', from: 'default' }, supportFile: { value: 'cypress/support/component.{js,ts}', from: 'config' }, supportFolder: { value: false, from: 'default' }, taskTimeout: { value: 60000, from: 'default' }, trashAssetsBeforeRuns: { value: true, from: 'default' }, userAgent: { value: null, from: 'default' }, video: { value: false, from: 'config' }, videoCompression: { value: 32, from: 'default' }, videosFolder: { value: 'cypress/videos', from: 'default' }, videoUploadOnPasses: { value: true, from: 'default' }, viewportHeight: { value: 1024, from: 'config' }, viewportWidth: { value: 1280, from: 'config' }, waitForAnimations: { value: true, from: 'default' }, watchForFileChanges: { value: false, from: 'config' }, browsers: { value: [Array], from: 'runtime' }, hosts: { value: null, from: 'default' }, isInteractive: { value: true, from: 'default' }, specPattern: { value: 'cypress/component/*.spec.tsx', from: 'config' }, configFile: { value: '/Users/tyler/cypress-support/picasso/cypress.config.ts', from: 'plugin' }, testingType: { value: 'component' } }, componentTesting: true, remote: {}, browser: null, specs: [], proxyUrl: 'http://localhost:52701', browserUrl: 'http://localhost:8080/__/', reporterUrl: 'http://localhost:8080/__cypress/reporter', xhrUrl: '__cypress/xhrs/', proxyServer: 'http://localhost:52701', state: {} } +382ms
  cypress:network:cors Parsed URL { port: '52701', tld: 'localhost', domain: '' } +384ms
  cypress:server:remote-states getting remote state: { auth: undefined, origin: 'http://localhost:52701', strategy: 'file', fileServer: 'http://localhost', domainName: 'localhost', props: null } for: http://localhost:52701 +384ms
  cypress:server:routes proxying static assets /__/assets/electron.fb07f5cc.svg, params[0] electron.fb07f5cc.svg +567ms
  cypress:server:project socket:connected +684ms
  cypress:server:run got socket connection { id: 'rt3xk1lond' } +1s
  cypress:server:run socket connected { socketId: 'rt3xk1lond' } +0ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/vendors~main.js +2s
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/main.js +1ms
  cypress:server:server-base Got CONNECT request from 127.0.0.1:8080 +777ms
  cypress:network:connect successfully connected { opts: { port: 52701, host: 'localhost', getDelayMsForRetry: [Function: getDelayForRetry] }, iteration: 0 } +779ms
  cypress:server:util:socket_allowed allowing socket { localPort: 52816 } +778ms
  cypress:server:server-base Got UPGRADE request from /ws +1ms
  cypress:network:cors Parsed URL { port: '8080', tld: '127.0.0.1', domain: '' } +738ms
  cypress:network:agent addRequest called { isHttps: false, href: 'http://127.0.0.1:8080/ws' } +3s
  cypress:network:agent got family { family: 4, href: 'http://127.0.0.1:8080/ws' } +0ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/0.js +46ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/2.js +1ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/1.js +1ms
  cypress:server:browsers:electron console message: { column: 22, level: 'info', line: 551, source: 'console-api', text: '[webpack-dev-server] Live Reloading enabled.', url: 'webpack:///(webpack)-dev-server/client/modules/logger/index.js?' } +1s
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/5.js +2ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/vendors~spec-0~spec-1~spec-10~spec-11~spec-12~spec-13~spec-14~spec-15~spec-16~spec-17~spec-18~spec-1~d37bff5e.js +240ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/spec-0~spec-1~spec-10~spec-11~spec-12~spec-13~spec-14~spec-15~spec-16~spec-17~spec-18~spec-19~spec-2~9d1ea79e.js +1ms
  cypress:server:routes-ct proxying to /__cypress/src, originalUrl /__cypress/src/spec-2.js +1ms
  cypress:server:project received runnables { id: 'r1', title: '', root: true, type: 'suite', file: 'cypress/component/Autocomplete.spec.tsx', retries: -1, _slow: 250, hooks: [ { title: '"before all" hook', hookName: 'before all', hookId: 'h1', body: "() => {\n  cy.on('window:load', takeDOMSnapshot.init);\n}", type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"before all" hook', hookName: 'before all', hookId: 'h2', body: '() => {\n' + '    // we need to reset the coverage when running\n' + '    // in the interactive mode, otherwise the counters will\n' + '    // keep increasing every time we rerun the tests\n' + '    const logInstance = Cypress.log({\n' + "      name: 'Coverage',\n" + "      message: ['Reset [@cypress/code-coverage]']\n" + '    })\n' + '\n' + '    cy.task(\n' + "      'resetCoverage',\n" + '      {\n' + '        // @ts-ignore\n' + "        isInteractive: Cypress.config('isInteractive')\n" + '      },\n' + '      { log: false }\n' + '    ).then(() => {\n' + '      logInstance.end()\n' + '    })\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"before each" hook', hookName: 'before each', hookId: 'h3', body: '() => {\n' + '    // each object will have the coverage and url pathname\n' + '    // to let the user know the coverage has been collected\n' + '    windowCoverageObjects = []\n' + '\n' + '    const saveCoverageObject = (win) => {\n' + '      // if application code has been instrumented, the app iframe "window" has an object\n' + '      const applicationSourceCoverage = win.__coverage__\n' + '      if (!applicationSourceCoverage) {\n' + '        return\n' + '      }\n' + '\n' + '      if (\n' + '        Cypress._.find(windowCoverageObjects, {\n' + '          coverage: applicationSourceCoverage\n' + '        })\n' + '      ) {\n' + '        // this application code coverage object is already known\n' + '        // which can happen when combining `window:load` and `before` callbacks\n' + '        return\n' + '      }\n' + '\n' + '      windowCoverageObjects.push({\n' + '        coverage: applicationSourceCoverage,\n' + '        pathname: win.location.pathname\n' + '      })\n' + '    }\n' + '\n' + '    // save reference to coverage for each app window loaded in the test\n' + "    cy.on('window:load', saveCoverageObject)\n" + '\n' + '    // save reference if visiting a page inside a before() hook\n' + '    cy.window({ log: false }).then(saveCoverageObject)\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"after all" hook: collectBackendCoverage', hookName: 'after all', hookId: 'h4', body: 'function collectBackendCoverage() {\n' + '    // I wish I could fail the tests if there is no code coverage information\n' + '    // but throwing an error here does not fail the test run due to\n' + '    // https://github.com/cypress-io/cypress/issues/2296\n' + '\n' + '    // there might be server-side code coverage information\n' + '    // we should grab it once after all tests finish\n' + '    // @ts-ignore\n' + "    const baseUrl = Cypress.config('baseUrl') || cy.state('window').origin\n" + '    // @ts-ignore\n' + "    const runningEndToEndTests = baseUrl !== Cypress.config('proxyUrl')\n" + "    const specType = Cypress._.get(Cypress.spec, 'specType', 'integration')\n" + "    const isIntegrationSpec = specType === 'integration'\n" + '\n' + '    if (runningEndToEndTests && isIntegrationSpec) {\n' + '      // we can only request server-side code coverage\n' + '      // if we are running end-to-end tests,\n' + '      // otherwise where do we send the request?\n' + '      const url = Cypress._.get(\n' + "        Cypress.env('codeCoverage'),\n" + "        'url',\n" + "        '/__coverage__'\n" + '      )\n' + '      cy.request({\n' + '        url,\n' + '        log: false,\n' + '        failOnStatusCode: false\n' + '      })\n' + '        .then((r) => {\n' + "          return Cypress._.get(r, 'body.coverage', null)\n" + '        })\n' + '        .then((coverage) => {\n' + '          if (!coverage) {\n' + '            // we did not get code coverage - this is the\n' + '            // original failed request\n' + '            const expectBackendCoverageOnly = Cypress._.get(\n' + "              Cypress.env('codeCoverage'),\n" + "              'expectBackendCoverageOnly',\n" + '              false\n' + '            )\n' + '            if (expectBackendCoverageOnly) {\n' + '              throw new Error(\n' + '                `Expected to collect backend code coverage from ${url}`\n' + '              )\n' + '            } else {\n' + '              // we did not really expect to collect the backend code coverage\n' + '              return\n' + '            }\n' + '          }\n' + "          sendCoverage(coverage, 'backend')\n" + '        })\n' + '    }\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"after all" hook: mergeUnitTestCoverage', hookName: 'after all', hookId: 'h5', body: 'function mergeUnitTestCoverage() {\n' + '    // collect and merge frontend coverage\n' + '\n' + '    // if spec bundle has been instrumented (using Cypress preprocessor)\n' + '    // then we will have unit test coverage\n' + '    // NOTE: spec iframe is NOT reset between the tests, so we can grab\n' + '    // the coverage information only once after all tests have finished\n' + '    // @ts-ignore\n' + '    const unitTestCoverage = window.__coverage__\n' + '    if (unitTestCoverage) {\n' + "      sendCoverage(unitTestCoverage, 'unit')\n" + '    }\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"after all" hook: generateReport', hookName: 'after all', hookId: 'h6', body: 'function generateReport() {\n' + '    // when all tests finish, lets generate the coverage report\n' + '    const logInstance = Cypress.log({\n' + "      name: 'Coverage',\n" + "      message: ['Generating report [@cypress/code-coverage]']\n" + '    })\n' + "    cy.task('coverageReport', null, {\n" + "      timeout: dayjs.duration(3, 'minutes').asMilliseconds(),\n" + '      log: false\n' + '    }).then((coverageReportFolder) => {\n' + "      logInstance.set('consoleProps', () => ({\n" + "        'coverage report folder': coverageReportFolder\n" + '      }))\n' + '      logInstance.end()\n' + '      return coverageReportFolder\n' + '    })\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"after each" hook', hookName: 'after each', hookId: 'h7', body: 'function () {\n      cleanup();\n    }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 }, { title: '"after each" hook', hookName: 'after each', hookId: 'h8', body: '() => {\n' + '    // save coverage after the test\n' + '    // because now the window coverage objects have been updated\n' + '    windowCoverageObjects.forEach((cover) => {\n' + '      sendCoverage(cover.coverage, cover.pathname)\n' + '    })\n' + '\n' + '    if (!hasE2ECoverage()) {\n' + '      if (hasUnitTestCoverage()) {\n' + '        logMessage(`👉 Only found unit test code coverage.`)\n' + '      } else {\n' + '        const expectBackendCoverageOnly = Cypress._.get(\n' + "          Cypress.env('codeCoverage'),\n" + "          'expectBackendCoverageOnly',\n" + '          false\n' + '        )\n' + '        if (!expectBackendCoverageOnly) {\n' + '          logMessage(`\n' + '            ⚠️ Could not find any coverage information in your application\n' + '            by looking at the window coverage object.\n' + '            Did you forget to instrument your application?\n' + '            See [code-coverage#instrument-your-application](https://github.com/cypress-io/code-coverage#instrument-your-application)\n' + '          `)\n' + '        }\n' + '      }\n' + '    }\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: [Object], currentRetry: 0, retries: -1, _slow: 250 } ], tests: [], suites: [ { id: 'r2', title: 'Autocomplete', root: false, type: 'suite', file: null, invocationDetails: [Object], retries: -1, _slow: 250, hooks: [Array], tests: [Array], suites: [] } ], runtimeConfig: {} } +714ms
  cypress:server:reporter trying to load reporter: spec +2s
  cypress:server:reporter spec is Mocha reporter +0ms
  cypress:server:project onMocha start +7ms
  cypress:server:reporter got mocha event 'start' with args: [ { start: '2022-06-22T20:53:29.113Z' } ] +5ms
  cypress:server:project onMocha suite +4ms
  cypress:server:reporter got mocha event 'suite' with args: [ { id: 'r1', title: '', root: true, type: 'suite', file: 'cypress/component/Autocomplete.spec.tsx', retries: -1, _slow: 250 } ] +4ms
  cypress:server:project onMocha hook +39ms
  cypress:server:reporter got mocha event 'hook' with args: [ { id: 'r3', title: '"before all" hook', hookName: 'before all', hookId: 'h1', body: "() => {\n  cy.on('window:load', takeDOMSnapshot.init);\n}", type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite._createHook (http://localhost:8080/__cypress/runner/cypress_runner.js:176856:98)\n' + '    at Suite.../driver/node_modules/mocha/lib/suite.js.Suite.beforeAll (http://localhost:8080/__cypress/runner/cypress_runner.js:123812:19)\n' + '    at Suite.<computed> [as beforeAll] (http://localhost:8080/__cypress/runner/cypress_runner.js:176872:23)\n' + '    at before (http://localhost:8080/__cypress/runner/cypress_runner.js:117736:17)\n' + '    at eval (webpack:///./node_modules/happo-cypress/index.js?:4:1)\n' + '    at Object../node_modules/happo-cypress/index.js (http://localhost:8080/__cypress/src/2.js:3347:1)\n' + '    at __webpack_require__ (http://localhost:8080/__cypress/src/main.js:85:30)\n' + '    at eval (webpack:///./cypress/support/component.ts?:2:71)\n' + '    at Module../cypress/support/component.ts (http://localhost:8080/__cypress/src/5.js:23:1)' }, currentRetry: 0, retries: -1, _slow: 250 } ] +39ms
  cypress:server:project onMocha test:before:run +0ms
  cypress:server:reporter got mocha event 'test:before:run' with args: [ { _testConfig: { testConfigList: [], unverifiedTestConfig: {} }, id: 'r3', order: 1, title: 'renders', body: '() => {\n' + '    cov_2hkpj1t1fa().f[14]++;\n' + '    cov_2hkpj1t1fa().s[42]++;\n' + '    cy.mount( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(TestAutocomplete, null));\n' + '    cov_2hkpj1t1fa().s[43]++;\n' + "    cy.get('body').happoScreenshot();\n" + '  }', type: 'test', wallClockStartedAt: '2022-06-22T20:53:29.119Z', file: null, invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite.addTest (http://localhost:8080/__cypress/runner/cypress_runner.js:176767:93)\n' + '    at context.it.context.specify (http://localhost:8080/__cypress/runner/cypress_runner.js:117646:13)\n' + '    at http://localhost:8080/__cypress/runner/cypress_runner.js:176520:21\n' + '    at Suite.eval (webpack:///./cypress/component/Autocomplete.spec.tsx?:2437:3)\n' + '    at Object.create (http://localhost:8080/__cypress/runner/cypress_runner.js:117823:19)\n' + '    at context.describe.context.context (http://localhost:8080/__cypress/runner/cypress_runner.js:117599:27)\n' + '    at http://localhost:8080/__cypress/runner/cypress_runner.js:176520:21\n' + '    at eval (webpack:///./cypress/component/Autocomplete.spec.tsx?:2434:1)\n' + '    at Module../cypress/component/Autocomplete.spec.tsx (http://localhost:8080/__cypress/src/spec-2.js:11:1)' }, currentRetry: 0, retries: 0, _slow: 250 } ] +0ms
  cypress:server:socket-base automation:request get:cookies { domain: 'localhost' } +2s
  cypress:server:automation:cookies getting:cookies { domain: 'localhost' } +2s
  cypress:server:socket-base backend:request { eventName: 'reset:server:state', args: [] } +0ms
  cypress:server:remote-states resetting remote state +1s
  cypress:server:automation:cookies received get:cookies [] +1ms
  cypress:server:project onMocha hook end +5ms
  cypress:server:reporter got mocha event 'hook end' with args: [ { id: 'r3', title: '"before all" hook', hookName: 'before all', hookId: 'h1', body: "() => {\n  cy.on('window:load', takeDOMSnapshot.init);\n}", type: 'hook', duration: 43, file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite._createHook (http://localhost:8080/__cypress/runner/cypress_runner.js:176856:98)\n' + '    at Suite.../driver/node_modules/mocha/lib/suite.js.Suite.beforeAll (http://localhost:8080/__cypress/runner/cypress_runner.js:123812:19)\n' + '    at Suite.<computed> [as beforeAll] (http://localhost:8080/__cypress/runner/cypress_runner.js:176872:23)\n' + '    at before (http://localhost:8080/__cypress/runner/cypress_runner.js:117736:17)\n' + '    at eval (webpack:///./node_modules/happo-cypress/index.js?:4:1)\n' + '    at Object../node_modules/happo-cypress/index.js (http://localhost:8080/__cypress/src/2.js:3347:1)\n' + '    at __webpack_require__ (http://localhost:8080/__cypress/src/main.js:85:30)\n' + '    at eval (webpack:///./cypress/support/component.ts?:2:71)\n' + '    at Module../cypress/support/component.ts (http://localhost:8080/__cypress/src/5.js:23:1)' }, currentRetry: 0, retries: -1, _slow: 250 } ] +5ms
  cypress:server:project onMocha hook +5ms
  cypress:server:reporter got mocha event 'hook' with args: [ { id: 'r3', title: '"before all" hook', hookName: 'before all', hookId: 'h2', body: '() => {\n' + '    // we need to reset the coverage when running\n' + '    // in the interactive mode, otherwise the counters will\n' + '    // keep increasing every time we rerun the tests\n' + '    const logInstance = Cypress.log({\n' + "      name: 'Coverage',\n" + "      message: ['Reset [@cypress/code-coverage]']\n" + '    })\n' + '\n' + '    cy.task(\n' + "      'resetCoverage',\n" + '      {\n' + '        // @ts-ignore\n' + "        isInteractive: Cypress.config('isInteractive')\n" + '      },\n' + '      { log: false }\n' + '    ).then(() => {\n' + '      logInstance.end()\n' + '    })\n' + '  }', type: 'hook', file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite._createHook (http://localhost:8080/__cypress/runner/cypress_runner.js:176856:98)\n' + '    at Suite.../driver/node_modules/mocha/lib/suite.js.Suite.beforeAll (http://localhost:8080/__cypress/runner/cypress_runner.js:123812:19)\n' + '    at Suite.<computed> [as beforeAll] (http://localhost:8080/__cypress/runner/cypress_runner.js:176872:23)\n' + '    at before (http://localhost:8080/__cypress/runner/cypress_runner.js:117736:17)\n' + '    at registerHooks (webpack:///./node_modules/@cypress/code-coverage/support.js?:42:3)\n' + '    at eval (webpack:///./node_modules/@cypress/code-coverage/support.js?:237:3)\n' + '    at Object../node_modules/@cypress/code-coverage/support.js (http://localhost:8080/__cypress/src/2.js:44:1)\n' + '    at __webpack_require__ (http://localhost:8080/__cypress/src/main.js:85:30)\n' + '    at eval (webpack:///./node_modules/@toptal/davinci-qa/src/configs/cypress/support/index.js?:2:88)' }, currentRetry: 0, retries: -1, _slow: 250 } ] +5ms
  cypress:server:socket-base backend:request { eventName: 'task', args: [ { task: 'resetCoverage', arg: [Object], timeout: 60000 } ] } +9ms
  cypress:server:task run task resetCoverage with arg { isInteractive: false } +2s
  cypress:server:task result is: null +1ms
  cypress:server:project onMocha hook end +3ms
  cypress:server:reporter got mocha event 'hook end' with args: [ { id: 'r3', title: '"before all" hook', hookName: 'before all', hookId: 'h2', body: '() => {\n' + '    // we need to reset the coverage when running\n' + '    // in the interactive mode, otherwise the counters will\n' + '    // keep increasing every time we rerun the tests\n' + '    const logInstance = Cypress.log({\n' + "      name: 'Coverage',\n" + "      message: ['Reset [@cypress/code-coverage]']\n" + '    })\n' + '\n' + '    cy.task(\n' + "      'resetCoverage',\n" + '      {\n' + '        // @ts-ignore\n' + "        isInteractive: Cypress.config('isInteractive')\n" + '      },\n' + '      { log: false }\n' + '    ).then(() => {\n' + '      logInstance.end()\n' + '    })\n' + '  }', type: 'hook', duration: 8, file: 'cypress/component/Autocomplete.spec.tsx', invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite._createHook (http://localhost:8080/__cypress/runner/cypress_runner.js:176856:98)\n' + '    at Suite.../driver/node_modules/mocha/lib/suite.js.Suite.beforeAll (http://localhost:8080/__cypress/runner/cypress_runner.js:123812:19)\n' + '    at Suite.<computed> [as beforeAll] (http://localhost:8080/__cypress/runner/cypress_runner.js:176872:23)\n' + '    at before (http://localhost:8080/__cypress/runner/cypress_runner.js:117736:17)\n' + '    at registerHooks (webpack:///./node_modules/@cypress/code-coverage/support.js?:42:3)\n' + '    at eval (webpack:///./node_modules/@cypress/code-coverage/support.js?:237:3)\n' + '    at Object../node_modules/@cypress/code-coverage/support.js (http://localhost:8080/__cypress/src/2.js:44:1)\n' + '    at __webpack_require__ (http://localhost:8080/__cypress/src/main.js:85:30)\n' + '    at eval (webpack:///./node_modules/@toptal/davinci-qa/src/configs/cypress/support/index.js?:2:88)' }, currentRetry: 0, retries: -1, _slow: 250 } ] +3ms
  cypress:server:project onMocha suite +2ms
  cypress:server:reporter got mocha event 'suite' with args: [ { id: 'r2', title: 'Autocomplete', root: false, type: 'suite', file: null, invocationDetails: { function: 'Object.getInvocationDetails', fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js', originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js', line: 180642, column: 18, whitespace: '    ', stack: 'Error\n' + '    at Object.getInvocationDetails (http://localhost:8080/__cypress/runner/cypress_runner.js:180642:17)\n' + '    at Suite.addSuite (http://localhost:8080/__cypress/runner/cypress_runner.js:176799:94)\n' + '    at Function.../driver/node_modules/mocha/lib/suite.js.Suite.create (http://localhost:8080/__cypress/runner/cypress_runner.js:123595:10)\n' + '    at Object.create (http://localhost:8080/__cypress/runner/cypress_runner.js:117806:27)\n' + '    at context.describe.context.context (http://localhost:8080/__cypress/runner/cypress_runner.js:117599:27)\n' + '    at http://localhost:8080/__cypress/runner/cypress_runner.js:176520:21\n' + '    at eval (webpack:///./cypress/component/Autocomplete.spec.tsx?:2434:1)\n' + '    at Module../cypress/component/Autocomplete.spec.tsx (http://localhost:8080/__cypress/src/spec-2.js:11:1)\n' + '    at __webpack_require__ (http://localhost:8080/__cypress/src/main.js:85:30)' }, retries: -1, _slow: 250 } ] +2ms
  Autocomplete

Hi team, it’s finally merged, it’ll be in 10.6. Finally! Excited for this feature.

Surprise off cycle release… 10.6 is now out 🎉

@lmiller1990 I have tested it out in Picasso and it works perfectly! 🚀 🎉

I really enjoyed following this issue and checking how you are handling it, especially since you share your thought process when debugging!

Looking forward to this being released.

Thank you for your work! Keep rocking! 💪 🙇

Another update - this is getting close, binaries available for testing: https://github.com/cypress-io/cypress/commit/293a0f489bbbeae9ecc6d76053fa24eef77fc2de#comments

To use it, you need to enable it. It’s initially going out as an experimental feature. Example.

export default defineConfig({
  component: {
    experimentalSingleTabRunMode: true // <= this is the flag to enable the single tab run mode
  }
})

Hello folks, an update - trying to get this through: https://github.com/cypress-io/cypress/pull/23104. It’s awaiting internal review. It will likely have some edge cases on initial release - thus the experimental flag, but exactly what those limitations will be will clear when it lands.

We are facing a similar problem with component testing.

In our case we have a monorepo with a structure like:

custom-ui-framework. app-a (depends on custom-ui-framework). app-b (depends on custom-ui-framework). We are using:

cypress 10.3.1 + @cypress/vue2 1.0.1 vue 2.6.14. vite 2.9.14. We can notice that when running component tests on any package, all the components from the custom-ui-framework are being fetched, no matter if they are being used or not by the tests.

I attach the cypress and vite config just in case it is useful to you.

cypress.config.ts

export default defineConfig({
  component: {
    devServer: {
      framework: 'vue',
      bundler: 'vite',
    },
    specPattern: 'src/**/*ct.spec.{js,jsx,ts,tsx}',
    supportFile: 'cypress/support/component.ts',
    video: false,
  },
});

vite.config.ts

/// <reference types="vitest" />
import { defineConfig } from 'vite';
import { createVuePlugin } from 'vite-plugin-vue2';
import path from 'path';
import ViteFonts from 'vite-plugin-fonts';
import { visualizer } from 'rollup-plugin-visualizer';

// https://vitejs.dev/config/
export default defineConfig({
  build: {
    rollupOptions: {
      plugins: [
        visualizer({
          open: false,
          gzipSize: true,
        }),
      ],
    },
  },
  plugins: [
    createVuePlugin(),
    ViteFonts({
      google: {
        families: [
          {
            name: 'Inter',
            styles: 'wght@100;200;300;400;500;600;700;800;900',
          },
        ],
      },
    }),
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    },
  },
  test: {
    environment: 'jsdom',
    include: ['**/*.unit.spec.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
    setupFiles: ['./__tests__/setup.js'],
    coverage: {
      reporter: ['text', 'json', 'html'],
      include: ['src/composables', 'src/stores', 'src/utils'],
      all: true,
    },
  },
  server: {
    fs: {
      allow: ['..'],
    },
  },
});

Hello all, it looks like doing a significant change to how we run specs is going to be a more longer term project that ties in with the “Run All Specs” feature discussion. This project touches similar issues (how to run many specs quickly).

For a short term fix, it’s been suggested we have an opt in flag to replicate the functionality of CT (Component Testing) in 9.x, which is to run all specs in a single tab, sequentially. This would come with the caveats that are listed in the first post of Run All Specs. This would be for CT only - E2E never worked like this.

As for how to opt into this, It would likely be listed as experimental, so you’d opt into it - so something like experimentalComponentSingleSession. This will also allow for future experimentation, like using location.reload or an alternative strategy, such as those listed above.

I will post more updates as they come. Thanks for the patience everyone!

@TomasSlama thank you for the report, and thanks all for the corroborating comments. I have the picasso tests up and running and will report back my findings.

Ran the Darwin Arm64 build 3x on our two projects with and without the experimentalSingleTabRunMode flag. They saw an average 41% and 51% improvement to the total test duration times 🎉

Hi @lmiller1990! I just checked and when I set supportFile: false it does not import everything.

I just investigated a bit more and the root cause of the problem was that in our support/component.ts file, in our custom mount definition we were registering the router as in the documentation. As a result, all of the dependencies of all our views in the app where being fetched on mount.

Since for the component testing we don’t need the real routes (at least not most of the times) we have just changed it to use a mock router by default, e.g.:

Cypress.Commands.add(
  'mount',
  (component: Vue.ComponentOptions<any> | Vue.VueConstructor, options = {}) => {
    Vue.use(VueRouter);
    Vue.use(PiniaVuePlugin);

    options.router = options.router ||  new VueRouter({ routes: [], mode: 'abstract' });
    options.extensions = options.extensions || {};
    options.extensions.plugins = options.extensions.plugins || [];
    options.extensions.components = options.extensions.components || {};

    return mount(component, options);
  }
);

Thanks for your input!

The pre-release builds are only available for a few days. Maybe it’s expired. I can make a new one if needed. At this point, it’s pretty clear what’s slowing us down, though, I don’t see a ton of value in getting more testing in at this point.

Making these changes isn’t super easy, since there’s a lot of complexity here, but I’m bringing this up internally as a priority. I’ll post updates here w.r.t what we are doing, when it can expect to land, etc.

Re: ARM builds - yes they absolutely fly, although I am still on Intel, I’d like to make Intel fly, too.

@TomasSlama cool, thanks for the support and help testing!!

@wopian can you confirm your table info a bit? When you say 10.3.0 you are referring to my build (not the live 10.3.0 on npm?)

Those are some huge improvements, good to see!


Just to clarify a bit more here - unfortunately it’s not as simple as “just ship these changes”. Opening a new tab clears a lot of things and better isolates the specs, which is a feature of any good test runner. The original goal of this change was to be more in line with E2E - you can image it’d be confusing if CT and E2E diverge. I will find out exactly what we do better each spec and find out how to do it in a faster way than what we do now.

My next step is for me to dig deeper and isolate more closely what’s really killing performance - I think it’s more than just “creating a new tab”, but also things like teardown/setup/rendering the runner UI.

The end goal is to improve performance for both CT and E2E. The spec execution flow is at the core of Cypress. It needs a bit more investigation, but we are on the right track with this thread. We take this kind of regression (performance, and more importantly determinism and reliability) very seriously. Just to clarify, this is a performance regression for Component Testing - this change made E2E faster, since it use to spin up a new browser for each spec, now it just does a new tab.

I am out next week, but after that I’m going to look into a more detailed technical breakdown, then we can actually start moving forward with some updates. The Component Testing “alpha” label was there for reason, and I’d like to move out of “beta” sooner than than later, but that means exercising great caution around mission critical things like performance and spec isolation.

I will continue posting my updates here, I think it’s fine to take a little time as long as we are clear with communication. This is still my main focus and will be until it’s we are back to a comparable, if not faster, state than the 9.x Component Testing alpha.

@lmiller1990 I have tested on Picasso and the results are from 112s 👉 62s. Great news 🎉.

Thank you very much for your effort 🙇

@mverdaguer what does your support/component.ts look like? Vite should only fetch dependencies that are imported in some fashion. We are just a thin layer on top of Vite - although it’s definitely possible we’ve got a bug. I don’t see any obvious problem in your configuration.

If you do supportFile: false, does that stop the fetching? Just one idea to help debug. I suspect your issue isn’t directly related - are you experience this only after going from v9 -> v10? If so, it could be - if not, I’d recommend a new issue titled something like “Vite loading unrelated dependencies”, since it sounds like that’s closer to what you are experiencing.

Yes this issue is just for component tests.

The Vite Dev Server integration is only used for Component Tests, though - E2E does not use a dev server, so I don’t think Vite has anything to do with your problem.

Definitely worth opening a new issue, try to include:

  • when it got slow (Cypress 9->10)
  • cypress files (like cypress.json, cypress/plugins/index.js
  • OS

Interesting. New tab seems to be a no-go, but location.reload() (or some other single tab strategy) looks positive. I will link the repo and numbers in a moment.

The second benchmark doesn’t reload, so it’s not really an option. The third, location.reload() appears about 6x faster. Link.

Since we need to change the href, too, we might do document.location = .....?spec=newSpec for a similar behavior.


Basic summary of above:

Some specific exploration to avoid re-parsing cypress_runner.js, which takes a non trivial amount of time, was was conducted. Note that this was done in isolation to the runner - a minimal web page that does nothing but fetch and parse cypress_runner.js over and over was used for the benchmarks below. You can see the results here and the basic code is here. The README has instructions on running the benchmarks yourself.

  • Some benchmarks. We can potentially replace the new tab strategy with a single tab + document.location.reload or document.location.href = <next_spec_url> in the future. This might be faster than the current approach, since the browser does not re-parse cypress_runner.js in the same tab, but it does re-parse it when opening a new tab.

Here are some basic numbers:

Implementation Run 1-3 Run 98-100 Mean Time to Parse
New tab 617ms, 557ms, 407ms, 423ms, 412ms, 409ms 423ms
Single tab, no reload 553ms, 354ms, 88ms 58ms, 59ms, 55ms 67ms
Single tab, document.reload() 537ms, 356ms, 83ms 93ms, 88ms, 91ms 106ms