UNPKG

suite-metrics

Version:

Easily keep track of metrics for many nested test suites

5 lines (4 loc) 6.07 kB
"use strict";var f=Object.create;var c=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var M=(n,t)=>{for(var e in t)c(n,e,{get:t[e],enumerable:!0})},p=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of _(t))!w.call(n,s)&&s!==e&&c(n,s,{get:()=>t[s],enumerable:!(i=v(t,s))||i.enumerable});return n};var N=(n,t,e)=>(e=n!=null?f(y(n)):{},p(t||!n||!n.__esModule?c(e,"default",{value:n,enumerable:!0}):e,n)),$=n=>p(c({},"__esModule",{value:!0}),n);var x={};M(x,{default:()=>E});module.exports=$(x);var b=N(require("microtime"),1),d=class n{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 a=0;a<t.length-(e?0:1);++a){if(e&&a===t.length-1)return(r=(s=i.tests)==null?void 0:s.has(t[a]))!=null?r:!1;let l=(u=i.subSuites)==null?void 0:u.get(t[a]);if(!l)return!1;i=l}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 n._instance||(n._instance=new n),n._instance}static resetInstance(){n._instance=new n}startTest(t){let e=this._validateName({name:t,test:!0});this._addTest(e),this._currentTime=b.default.now()}stopTest(){var i;let t=b.default.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,a,l;let e=this._validateName({name:t,topLevelAllowed:!0}),i=this._getSuite({name:e}),s=(a=(u=i.tests)==null?void 0:u.size)!=null?a:0,r=0;return(l=i.tests)==null||l.forEach(o=>r+=o.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(a=>i+=a.duration),t.subSuites)for(let a of t.subSuites.values()){let[l,o]=this._subSuiteMetrics(a);e+=l,i+=o}return[e,i]}getSuiteMetricsRecursive(t){var l,o,m;let e=this._validateName({name:t,topLevelAllowed:!0}),i=this._getSuite({name:e}),s=(o=(l=i.tests)==null?void 0:l.size)!=null?o:0,r=0;(m=i.tests)==null||m.forEach(S=>r+=S.duration);let u=0,a=0;if(i.subSuites)for(let S of i.subSuites.values()){let[h,g]=this._subSuiteMetrics(S);u+=h,a+=g}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:a,averageTime:u?a/u:null},totalTestMetrics:{numTests:s+u,totalTime:r+a,averageTime:s+u?(r+a)/(s+u):null}}}_printSuiteHelper(t,e,i){var u,a,l,o;let s=0;t.tests!==null&&t.tests.forEach(m=>s+=m.duration);let r=" ".repeat(i);if(e.push(`${r}Suite: ${t.name}`),e.push(`${r} Summary:`),e.push(`${r} - Total direct tests: ${(a=(u=t.tests)==null?void 0:u.size)!=null?a:0}`),e.push(`${r} Total duration: ${(s/1e3).toFixed(2)} ms`),e.push(`${r} - Total direct Sub-Suites: ${(o=(l=t.subSuites)==null?void 0:l.size)!=null?o:0}`),e.push(`${r} - Total Sub-Suite tests: ${t.numSubTests}`),t.tests!==null){e.push(` ${r} Tests:`);let m=1;for(let S of t.tests.values())e.push(`${r} ${m++}) '${S.name}': ${(S.duration/1e3).toFixed(2)} ms`)}if(t.subSuites!==null){e.push(` ${r} Sub-Suites:`);for(let m of t.subSuites.values())this._printSuiteHelper(m,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(` `)}},T=d;var E=T;