feat(test-runner): export reporter api as `@playwright/test/reporter` (#7692)
This commit is contained in:
		
							parent
							
								
									3c6b058e2b
								
							
						
					
					
						commit
						167db03f05
					
				|  | @ -22,10 +22,13 @@ lib/**/injected/ | |||
| # Include generated types and entrypoint. | ||||
| !types/* | ||||
| !index.d.ts | ||||
| !reporter.d.ts | ||||
| # Include main entrypoint. | ||||
| !index.js | ||||
| !reporter.js | ||||
| # Include main entrypoint for ES Modules. | ||||
| !index.mjs | ||||
| !reporter.mjs | ||||
| # Include installer. | ||||
| !install.js | ||||
| # Include essentials. | ||||
|  |  | |||
|  | @ -53,6 +53,7 @@ function copy_test_scripts { | |||
|   cp "${SCRIPTS_PATH}/driver-client.js" . | ||||
|   cp "${SCRIPTS_PATH}/sample.spec.js" . | ||||
|   cp "${SCRIPTS_PATH}/read-json-report.js" . | ||||
|   cp "${SCRIPTS_PATH}/playwright-test-types.ts" . | ||||
| } | ||||
| 
 | ||||
| function run_tests { | ||||
|  | @ -107,6 +108,7 @@ function test_screencast { | |||
| 
 | ||||
| function test_typescript_types { | ||||
|   initialize_test "${FUNCNAME[0]}" | ||||
|   copy_test_scripts | ||||
| 
 | ||||
|   # install all packages. | ||||
|   PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_CORE_TGZ} | ||||
|  | @ -114,6 +116,7 @@ function test_typescript_types { | |||
|   PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_FIREFOX_TGZ} | ||||
|   PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_WEBKIT_TGZ} | ||||
|   PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_CHROMIUM_TGZ} | ||||
|   PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_TEST_TGZ} | ||||
| 
 | ||||
|   # typecheck all packages. | ||||
|   for PKG_NAME in "playwright" \ | ||||
|  | @ -126,6 +129,9 @@ function test_typescript_types { | |||
|     echo "import { Page } from '${PKG_NAME}';" > "${PKG_NAME}.ts" && npx -p typescript@3.7.5 tsc "${PKG_NAME}.ts" | ||||
|   done; | ||||
| 
 | ||||
|   echo "Checking types of @playwright/test" | ||||
|   echo npx -p typescript@3.7.5 tsc "playwright-test-types.ts" | ||||
| 
 | ||||
|   echo "${FUNCNAME[0]} success" | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,57 @@ | |||
| /** | ||||
|  * Copyright (c) Microsoft Corporation. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import { test, expect } from '@playwright/test'; | ||||
| import { Reporter, Test } from '@playwright/test/reporter'; | ||||
| 
 | ||||
| test.use({ locale: 'en-US' }); | ||||
| 
 | ||||
| test.describe('block', () => { | ||||
|   test.beforeAll(async ({ browser }) => { | ||||
|   }); | ||||
|   test.afterAll(async ({ browser }) => { | ||||
|   }); | ||||
|   test.beforeEach(async ({ page }) => { | ||||
|   }); | ||||
|   test.afterEach(async ({ page }) => { | ||||
|   }); | ||||
|   test('should work', async ({ page, browserName }, testInfo) => { | ||||
|     test.skip(browserName === 'chromium'); | ||||
|     await page.click(testInfo.title); | ||||
|     testInfo.annotations.push({ type: 'foo' }); | ||||
|     await page.fill(testInfo.outputPath('foo', 'bar'), testInfo.outputDir); | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| const test2 = test.extend<{ foo: string, bar: number }>({ | ||||
|   foo: '123', | ||||
|   bar: async ({ foo }, use) => { | ||||
|     await use(parseInt(foo, 10)); | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| test2('should work 2', async ({ foo, bar }) => { | ||||
|   bar += parseInt(foo, 10); | ||||
|   expect(bar).toBe(123 * 2); | ||||
| }); | ||||
| 
 | ||||
| export class MyReporter implements Reporter { | ||||
|   onTestBegin(test: Test) { | ||||
|     test.titlePath().slice(); | ||||
|     if (test.results[0].status === test.expectedStatus) | ||||
|       console.log(`Nice test ${test.title} at ${test.location.file}`); | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,17 @@ | |||
| /** | ||||
|  * Copyright (c) Microsoft Corporation. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| export * from './types/testReporter'; | ||||
|  | @ -0,0 +1,17 @@ | |||
| /** | ||||
|  * Copyright (c) Microsoft Corporation. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| // We only export types in reporter.d.ts.
 | ||||
|  | @ -0,0 +1,17 @@ | |||
| /** | ||||
|  * Copyright (c) Microsoft Corporation. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| // We only export types in reporter.d.ts.
 | ||||
|  | @ -18,7 +18,7 @@ import child_process from 'child_process'; | |||
| import path from 'path'; | ||||
| import { EventEmitter } from 'events'; | ||||
| import { RunPayload, TestBeginPayload, TestEndPayload, DonePayload, TestOutputPayload, WorkerInitParams } from './ipc'; | ||||
| import type { TestResult, Reporter, TestStatus } from './reporter'; | ||||
| import type { TestResult, Reporter, TestStatus } from '../../types/testReporter'; | ||||
| import { Suite, Test } from './test'; | ||||
| import { Loader } from './loader'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import type { TestError } from './reporter'; | ||||
| import type { TestError } from '../../types/testReporter'; | ||||
| import type { Config, TestStatus } from './types'; | ||||
| 
 | ||||
| export type SerializedLoaderData = { | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ import { SerializedLoaderData } from './ipc'; | |||
| import * as path from 'path'; | ||||
| import * as url from 'url'; | ||||
| import { ProjectImpl } from './project'; | ||||
| import { Reporter } from './reporter'; | ||||
| import { Reporter } from '../../types/testReporter'; | ||||
| import { LaunchConfig } from '../../types/test'; | ||||
| 
 | ||||
| export class Loader { | ||||
|  |  | |||
|  | @ -1,66 +0,0 @@ | |||
| /** | ||||
|  * Copyright Microsoft Corporation. All rights reserved. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import type { FullConfig, TestStatus, TestError } from './types'; | ||||
| export type { FullConfig, TestStatus, TestError } from './types'; | ||||
| 
 | ||||
| export interface Location { | ||||
|   file: string; | ||||
|   line: number; | ||||
|   column: number; | ||||
| } | ||||
| export interface Suite { | ||||
|   title: string; | ||||
|   location: Location; | ||||
|   suites: Suite[]; | ||||
|   tests: Test[]; | ||||
|   titlePath(): string[]; | ||||
|   allTests(): Test[]; | ||||
| } | ||||
| export interface Test { | ||||
|   title: string; | ||||
|   location: Location; | ||||
|   results: TestResult[]; | ||||
|   expectedStatus: TestStatus; | ||||
|   timeout: number; | ||||
|   annotations: { type: string, description?: string }[]; | ||||
|   retries: number; | ||||
|   titlePath(): string[]; | ||||
|   status(): 'skipped' | 'expected' | 'unexpected' | 'flaky'; | ||||
|   ok(): boolean; | ||||
| } | ||||
| export interface TestResult { | ||||
|   retry: number; | ||||
|   workerIndex: number, | ||||
|   duration: number; | ||||
|   status?: TestStatus; | ||||
|   error?: TestError; | ||||
|   attachments: { name: string, path?: string, body?: Buffer, contentType: string }[]; | ||||
|   stdout: (string | Buffer)[]; | ||||
|   stderr: (string | Buffer)[]; | ||||
| } | ||||
| export interface FullResult { | ||||
|   status: 'passed' | 'failed' | 'timedout' | 'interrupted'; | ||||
| } | ||||
| export interface Reporter { | ||||
|   onBegin?(config: FullConfig, suite: Suite): void; | ||||
|   onTestBegin?(test: Test): void; | ||||
|   onStdOut?(chunk: string | Buffer, test?: Test): void; | ||||
|   onStdErr?(chunk: string | Buffer, test?: Test): void; | ||||
|   onTestEnd?(test: Test, result: TestResult): void; | ||||
|   onError?(error: TestError): void; | ||||
|   onEnd?(result: FullResult): void | Promise<void>; | ||||
| } | ||||
|  | @ -21,7 +21,7 @@ import fs from 'fs'; | |||
| import milliseconds from 'ms'; | ||||
| import path from 'path'; | ||||
| import StackUtils from 'stack-utils'; | ||||
| import { FullConfig, TestStatus, Test, Suite, TestResult, TestError, Reporter, FullResult } from '../reporter'; | ||||
| import { FullConfig, TestStatus, Test, Suite, TestResult, TestError, Reporter, FullResult } from '../../../types/testReporter'; | ||||
| 
 | ||||
| const stackUtils = new StackUtils(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| import colors from 'colors/safe'; | ||||
| import { BaseReporter } from './base'; | ||||
| import { FullResult, Test, TestResult } from '../reporter'; | ||||
| import { FullResult, Test, TestResult } from '../../../types/testReporter'; | ||||
| 
 | ||||
| class DotReporter extends BaseReporter { | ||||
|   private _counter = 0; | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import { Reporter } from '../reporter'; | ||||
| import { Reporter } from '../../../types/testReporter'; | ||||
| 
 | ||||
| class EmptyReporter implements Reporter { | ||||
| } | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| import fs from 'fs'; | ||||
| import path from 'path'; | ||||
| import { FullConfig, Test, Suite, TestResult, TestError, FullResult, TestStatus, Location, Reporter } from '../reporter'; | ||||
| import { FullConfig, Test, Suite, TestResult, TestError, FullResult, TestStatus, Location, Reporter } from '../../../types/testReporter'; | ||||
| 
 | ||||
| export interface JSONReport { | ||||
|   config: Omit<FullConfig, 'projects'> & { | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| import fs from 'fs'; | ||||
| import path from 'path'; | ||||
| import { FullConfig, FullResult, Reporter, Suite, Test } from '../reporter'; | ||||
| import { FullConfig, FullResult, Reporter, Suite, Test } from '../../../types/testReporter'; | ||||
| import { monotonicTime } from '../util'; | ||||
| import { formatFailure, formatTestTitle, stripAscii } from './base'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| import colors from 'colors/safe'; | ||||
| import { BaseReporter, formatFailure, formatTestTitle } from './base'; | ||||
| import { FullConfig, Test, Suite, TestResult, FullResult } from '../reporter'; | ||||
| import { FullConfig, Test, Suite, TestResult, FullResult } from '../../../types/testReporter'; | ||||
| 
 | ||||
| class LineReporter extends BaseReporter { | ||||
|   private _total = 0; | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ import colors from 'colors/safe'; | |||
| // @ts-ignore
 | ||||
| import milliseconds from 'ms'; | ||||
| import { BaseReporter, formatTestTitle } from './base'; | ||||
| import { FullConfig, FullResult, Suite, Test, TestResult } from '../reporter'; | ||||
| import { FullConfig, FullResult, Suite, Test, TestResult } from '../../../types/testReporter'; | ||||
| 
 | ||||
| // Allow it in the Visual Studio Code Terminal and the new Windows Terminal
 | ||||
| const DOES_NOT_SUPPORT_UTF8_IN_TERMINAL = process.platform === 'win32' && process.env.TERM_PROGRAM !== 'vscode' && !process.env.WT_SESSION; | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import { FullConfig, Suite, Test, TestError, TestResult, Reporter, FullResult } from '../reporter'; | ||||
| import { FullConfig, Suite, Test, TestError, TestResult, Reporter, FullResult } from '../../../types/testReporter'; | ||||
| 
 | ||||
| export class Multiplexer implements Reporter { | ||||
|   private _reporters: Reporter[]; | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ import { Dispatcher } from './dispatcher'; | |||
| import { createMatcher, FilePatternFilter, monotonicTime, raceAgainstDeadline } from './util'; | ||||
| import { Test, Suite } from './test'; | ||||
| import { Loader } from './loader'; | ||||
| import { Reporter } from './reporter'; | ||||
| import { Reporter } from '../../types/testReporter'; | ||||
| import { Multiplexer } from './reporters/multiplexer'; | ||||
| import DotReporter from './reporters/dot'; | ||||
| import LineReporter from './reporters/line'; | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
|  */ | ||||
| 
 | ||||
| import type { FixturePool } from './fixtures'; | ||||
| import * as reporterTypes from './reporter'; | ||||
| import * as reporterTypes from '../../types/testReporter'; | ||||
| import type { TestTypeImpl } from './testType'; | ||||
| import { Annotations, Location } from './types'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -15,9 +15,9 @@ | |||
|  */ | ||||
| 
 | ||||
| import type { Fixtures } from '../../types/test'; | ||||
| import type { Location } from './reporter'; | ||||
| import type { Location } from '../../types/testReporter'; | ||||
| export * from '../../types/test'; | ||||
| export { Location } from './reporter'; | ||||
| export { Location } from '../../types/testReporter'; | ||||
| 
 | ||||
| export type FixturesWithLocation = { | ||||
|   fixtures: Fixtures; | ||||
|  |  | |||
|  | @ -0,0 +1,259 @@ | |||
| /** | ||||
|  * Copyright (c) Microsoft Corporation. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import type { FullConfig, TestStatus, TestError } from './test'; | ||||
| export type { FullConfig, TestStatus, TestError } from './test'; | ||||
| 
 | ||||
| /** | ||||
|  * Test or Suite location where it was defined. | ||||
|  */ | ||||
| export interface Location { | ||||
|   /** | ||||
|    * Path to the file. | ||||
|    */ | ||||
|   file: string; | ||||
| 
 | ||||
|   /** | ||||
|    * Line number in the file. | ||||
|    */ | ||||
|   line: number; | ||||
| 
 | ||||
|   /** | ||||
|    * Column number in the file. | ||||
|    */ | ||||
|   column: number; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * A group of tests. All tests are reported in the following hierarchy: | ||||
|  * - Root suite | ||||
|  *   - Project suite #1 (for each project) | ||||
|  *     - File suite #1 (for each file in the project) | ||||
|  *       - Suites for any describe() calls | ||||
|  *         - Test #1 defined in the file or describe() group | ||||
|  *         - Test #2 | ||||
|  *         ... < more tests > | ||||
|  *     - File suite #2 | ||||
|  *     ... < more file suites > | ||||
|  *   - Second project suite | ||||
|  *   ... < more project suites > | ||||
|  */ | ||||
| export interface Suite { | ||||
|   /** | ||||
|    * Suite title: | ||||
|    *   - Empty for root suite. | ||||
|    *   - Project name for project suite. | ||||
|    *   - File path for file suite. | ||||
|    *   - Title passed to describe() for describe suites | ||||
|    */ | ||||
|   title: string; | ||||
| 
 | ||||
|   /** | ||||
|    * Location where the suite is defined. | ||||
|    */ | ||||
|   location: Location; | ||||
| 
 | ||||
|   /** | ||||
|    * Child suites. | ||||
|    */ | ||||
|   suites: Suite[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Tests in the suite. Note that only tests defined directly in this suite | ||||
|    * are in the list. Any tests defined in nested describe() groups are listed | ||||
|    * in the child `suites`. | ||||
|    */ | ||||
|   tests: Test[]; | ||||
| 
 | ||||
|   /** | ||||
|    * A list of titles from the root down to this suite. | ||||
|    */ | ||||
|   titlePath(): string[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Returns the list of all tests in this suite and its descendants. | ||||
|    */ | ||||
|   allTests(): Test[]; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * A test, corresponds to test() call in a test file. When a single test() is | ||||
|  * running in multiple projects (or repeated multiple times), it will have multiple | ||||
|  * `Test` objects in corresponding projects' suites. | ||||
|  */ | ||||
| export interface Test { | ||||
|   /** | ||||
|    * Test title as passed to the test() call. | ||||
|    */ | ||||
|   title: string; | ||||
| 
 | ||||
|   /** | ||||
|    * Location where the test is defined. | ||||
|    */ | ||||
|   location: Location; | ||||
| 
 | ||||
|   /** | ||||
|    * A list of titles from the root down to this test. | ||||
|    */ | ||||
|   titlePath(): string[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Expected status. | ||||
|    *   - Tests marked as test.skip() or test.fixme() are expected to be 'skipped'. | ||||
|    *   - Tests marked as test.fail() are expected to be 'failed'. | ||||
|    *   - Other tests are expected to be 'passed'. | ||||
|    */ | ||||
|   expectedStatus: TestStatus; | ||||
| 
 | ||||
|   /** | ||||
|    * The timeout given to the test. Affected by timeout in the configuration file, | ||||
|    * and calls to test.setTimeout() or test.slow(). | ||||
|    */ | ||||
|   timeout: number; | ||||
| 
 | ||||
|   /** | ||||
|    * Annotations collected for this test. For example, calling | ||||
|    * `test.skip(true, 'just because')` will produce an annotation | ||||
|    * `{ type: 'skip', description: 'just because' }`. | ||||
|    */ | ||||
|   annotations: { type: string, description?: string }[]; | ||||
| 
 | ||||
|   /** | ||||
|    * The maxmium number of retries given to this test in the configuration. | ||||
|    */ | ||||
|   retries: number; | ||||
| 
 | ||||
|   /** | ||||
|    * Results for each run of this test. | ||||
|    */ | ||||
|   results: TestResult[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Overall test status. | ||||
|    */ | ||||
|   status(): 'skipped' | 'expected' | 'unexpected' | 'flaky'; | ||||
| 
 | ||||
|   /** | ||||
|    * Whether the test is considered running fine. | ||||
|    * Non-ok tests fail the test run with non-zero exit code. | ||||
|    */ | ||||
|   ok(): boolean; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * A result of a single test run. | ||||
|  */ | ||||
| export interface TestResult { | ||||
|   /** | ||||
|    * When test is retries multiple times, each retry attempt is given a sequential number. | ||||
|    */ | ||||
|   retry: number; | ||||
| 
 | ||||
|   /** | ||||
|    * Index of the worker where the test was run. | ||||
|    */ | ||||
|   workerIndex: number, | ||||
| 
 | ||||
|   /** | ||||
|    * Running time in milliseconds. | ||||
|    */ | ||||
|   duration: number; | ||||
| 
 | ||||
|   /** | ||||
|    * The status of this test result. | ||||
|    */ | ||||
|   status?: TestStatus; | ||||
| 
 | ||||
|   /** | ||||
|    * An error from this test result, if any. | ||||
|    */ | ||||
|   error?: TestError; | ||||
| 
 | ||||
|   /** | ||||
|    * Any attachments created during the test run. | ||||
|    */ | ||||
|   attachments: { name: string, path?: string, body?: Buffer, contentType: string }[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Anything written to the standard output during the test run. | ||||
|    */ | ||||
|   stdout: (string | Buffer)[]; | ||||
| 
 | ||||
|   /** | ||||
|    * Anything written to the standard error during the test run. | ||||
|    */ | ||||
|   stderr: (string | Buffer)[]; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Result of the full test run. | ||||
|  */ | ||||
| export interface FullResult { | ||||
|   /** | ||||
|    * Status: | ||||
|    *   - 'passed' - everything went as expected. | ||||
|    *   - 'failed' - any test has failed. | ||||
|    *   - 'timedout' - the global time has been reached. | ||||
|    *   - 'interrupted' - interrupted by the user. | ||||
|    */ | ||||
|   status: 'passed' | 'failed' | 'timedout' | 'interrupted'; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Test runner notifies reporter about various events during the test run. | ||||
|  */ | ||||
| export interface Reporter { | ||||
|   /** | ||||
|    * Called once before running tests. | ||||
|    * All tests have been already discovered and put into a hierarchy, see `Suite` description. | ||||
|    */ | ||||
|   onBegin?(config: FullConfig, suite: Suite): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called after a test has been started in the worker process. | ||||
|    */ | ||||
|   onTestBegin?(test: Test): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called when something has been written to the standard output in the worker process. | ||||
|    * When `test` is given, output happened while the test was running. | ||||
|    */ | ||||
|   onStdOut?(chunk: string | Buffer, test?: Test): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called when something has been written to the standard error in the worker process. | ||||
|    * When `test` is given, output happened while the test was running. | ||||
|    */ | ||||
|   onStdErr?(chunk: string | Buffer, test?: Test): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called after a test has been finished in the worker process. | ||||
|    */ | ||||
|   onTestEnd?(test: Test, result: TestResult): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called on some global error, for example unhandled expection in the worker process. | ||||
|    */ | ||||
|   onError?(error: TestError): void; | ||||
| 
 | ||||
|   /** | ||||
|    * Called after all tests has been run, or when testing has been interrupted. | ||||
|    */ | ||||
|   onEnd?(result: FullResult): void | Promise<void>; | ||||
| } | ||||
| 
 | ||||
| // This is required to not export everything by default. See https://github.com/Microsoft/TypeScript/issues/19545#issuecomment-340490459
 | ||||
| export {}; | ||||
		Loading…
	
		Reference in New Issue