feat(test runner): introduce test.describe.fixme (#16059)

This commit is contained in:
Dmitry Gozman 2022-07-29 12:44:22 -07:00 committed by GitHub
parent 809002df60
commit e830fe821d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 85 additions and 3 deletions

View File

@ -350,6 +350,41 @@ test('runs second', async ({ page }) => {});
## method: Test.describe.fixme
* since: v1.25
Declares a test group similarly to [`method: Test.describe#1`]. Tests in this group are maked as "fixme" and will not be executed.
```js tab=js-js
test.describe.fixme('broken tests', () => {
test('example', async ({ page }) => {
// This test will not run
});
});
```
```js tab=js-ts
test.describe.fixme('broken tests', () => {
test('example', async ({ page }) => {
// This test will not run
});
});
```
### param: Test.describe.fixme.title
* since: v1.25
- `title` <[string]>
Group title.
### param: Test.describe.fixme.callback
* since: v1.25
- `callback` <[function]>
A callback that is run immediately when calling [`method: Test.describe.fixme`]. Any tests added in this callback will belong to the group, and will not be run.
## method: Test.describe.only
* since: v1.10

View File

@ -37,6 +37,7 @@ export class TestTypeImpl {
test.describe = wrapFunctionWithLocation(this._describe.bind(this, 'default'));
test.describe.only = wrapFunctionWithLocation(this._describe.bind(this, 'only'));
test.describe.configure = wrapFunctionWithLocation(this._configure.bind(this));
test.describe.fixme = wrapFunctionWithLocation(this._describe.bind(this, 'fixme'));
test.describe.parallel = wrapFunctionWithLocation(this._describe.bind(this, 'parallel'));
test.describe.parallel.only = wrapFunctionWithLocation(this._describe.bind(this, 'parallel.only'));
test.describe.serial = wrapFunctionWithLocation(this._describe.bind(this, 'serial'));
@ -98,7 +99,7 @@ export class TestTypeImpl {
}
}
private _describe(type: 'default' | 'only' | 'serial' | 'serial.only' | 'parallel' | 'parallel.only' | 'skip', location: Location, title: string | Function, fn?: Function) {
private _describe(type: 'default' | 'only' | 'serial' | 'serial.only' | 'parallel' | 'parallel.only' | 'skip' | 'fixme', location: Location, title: string | Function, fn?: Function) {
throwIfRunningInsideJest();
const suite = this._ensureCurrentSuite(location, 'test.describe()');
@ -118,9 +119,9 @@ export class TestTypeImpl {
child._parallelMode = 'serial';
if (type === 'parallel' || type === 'parallel.only')
child._parallelMode = 'parallel';
if (type === 'skip') {
if (type === 'skip' || type === 'fixme') {
child._skipped = true;
child._annotations.push({ type: 'skip' });
child._annotations.push({ type });
}
for (let parent: Suite | undefined = suite; parent; parent = parent.parent) {

View File

@ -1899,6 +1899,24 @@ export interface TestType<TestArgs extends KeyValue, WorkerArgs extends KeyValue
*/
skip: SuiteFunction;
/**
* Declares a test group similarly to
* [test.describe(title, callback)](https://playwright.dev/docs/api/class-test#test-describe-1). Tests in this group are
* maked as "fixme" and will not be executed.
*
* ```js
* test.describe.fixme('broken tests', () => {
* test('example', async ({ page }) => {
* // This test will not run
* });
* });
* ```
*
* @param title Group title.
* @param callback A callback that is run immediately when calling [test.describe.fixme(title, callback)](https://playwright.dev/docs/api/class-test#test-describe-fixme). Any tests added
* in this callback will belong to the group, and will not be run.
*/
fixme: SuiteFunction;
/**
* Declares a group of tests that should always be run serially. If one of the tests fails, all subsequent tests are
* skipped. All tests in a group are retried together.
*

View File

@ -470,3 +470,29 @@ test('should support describe.skip', async ({ runInlineTest }) => {
expect(result.skipped).toBe(3);
expect(result.output).toContain('heytest4');
});
test('should support describe.fixme', async ({ runInlineTest }) => {
const result = await runInlineTest({
'nested-skip.spec.js': `
const { test } = pwt;
test.describe.fixme('skipped', () => {
test.describe('nested', () => {
test('test1', () => {});
});
test('test2', () => {});
});
test.describe('not skipped', () => {
test.describe.fixme('skipped', () => {
test('test4', () => {});
});
test('test4', () => {
console.log('heytest4');
});
});
`
});
expect(result.exitCode).toBe(0);
expect(result.passed).toBe(1);
expect(result.skipped).toBe(3);
expect(result.output).toContain('heytest4');
});

View File

@ -40,6 +40,7 @@ test('basics should work', async ({ runTSC }) => {
test.describe.serial('suite', () => {});
test.describe.serial.only('suite', () => {});
test.describe.skip('suite', () => {});
test.describe.fixme('suite', () => {});
// @ts-expect-error
test.foo();
`

View File

@ -121,6 +121,7 @@ export interface TestType<TestArgs extends KeyValue, WorkerArgs extends KeyValue
describe: SuiteFunction & {
only: SuiteFunction;
skip: SuiteFunction;
fixme: SuiteFunction;
serial: SuiteFunction & {
only: SuiteFunction;
};