mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Copyright 2017 Google Inc. 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.
 | |
|  */
 | |
| 
 | |
| const path = require('path');
 | |
| const { TestRunner, Result, TestResult } = require('./TestRunner');
 | |
| const { TestCollector, FocusedFilter, Repeater } = require('./TestCollector');
 | |
| const Reporter = require('./Reporter');
 | |
| const { Matchers } = require('./Matchers');
 | |
| 
 | |
| class DefaultTestRunner {
 | |
|   constructor(options = {}) {
 | |
|     const {
 | |
|       // Our options.
 | |
|       crashIfTestsAreFocusedOnCI = true,
 | |
|       exit = true,
 | |
|       reporter = true,
 | |
|       // Collector options.
 | |
|       timeout,
 | |
|       // Runner options.
 | |
|       parallel = 1,
 | |
|       breakOnFailure,
 | |
|       totalTimeout,
 | |
|       hookTimeout = timeout,
 | |
|       // Reporting options.
 | |
|       showSlowTests,
 | |
|       showMarkedAsFailingTests,
 | |
|       verbose,
 | |
|       summary,
 | |
|       lineBreak,
 | |
|     } = options;
 | |
| 
 | |
|     this._crashIfTestsAreFocusedOnCI = crashIfTestsAreFocusedOnCI;
 | |
|     this._exit = exit;
 | |
|     this._parallel = parallel;
 | |
|     this._breakOnFailure = breakOnFailure;
 | |
|     this._totalTimeout = totalTimeout;
 | |
|     this._hookTimeout = hookTimeout;
 | |
|     this._needReporter = reporter;
 | |
|     this._showSlowTests = showSlowTests;
 | |
|     this._showMarkedAsFailingTests = showMarkedAsFailingTests;
 | |
|     this._verbose = verbose;
 | |
|     this._summary = summary;
 | |
|     this._lineBreak = lineBreak;
 | |
| 
 | |
|     this._filter = new FocusedFilter();
 | |
|     this._repeater = new Repeater();
 | |
|     this._collector = new TestCollector({ timeout });
 | |
| 
 | |
|     this._api = {
 | |
|       ...this._collector.api(),
 | |
|       expect: new Matchers().expect,
 | |
|     };
 | |
|     this._collector.addSuiteAttribute('only', s => this._filter.focusSuite(s));
 | |
|     this._collector.addSuiteAttribute('skip', s => s.setSkipped(true));
 | |
|     this._collector.addSuiteModifier('repeat', (s, count) => this._repeater.repeat(s, count));
 | |
|     this._collector.addTestAttribute('only', t => this._filter.focusTest(t));
 | |
|     this._collector.addTestAttribute('skip', t => t.setSkipped(true));
 | |
|     this._collector.addTestAttribute('todo', t => t.setSkipped(true));
 | |
|     this._collector.addTestAttribute('slow', t => t.setTimeout(t.timeout() * 3));
 | |
|     this._collector.addTestModifier('repeat', (t, count) => this._repeater.repeat(t, count));
 | |
|     this._api.fdescribe = this._api.describe.only;
 | |
|     this._api.xdescribe = this._api.describe.skip;
 | |
|     this._api.fit = this._api.it.only;
 | |
|     this._api.xit = this._api.it.skip;
 | |
|   }
 | |
| 
 | |
|   collector() {
 | |
|     return this._collector;
 | |
|   }
 | |
| 
 | |
|   api() {
 | |
|     return this._api;
 | |
|   }
 | |
| 
 | |
|   focusMatchingNameTests(fullNameRegex) {
 | |
|     const focusedTests = [];
 | |
|     for (const test of this._collector.tests()) {
 | |
|       if (fullNameRegex.test(test.fullName())) {
 | |
|         this._filter.focusTest(test);
 | |
|         focusedTests.push(test);
 | |
|       }
 | |
|     }
 | |
|     return focusedTests;
 | |
|   }
 | |
| 
 | |
|   focusMatchingFileName(filenameRegex) {
 | |
|     const focusedFilePaths = [];
 | |
|     for (const filePath of this._collector.filePaths()) {
 | |
|       if (filenameRegex.test(path.basename(filePath))) {
 | |
|         this._filter.focusFilePath(filePath);
 | |
|         focusedFilePaths.push(filePath);
 | |
|       }
 | |
|     }
 | |
|     return focusedFilePaths;
 | |
|   }
 | |
| 
 | |
|   repeatAll(repeatCount) {
 | |
|     this._repeater.repeat(this._collector.rootSuite(), repeatCount);
 | |
|   }
 | |
| 
 | |
|   async run() {
 | |
|     let reporter = null;
 | |
| 
 | |
|     if (this._needReporter) {
 | |
|       const reporterDelegate = {
 | |
|         focusedSuites: () => this._filter.focusedSuites(this._collector.suites()),
 | |
|         focusedTests: () => this._filter.focusedTests(this._collector.tests()),
 | |
|         focusedFilePaths: () => this._filter.focusedFilePaths(this._collector.filePaths()),
 | |
|         hasFocusedTestsOrSuitesOrFiles: () => this._filter.hasFocusedTestsOrSuitesOrFiles(),
 | |
|         parallel: () => this._parallel,
 | |
|         testCount: () => this._collector.tests().length,
 | |
|       };
 | |
|       const reporterOptions = {
 | |
|         showSlowTests: this._showSlowTests,
 | |
|         showMarkedAsFailingTests: this._showMarkedAsFailingTests,
 | |
|         verbose: this._verbose,
 | |
|         summary: this._summary,
 | |
|         lineBreak: this._lineBreak,
 | |
|       };
 | |
|       reporter = new Reporter(reporterDelegate, reporterOptions);
 | |
|     }
 | |
| 
 | |
|     if (this._crashIfTestsAreFocusedOnCI && process.env.CI && this._filter.hasFocusedTestsOrSuitesOrFiles()) {
 | |
|       if (reporter)
 | |
|         await reporter.onStarted([]);
 | |
|       const result = new Result();
 | |
|       result.setResult(TestResult.Crashed, '"focused" tests or suites are probitted on CI');
 | |
|       if (reporter)
 | |
|         await reporter.onFinished(result);
 | |
|       if (this._exit)
 | |
|         process.exit(result.exitCode);
 | |
|       return result;
 | |
|     }
 | |
| 
 | |
|     const testRuns = this._repeater.createTestRuns(this._filter.filter(this._collector.tests()));
 | |
|     const testRunner = new TestRunner();
 | |
|     const result = await testRunner.run(testRuns, {
 | |
|       parallel: this._parallel,
 | |
|       breakOnFailure: this._breakOnFailure,
 | |
|       totalTimeout: this._totalTimeout,
 | |
|       hookTimeout: this._hookTimeout,
 | |
|       onStarted: (...args) => reporter && reporter.onStarted(...args),
 | |
|       onFinished: (...args) => reporter && reporter.onFinished(...args),
 | |
|       onTestRunStarted: (...args) => reporter && reporter.onTestRunStarted(...args),
 | |
|       onTestRunFinished: (...args) => reporter && reporter.onTestRunFinished(...args),
 | |
|     });
 | |
|     if (this._exit)
 | |
|       process.exit(result.exitCode);
 | |
|     return result;
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = DefaultTestRunner;
 | 
