UNPKG

suite-metrics

Version:

Easily keep track of metrics for many nested test suites

5 lines (4 loc) 5.45 kB
import b from"microtime";var c=class m{constructor(){this._suite=new Map;this._topLevelSuite={name:"<Top-Level suite>",tests:null,numSubTests:0,subSuites:this._suite};this._currentSuite=null;this._currentTest=null;this._currentTime=0;this._numTests=0;this._createSuite=t=>({name:t,tests:null,numSubTests:0,subSuites:null})}_validateName({name:t,test:e=!1,topLevelAllowed:i=!1}){if(!Array.isArray(t))throw new Error("Invalid test/suite name - must be a delimiter string or an array of strings");if(i&&e)throw new Error("Cannot call _validateName with both topLevelAllowed and test as both");if(!i&&t.length===0)throw new Error("Test/suite name cannot be empty - must define a path");if(e&&t.length===1)throw new Error("Test must be inside at least one suite - i.e. name should be at least two strings (suite + test)");if(!t.every(s=>typeof s=="string"))throw new Error("Invalid test/suite name - must be an array of strings");return t}_getSuite({name:t,createIfAbsent:e=!1,test:i=!1}){let s=this._topLevelSuite;for(let r=0;r<t.length-(i?1:0);++r){if(s.subSuites===null){if(!e)throw new Error(`Suite ${t.slice(0,-1).toString()} does not exist`);s.subSuites=new Map}let u=s.subSuites.get(t[r]);if(u===void 0){if(!e)throw new Error(`Suite ${t.slice(0,-1).toString()} does not exist`);s.subSuites.set(t[r],this._createSuite(t[r])),u=s.subSuites.get(t[r])}s=u}return s}_exists(t,e){var s,r,u;let i=this._topLevelSuite;for(let n=0;n<t.length-(e?0:1);++n){if(e&&n===t.length-1)return(r=(s=i.tests)==null?void 0:s.has(t[n]))!=null?r:!1;let a=(u=i.subSuites)==null?void 0:u.get(t[n]);if(!a)return!1;i=a}return!0}_addTest(t){var s,r;let e=this._topLevelSuite;for(let u=0;u<t.length-1;++u)e.numSubTests++,e.subSuites===null&&(e.subSuites=new Map),e.subSuites.has(t[u])||e.subSuites.set(t[u],this._createSuite(t[u])),e=e.subSuites.get(t[u]);this._currentSuite=e,this._currentTest=t[t.length-1];let i={name:t[t.length-1],startTimestamp:-1,endTimestamp:-1,duration:-1,completed:!1,testNumber:++this._numTests,suiteTestNumber:((r=(s=e.tests)==null?void 0:s.size)!=null?r:0)+1};e.tests||(e.tests=new Map),e.tests.set(i.name,i)}static getInstance(){return m._instance||(m._instance=new m),m._instance}static resetInstance(){m._instance=new m}startTest(t){let e=this._validateName({name:t,test:!0});this._addTest(e),this._currentTime=b.now()}stopTest(){var i;let t=b.now();if(!this._currentSuite)throw new Error("No test currently being measured - run startTest() first");let e=(i=this._currentSuite.tests)==null?void 0:i.get(this._currentTest);e.startTimestamp=this._currentTime,e.endTimestamp=t,e.duration=e.endTimestamp-e.startTimestamp,e.completed=!0,this._currentSuite=null}suiteExists(t){return this._validateName({name:t,topLevelAllowed:!0}),this._exists(t,!1)}testExists(t){return this._validateName({name:t,test:!0}),this._exists(t,!0)}getTestMetrics(t){var r;let e=this._validateName({name:t,test:!0}),s=(r=this._getSuite({name:e,test:!0}).tests)==null?void 0:r.get(e[e.length-1]);if(!s)throw new Error(`Test ${t.toString()} does not exist`);return{name:s.name,startTimestamp:s.startTimestamp,endTimestamp:s.endTimestamp,duration:s.duration,completed:s.completed,testNumber:s.testNumber,suiteTestNumber:s.suiteTestNumber}}getSuiteMetrics(t){var u,n,a;let e=this._validateName({name:t,topLevelAllowed:!0}),i=this._getSuite({name:e}),s=(n=(u=i.tests)==null?void 0:u.size)!=null?n:0,r=0;return(a=i.tests)==null||a.forEach(l=>r+=l.duration),{name:i.name,parentSuites:e.slice(0,e.length-1),childSuites:i.subSuites?Array.from(i.subSuites.keys()):null,testMetrics:{numTests:s,totalTime:r,averageTime:s?r/s:null}}}_subSuiteMetrics(t){var s,r,u;let e=(r=(s=t.tests)==null?void 0:s.size)!=null?r:0,i=0;if((u=t.tests)==null||u.forEach(n=>i+=n.duration),t.subSuites)for(let n of t.subSuites.values()){let[a,l]=this._subSuiteMetrics(n);e+=a,i+=l}return[e,i]}getSuiteMetricsRecursive(t){var a,l,o;let e=this._validateName({name:t,topLevelAllowed:!0}),i=this._getSuite({name:e}),s=(l=(a=i.tests)==null?void 0:a.size)!=null?l:0,r=0;(o=i.tests)==null||o.forEach(S=>r+=S.duration);let u=0,n=0;if(i.subSuites)for(let S of i.subSuites.values()){let[p,T]=this._subSuiteMetrics(S);u+=p,n+=T}return{name:i.name,parentSuites:e.slice(0,e.length-1),childSuites:i.subSuites?Array.from(i.subSuites.keys()):null,directTestMetrics:{numTests:s,totalTime:r,averageTime:s?r/s:null},subTestMetrics:{numTests:u,totalTime:n,averageTime:u?n/u:null},totalTestMetrics:{numTests:s+u,totalTime:r+n,averageTime:s+u?(r+n)/(s+u):null}}}_printSuiteHelper(t,e,i){var u,n,a,l;let s=0;t.tests!==null&&t.tests.forEach(o=>s+=o.duration);let r=" ".repeat(i);if(e.push(`${r}Suite: ${t.name}`),e.push(`${r} Summary:`),e.push(`${r} - Total direct tests: ${(n=(u=t.tests)==null?void 0:u.size)!=null?n:0}`),e.push(`${r} Total duration: ${(s/1e3).toFixed(2)} ms`),e.push(`${r} - Total direct Sub-Suites: ${(l=(a=t.subSuites)==null?void 0:a.size)!=null?l:0}`),e.push(`${r} - Total Sub-Suite tests: ${t.numSubTests}`),t.tests!==null){e.push(` ${r} Tests:`);let o=1;for(let S of t.tests.values())e.push(`${r} ${o++}) '${S.name}': ${(S.duration/1e3).toFixed(2)} ms`)}if(t.subSuites!==null){e.push(` ${r} Sub-Suites:`);for(let o of t.subSuites.values())this._printSuiteHelper(o,e,i+4)}}printAllSuiteMetrics(t=!0){let e=[];if(t)this._printSuiteHelper(this._topLevelSuite,e,0);else for(let i of this._suite.values())this._printSuiteHelper(i,e,0);return e.join(` `)}},d=c;var $=d;export{$ as default};