-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmain.spec.ts
More file actions
102 lines (83 loc) · 2.73 KB
/
main.spec.ts
File metadata and controls
102 lines (83 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import type { Page } from '@playwright/test';
import { test } from '@wordpress/e2e-test-utils-playwright';
import { camelCaseDashes } from '../utils';
const results: Record< string, Record< string, number[] > > = {};
test.describe( 'Tests', () => {
test.use( {
// @ts-ignore
storageState: {}, // User will be logged out.
} );
// Run *once* before *all* iterations.
// Ideal for setting up the site for this particular test.
test.beforeAll( async ( { requestUtils } ) => {
await requestUtils.request.get(
`${ requestUtils.baseURL }/?reset_helper`
);
} );
// After all results are processed, attach results for further processing.
// For easier handling, only one attachment per file.
test.afterAll( async ( {}, testInfo ) => {
await testInfo.attach( 'results', {
body: JSON.stringify( results, null, 2 ),
contentType: 'application/json',
} );
} );
const urlsToTest = ( process.env.URLS_TO_TEST || '' )
.split( '\n' )
.map( ( url ) => url.trim() )
.filter( Boolean );
const iterations = Number( process.env.TEST_ITERATIONS );
const cpuThrottlingRate = getCpuThrottlingRate();
for ( const url of urlsToTest ) {
for ( let i = 1; i <= iterations; i++ ) {
test( `URL: "${ url }" (${ i } of ${ iterations })`, async ( {
browserName,
page,
metrics,
} ) => {
await applyCpuThrottling(
page,
browserName,
cpuThrottlingRate
);
await page.goto( `${ url.replace( /\/$/, '' ) }/?i=${ i }` );
const serverTiming = await metrics.getServerTiming();
results[ url ] ??= {};
for ( const [ key, value ] of Object.entries( serverTiming ) ) {
results[ url ][ camelCaseDashes( key ) ] ??= [];
results[ url ][ camelCaseDashes( key ) ].push( value );
}
const ttfb = await metrics.getTimeToFirstByte();
const lcp = await metrics.getLargestContentfulPaint();
results[ url ].largestContentfulPaint ??= [];
results[ url ].largestContentfulPaint.push( lcp );
results[ url ].timeToFirstByte ??= [];
results[ url ].timeToFirstByte.push( ttfb );
results[ url ].lcpMinusTtfb ??= [];
results[ url ].lcpMinusTtfb.push( lcp - ttfb );
} );
}
}
} );
function getCpuThrottlingRate() {
const rate = ( process.env.CPU_THROTTLING_RATE || '' ).trim();
if ( rate === '' ) {
return 0;
}
const parsedRate = Number( rate );
if ( ! Number.isFinite( parsedRate ) || parsedRate <= 0 ) {
throw new Error( 'CPU_THROTTLING_RATE must be a positive number.' );
}
return parsedRate;
}
async function applyCpuThrottling(
page: Page,
browserName: string,
rate: number
) {
if ( rate === 0 || browserName !== 'chromium' ) {
return;
}
const session = await page.context().newCDPSession( page );
await session.send( 'Emulation.setCPUThrottlingRate', { rate } );
}