Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jest tests taking longer than they should #71

Open
thorakmedichi opened this issue Feb 28, 2019 · 2 comments
Open

Jest tests taking longer than they should #71

thorakmedichi opened this issue Feb 28, 2019 · 2 comments

Comments

@thorakmedichi
Copy link

thorakmedichi commented Feb 28, 2019

  • template name : (re-start)
  • template version : ??? from last month
  • react-native version: 0.55.4 (what came in this repo)
  • OS : Linux Mint
  • Platform causing error: all?? CI?

Step 3: Describe the problem (try to include screenshots):

Running yarn test or even just yarn test:native seems to take much longer than it should. Running locally on my machine, running in a docker container and running it GitLab CI/CD all do this, which leads me to think its some setup here.

Steps to reproduce:

I am not sure if it is one file or all or what. I have 8 test files and 32 tests... nothing big at all. One test that continually seems to take over 50 seconds to run is this component and this test. As you will see this is not a complex file or test.

Yet I continually get the following:
PASS src/components/__tests__/HR.test.js (52.81s)

Well... its actually more like this - again... none of these files is bigger than maybe 50 lines of code:

 PASS  src/common/__tests__/globalFunctions.test.js
 PASS  src/common/actions/__tests__/logs.test.js
 PASS  src/common/immutability-helper/__tests__/extensions.test.js
 PASS  src/common/reducers/__tests__/logs.test.js (13.786s)
 PASS  src/components/__tests__/HR.test.js (52.81s)
 PASS  src/components/__tests__/Counter.test.js (53.169s)
 PASS  src/components/inputs/__tests__/Input.test.js (53.27s)
 PASS  src/components/inputs/__tests__/SelectList.test.js (57.242s)

HR.js

const HR = ({ color, style }) => (
    <View style={[styles.underline, { borderColor: color }, style]} />
);

HR.propTypes = {
    color: PropTypes.string,
    style: ViewPropTypes.style
};

HR.defaultProps = {
    color: 'white',
    style: null
};

export default HR;

HR.test.js

import React from 'react';
import Adapter from 'enzyme-adapter-react-16';

import { View } from 'react-native';
import Enzyme, { shallow } from 'enzyme';

// Components
import HR from '../HR';

Enzyme.configure({ adapter: new Adapter() });

describe('HR', () => {
    test('renders the HR component', () => {
        const wrapper = shallow(<HR />);

        expect(wrapper.find(View)).toHaveLength(1);
        expect(wrapper.find(View).props().style[1].borderColor).toEqual('white');
    });

    test('renders the HR component with custom color prop', () => {
        const wrapper = shallow(<HR color="#3F3F3F" />);

        expect(wrapper.find(View)).toHaveLength(1);
        expect(wrapper.find(View).props().style[1].borderColor).toEqual('#3F3F3F');
    });
});

Observed Results:

When running locally I see PASS src/components/__tests__/HR.test.js (52.81s)

When watching in GitLab CI/CD I get

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with '--detectOpenHandles' to troubleshoot this issue.

--detectOpenHandles does nothing given all the routing through config files that you have setup. So not sure how to implement that.

Expected Results:

The test should run in a second or two... not 50+ seconds

Additional information

Here are the contents of my gitlab-ci.yml file

stages:
  - lint
  - test

lint:
  stage: lint
  image: node:10.15
  script:
    - yarn
    - yarn lint

test:
  stage: test
  image: node:10.15
  script:
    - yarn
    - yarn test:native --ci
@thorakmedichi
Copy link
Author

thorakmedichi commented Mar 1, 2019

Even if you can guide me on how to use --detectOpenHandles

I cant seem to run just jest as I keep getting ReferenceError: babelHelpers is not defined on every test

@thorakmedichi
Copy link
Author

So for anyone following this I hacked this to solve my issue for now. I decided to just go around the entire re-start setup to solve the issue. It was the only way I could solve it with no direction from the repo owners.

So I changed package.json script test to be jest instead of npm run test:native && npm run test:web

Then I created my own jest.config.js file and put it in my root dir

/* eslint-disable max-len, quote-props */

// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html

module.exports = {
    notify: true,

    // A preset that is used as a base for Jest's configuration
    // preset: 'react-native-web',

    // The test environment that will be used for testing
    testEnvironment: 'node',

    // Automatically clear mock calls and instances between every test
    clearMocks: true,

    // The directory where Jest should output its coverage files
    coverageDirectory: 'coverage',
    // An array of regexp pattern strings used to skip coverage collection
    coveragePathIgnorePatterns: [
        '/node_modules/',
        '/prop-definitions/',
        '/images/',
        '/styles/',
        '/test-data/',
        '/mocks/',
        '/action-types/'
    ],

    // A map from regular expressions to paths to transformers
    transform: {
        // '^.+\\.js$': '<rootDir>/node_modules/react-native/jest/preprocessor.js'
        '^.+\\.jsx?$': 'babel-jest',
    },

    // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
    transformIgnorePatterns: [
        // 'node_modules/(?!(jest-)?react-native|react-navigation)',
        'node_modules/(?!react-(.*-)?native(-.*)?)'
    ],

    testPathIgnorePatterns: [
        '/fixtures/',
        '/scripts/'
    ],
    moduleNameMapper: {
        // '.*\\.(svg|png|jpg|gif|ttf)$': '<rootDir>/flow/stub/url-loader.js',
        // 'react-native': '<rootDir>/node_modules/react-native-web',
        '^react-native$': 'react-native-web',
        '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'identity-obj-proxy'
    },
    moduleFileExtensions: [
        'web.js',
        'js',
        'json'
    ]
};

Then for gitlab runner I use yarn jest --ci --detectOpenHandles --maxWorkers=10 --forceExit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant