feat(result.duration): report test duration in ms
Wrap spec start/complete in Timer start/elapsed. configuration.timeSpecDuration = false will disable feature. * Add Suite result.duration, elapsed time in ms * Remove timeSpecDuration option. * Respond to review, use noopTimer
This commit is contained in:
@@ -207,7 +207,8 @@ describe("Spec", function() {
|
||||
failedExpectations: [],
|
||||
passedExpectations: [],
|
||||
deprecationWarnings: [],
|
||||
pendingReason: ''
|
||||
pendingReason: '',
|
||||
duration: null,
|
||||
}, 'things');
|
||||
});
|
||||
|
||||
@@ -242,6 +243,22 @@ describe("Spec", function() {
|
||||
expect(done).toHaveBeenCalledWith(jasmine.any(jasmineUnderTest.StopExecutionError));
|
||||
});
|
||||
|
||||
it("should report the duration of the test", function() {
|
||||
var done = jasmine.createSpy('done callback'),
|
||||
timer = jasmine.createSpyObj('timer', {'start': null, elapsed: 77000}),
|
||||
spec = new jasmineUnderTest.Spec({
|
||||
queueableFn: { fn: jasmine.createSpy("spec body")},
|
||||
catchExceptions: function() { return false; },
|
||||
resultCallback: function() {},
|
||||
queueRunnerFactory: function(attrs) {
|
||||
attrs.onComplete();
|
||||
},
|
||||
timer: timer,
|
||||
});
|
||||
spec.execute(done);
|
||||
expect(spec.result.duration).toBe(77000);
|
||||
});
|
||||
|
||||
it("#status returns passing by default", function() {
|
||||
var spec = new jasmineUnderTest.Spec({queueableFn: { fn: jasmine.createSpy("spec body")} });
|
||||
expect(spec.status()).toBe('passed');
|
||||
|
||||
@@ -111,6 +111,19 @@ describe("Suite", function() {
|
||||
expect(suite.getResult().failedExpectations).toEqual([]);
|
||||
});
|
||||
|
||||
it("calls timer to compute duration", function(){
|
||||
var env = new jasmineUnderTest.Env(),
|
||||
suite = new jasmineUnderTest.Suite({
|
||||
env: env,
|
||||
id: 456,
|
||||
description: "I am a suite",
|
||||
timer: jasmine.createSpyObj('timer', {'start': null, elapsed: 77000}),
|
||||
});
|
||||
suite.startTimer();
|
||||
suite.endTimer();
|
||||
expect(suite.getResult().duration).toEqual(77000);
|
||||
});
|
||||
|
||||
describe('#sharedUserContext', function() {
|
||||
beforeEach(function() {
|
||||
this.suite = new jasmineUnderTest.Suite({});
|
||||
|
||||
@@ -1436,6 +1436,9 @@ describe("Env integration", function() {
|
||||
status: 'pending'
|
||||
}));
|
||||
|
||||
var suiteDone = reporter.suiteDone.calls.argsFor(0)[0];
|
||||
expect(typeof suiteDone.duration).toBe('number');
|
||||
|
||||
var suiteResult = reporter.suiteStarted.calls.argsFor(0)[0];
|
||||
expect(suiteResult.description).toEqual("A Suite");
|
||||
|
||||
|
||||
@@ -512,6 +512,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
currentlyExecutingSuites.push(suite);
|
||||
defaultResourcesForRunnable(suite.id, suite.parentSuite.id);
|
||||
reporter.suiteStarted(suite.result, next);
|
||||
suite.startTimer();
|
||||
},
|
||||
nodeComplete: function(suite, result, next) {
|
||||
if (suite !== currentSuite()) {
|
||||
@@ -524,7 +525,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
if (result.status === 'failed') {
|
||||
hasFailures = true;
|
||||
}
|
||||
|
||||
suite.endTimer();
|
||||
reporter.suiteDone(result, next);
|
||||
},
|
||||
orderChildren: function(node) {
|
||||
@@ -804,9 +805,9 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
fn: fn,
|
||||
timeout: timeout || 0
|
||||
},
|
||||
throwOnExpectationFailure: config.oneFailurePerSpec
|
||||
throwOnExpectationFailure: config.oneFailurePerSpec,
|
||||
timer: new j$.Timer(),
|
||||
});
|
||||
|
||||
return spec;
|
||||
|
||||
function specResultCallback(result, next) {
|
||||
|
||||
@@ -14,6 +14,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
|
||||
this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
|
||||
this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
|
||||
this.timer = attrs.timer || j$.noopTimer;
|
||||
|
||||
if (!this.queueableFn.fn) {
|
||||
this.pend();
|
||||
@@ -29,6 +30,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
* @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
|
||||
* @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
|
||||
* @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
|
||||
* @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
|
||||
*/
|
||||
this.result = {
|
||||
id: this.id,
|
||||
@@ -37,7 +39,8 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
failedExpectations: [],
|
||||
passedExpectations: [],
|
||||
deprecationWarnings: [],
|
||||
pendingReason: ''
|
||||
pendingReason: '',
|
||||
duration: null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -67,6 +70,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
|
||||
var onStart = {
|
||||
fn: function(done) {
|
||||
self.timer.start();
|
||||
self.onStart(self, done);
|
||||
}
|
||||
};
|
||||
@@ -90,6 +94,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
self.onException.apply(self, arguments);
|
||||
},
|
||||
onComplete: function() {
|
||||
self.result.duration = self.timer.elapsed();
|
||||
onComplete(self.result.status === 'failed' && new j$.StopExecutionError('spec failed'));
|
||||
},
|
||||
userContext: this.userContext()
|
||||
|
||||
@@ -14,6 +14,8 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
this.beforeAllFns = [];
|
||||
this.afterAllFns = [];
|
||||
|
||||
this.timer = attrs.timer || j$.noopTimer;
|
||||
|
||||
this.children = [];
|
||||
|
||||
/**
|
||||
@@ -24,13 +26,15 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
* @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
|
||||
* @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite.
|
||||
* @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
|
||||
* @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach.
|
||||
*/
|
||||
this.result = {
|
||||
id: this.id,
|
||||
description: this.description,
|
||||
fullName: this.getFullName(),
|
||||
failedExpectations: [],
|
||||
deprecationWarnings: []
|
||||
deprecationWarnings: [],
|
||||
duration: null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -72,6 +76,14 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
this.afterAllFns.unshift(fn);
|
||||
};
|
||||
|
||||
Suite.prototype.startTimer = function() {
|
||||
this.timer.start();
|
||||
};
|
||||
|
||||
Suite.prototype.endTimer = function() {
|
||||
this.result.duration = this.timer.elapsed();
|
||||
};
|
||||
|
||||
function removeFns(queueableFns) {
|
||||
for(var i = 0; i < queueableFns.length; i++) {
|
||||
queueableFns[i].fn = null;
|
||||
|
||||
Reference in New Issue
Block a user