@testim/testim-cli
Version:
Command line interface for running Testing on you CI
100 lines (82 loc) • 3.61 kB
JavaScript
var Promise = require('bluebird');
require('./bluebirdConfig.js');
var reporter = require('./resultReporter.js');
var firebaseConnection = require('./testimFirebaseConnection.js');
var ExecutionQueue = require('./executionQueue.js');
var Worker = require('./worker.js');
var guid = require('node-uuid').v4;
var TestRunStatus = require('./testRunStatus.js');
var logger = {
log : console.log.bind(console),
error : console.error.bind(console)
};
var CONCURRENT_WORKER_COUNT = parseInt(process.env.TESTIM_CONCURRENT_WORKER_COUNT) || 1;
function createQueue(executionId, testList, labels){
return new ExecutionQueue(executionId, testList, labels);
}
function createWorkers(count, queue){
function createWorker(){
return new Worker(queue);
}
return Array.from(new Array(count), createWorker);
}
function showTestList(testInfoList) {
logger.log("Got batch to run:");
testInfoList.forEach(function(testInfo, index){
logger.log("\t", index+1, ":", testInfo.name, "("+ testInfo.testId + ")");
});
logger.log("-----------------------------------------------------------------------");
}
module.exports.run = function(options) {
'use strict';
logger.log("-----------------------------------------------------------------------");
logger.log("Running Project:", options.project, "Label:", options.label);
logger.log("-----------------------------------------------------------------------");
var browserOptions = {
host : options.host,
port : options.port,
sauceLabs : options.sauceLabs,
ext : options.ext
};
var combinedTestResults = {};
firebaseConnection.init(options.token, options.project);
return firebaseConnection.getTestList(options.label, options.testId).then(function(testInfoList) {
var testCount = testInfoList.length;
var executionId = guid();
var testStatus = new TestRunStatus(testInfoList);
var executionQueue = createQueue(executionId, testInfoList, options.label);
testStatus.executionStart(executionId);
return new Promise(function (resolve) {
if (testInfoList.length === 0) {
logger.log("no tests to run");
return resolve();
}
showTestList(testInfoList);
var onTestStarted = function (wid, testId) {
testStatus.testStart(wid, testId);
};
var onTestCompleted = function (wid, testResult) {
var testId = Object.keys(testResult)[0];
var results = testResult[testId];
testStatus.testEnd(wid, testId, results.testResults.success);
combinedTestResults[testId] = results;
var completedTests = Object.keys(combinedTestResults).length;
if (completedTests === testCount) {
resolve(combinedTestResults);
}
};
createWorkers(CONCURRENT_WORKER_COUNT, executionQueue).forEach(function (worker, index) {
setTimeout(function () {
worker.start(options.baseUrl, browserOptions, onTestStarted.bind(this), onTestCompleted.bind(this));
}, (index * 1500));
}.bind(this));
}.bind(this))
.then(function() {
testStatus.executionEnd(executionId);
return executionQueue.close();
})
.then(function(/*testResults*/) {
return reporter.createResultsReport(options.reportFile, options.project, combinedTestResults);
});
});
};