Testing Jasmine Speed
bob.ts
Posted on December 9, 2019
I was told, "a single it within a describe is an order or magnitude faster than multiple its within the same describe." I thanked the individual and walked away. Then, what he said to me sank in ... and, to say I was dubious would be an understatement.
This was something I had to test ...
The code supporting this article is HERE.
Initial Testing
Initial Results:
Type | Random Run | Result |
---|---|---|
Multiple IT within DESCRIBE | TRUE | 4.294s |
Multiple IT within DESCRIBE | FALSE | 4.375s |
Single IT within many DESCRIBES | TRUE | 8.426s |
Single IT within many DESCRIBES | FALSE | 8.380s |
The multiple IT within DESCRIBE code looks like this ...
describe('speed testing', function() {
const maxRuns = 10000;
function multipleIt() {
it('something simple', function() {
expect(true).toEqual(true);
});
}
describe('multiple its per describe', function() {
describe('wrapper', function() {
for (let i = 0, len = maxRuns; i < len; i++) {
multipleIt();
}
});
});
});
... and the single IT within many DESCRIBES code looks like this ...
describe('speed testing', function() {
const maxRuns = 10000;
function singleIt() {
describe('single it run', function() {
it('something simple', function() {
expect(true).toEqual(true);
});
});
}
describe('single it per describe', function() {
for (let i = 0, len = maxRuns; i < len; i++) {
singleIt();
}
});
});
Then, I got to thinking that maybe the for-loop in the tests above was in some way impacting the test runs. So, I reworked the two test suites. I also added in testing that covered multiple nested DESCRIBE ...
Non-Iterative Testing
Number of Tests | Type | Random Run | Result |
---|---|---|---|
1,000 | Multiple DESCRIBE | TRUE | 5.182s |
1,000 | Multiple DESCRIBE | FALSE | 5.109s |
1,000 | Multiple IT within DESCRIBE | TRUE | 0.534s |
1,000 | Multiple IT within DESCRIBE | FALSE | 0.545s |
1,000 | Single IT within many DESCRIBES | TRUE | 0.943s |
1,000 | Single IT within many DESCRIBES | FALSE | 0.959s |
The deeply nested DESCRIBE code looks like this ...
describe('wrapper 1', function() {
describe('wrapper 2', function() {
describe('wrapper 3', function() {
describe('wrapper 4', function() {
describe('wrapper 5', function() {
describe('wrapper 6', function() {
describe('wrapper 7', function() {
describe('wrapper 8', function() {
describe('wrapper 9', function() {
describe('wrapper 10', function() {
it('something simple', function() {
expect(true).toEqual(true);
});
});
});
});
});
});
});
});
});
});
});
The multiple IT within DESCRIBE code looks like this ...
describe('speed testing', function() {
describe('multiple its per describe 1000', function() {
describe('wrapper', function() {
it('something simple', function() {
expect(true).toEqual(true);
});
// ... 998 ITS like the one above (or below)
it('something simple', function() {
expect(true).toEqual(true);
});
});
});
});
... and the single IT within many DESCRIBES code looks like ...
describe('speed testing', function() {
describe('single it per describe 1000', function() {
describe('single it run', function() {
it('something simple', function() {
expect(true).toEqual(true);
});
});
// ... 998 DESCRIBES like the one above (or below)
describe('single it run', function() {
it('something simple', function() {
expect(true).toEqual(true);
});
});
});
});
Conclusion
Common sense won out ...
The data here supports what common sense told me; that having multiple ITS within a single DESCRIBE is inherently faster within Jasmine than having a single IT within many DESCRIBE statements.
Additionally, the slowest of the types of tests are the deeply nested DESCRIBE.
Posted on December 9, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.