puppeteer/utils/testrunner
Andrey Lushnikov a5db6d412c
test: migrate test.js to support concurrent test execution (#1531)
This patch migrates tests so that they can be run concurrently.

- By default, tests still run in one thread.
- To run tests in 4 parallel threads, run node test/test.js -j 4 or npm run unit -- -j 4
- Environment variable PPTR_PARALLEL_TESTS could be set to override default parallelization

Every test gets passed in a state. State is set up in the beforeAll and beforeEach callbacks,
and should be teared down in the afterAll and afterEach callbacks.

By default, state has a parallelIndex variable initialized that defines the thread index that runs the execution.
2017-12-12 13:34:21 -08:00
..
examples tests: drop jasmine test runner (#1519) 2017-12-07 16:37:22 -08:00
index.js tests: drop jasmine test runner (#1519) 2017-12-07 16:37:22 -08:00
Matchers.js tests: drop jasmine test runner (#1519) 2017-12-07 16:37:22 -08:00
Multimap.js tests: drop jasmine test runner (#1519) 2017-12-07 16:37:22 -08:00
README.md test: migrate test.js to support concurrent test execution (#1531) 2017-12-12 13:34:21 -08:00
Reporter.js tests: drop jasmine test runner (#1519) 2017-12-07 16:37:22 -08:00
TestRunner.js test: migrate test.js to support concurrent test execution (#1531) 2017-12-12 13:34:21 -08:00

TestRunner

  • testrunner is a library: no additional binary required; tests are node.js scripts
  • parallel wrt IO operations
  • supports async/await
  • modular
  • well-isolated state per execution thread

Example

const {TestRunner, Reporter, Matchers} = require('../utils/testrunner');

// Runner holds and runs all the tests
const runner = new TestRunner({
  parallel: 2, // run 2 parallel threads
  timeout: 1000, // setup timeout of 1 second per test
});
// Simple expect-like matchers
const {expect} = new Matchers();

// Extract jasmine-like DSL into the global namespace
const {describe, xdescribe, fdescribe} = runner;
const {it, fit, xit} = runner;
const {beforeAll, beforeEach, afterAll, afterEach} = runner;

beforeAll(state => {
  state.parallelIndex; // either 0 or 1 in this example, depending on the executing thread
  state.foo = 'bar'; // set state for every test
});

describe('math', () => {
  it('to be sane', async (state, test) => {
    state.parallel; // Very first test will always be ran by the 0's thread
    state.foo; // this will be 'bar'
    expect(2 + 2).toBe(4);
  });
});

// Reporter subscribes to TestRunner events and displays information in terminal
const reporter = new Reporter(runner);

// Run all tests.
runner.run();