Skip to content

Commit

Permalink
feat: add ability to collect JS code coverage at the function level (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
smithc authored and jrandolf committed Oct 6, 2022
1 parent 41d0122 commit a032583
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 15 deletions.
6 changes: 3 additions & 3 deletions docs/api/puppeteer.coverage.startjscoverage.md
Expand Up @@ -14,9 +14,9 @@ class Coverage {

## Parameters

| Parameter | Type | Description |
| --------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| options | [JSCoverageOptions](./puppeteer.jscoverageoptions.md) | <i>(Optional)</i> Set of configurable options for coverage defaults to <code>resetOnNavigation : true, reportAnonymousScripts : false</code> |
| Parameter | Type | Description |
| --------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| options | [JSCoverageOptions](./puppeteer.jscoverageoptions.md) | <i>(Optional)</i> Set of configurable options for coverage defaults to <code>resetOnNavigation : true, reportAnonymousScripts : false,</code> <code>includeRawScriptCoverage : false, useBlockCoverage : true</code> |

**Returns:**

Expand Down
7 changes: 4 additions & 3 deletions docs/api/puppeteer.jscoverage.start.md
Expand Up @@ -12,15 +12,16 @@ class JSCoverage {
resetOnNavigation?: boolean;
reportAnonymousScripts?: boolean;
includeRawScriptCoverage?: boolean;
useBlockCoverage?: boolean;
}): Promise<void>;
}
```

## Parameters

| Parameter | Type | Description |
| --------- | ------------------------------------------------------------------------------------------------------ | ----------------- |
| options | { resetOnNavigation?: boolean; reportAnonymousScripts?: boolean; includeRawScriptCoverage?: boolean; } | <i>(Optional)</i> |
| Parameter | Type | Description |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| options | { resetOnNavigation?: boolean; reportAnonymousScripts?: boolean; includeRawScriptCoverage?: boolean; useBlockCoverage?: boolean; } | <i>(Optional)</i> |

**Returns:**

Expand Down
11 changes: 6 additions & 5 deletions docs/api/puppeteer.jscoverageoptions.md
Expand Up @@ -14,8 +14,9 @@ export interface JSCoverageOptions

## Properties

| Property | Modifiers | Type | Description |
| -------------------------------------------------------------------------------------- | --------- | ------- | ------------------------------------------------------------------------------------- |
| [includeRawScriptCoverage?](./puppeteer.jscoverageoptions.includerawscriptcoverage.md) | | boolean | <i>(Optional)</i> Whether the result includes raw V8 script coverage entries. |
| [reportAnonymousScripts?](./puppeteer.jscoverageoptions.reportanonymousscripts.md) | | boolean | <i>(Optional)</i> Whether anonymous scripts generated by the page should be reported. |
| [resetOnNavigation?](./puppeteer.jscoverageoptions.resetonnavigation.md) | | boolean | <i>(Optional)</i> Whether to reset coverage on every navigation. |
| Property | Modifiers | Type | Description |
| -------------------------------------------------------------------------------------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [includeRawScriptCoverage?](./puppeteer.jscoverageoptions.includerawscriptcoverage.md) | | boolean | <i>(Optional)</i> Whether the result includes raw V8 script coverage entries. |
| [reportAnonymousScripts?](./puppeteer.jscoverageoptions.reportanonymousscripts.md) | | boolean | <i>(Optional)</i> Whether anonymous scripts generated by the page should be reported. |
| [resetOnNavigation?](./puppeteer.jscoverageoptions.resetonnavigation.md) | | boolean | <i>(Optional)</i> Whether to reset coverage on every navigation. |
| [useBlockCoverage?](./puppeteer.jscoverageoptions.useblockcoverage.md) | | boolean | <i>(Optional)</i> Whether to collect coverage information at the block level. If true, coverage will be collected at the block level (this is the default). If false, coverage will be collected at the function level. |
15 changes: 15 additions & 0 deletions docs/api/puppeteer.jscoverageoptions.useblockcoverage.md
@@ -0,0 +1,15 @@
---
sidebar_label: JSCoverageOptions.useBlockCoverage
---

# JSCoverageOptions.useBlockCoverage property

Whether to collect coverage information at the block level. If true, coverage will be collected at the block level (this is the default). If false, coverage will be collected at the function level.

**Signature:**

```typescript
interface JSCoverageOptions {
useBlockCoverage?: boolean;
}
```
13 changes: 11 additions & 2 deletions packages/puppeteer-core/src/common/Coverage.ts
Expand Up @@ -74,6 +74,12 @@ export interface JSCoverageOptions {
* Whether the result includes raw V8 script coverage entries.
*/
includeRawScriptCoverage?: boolean;
/**
* Whether to collect coverage information at the block level.
* If true, coverage will be collected at the block level (this is the default).
* If false, coverage will be collected at the function level.
*/
useBlockCoverage?: boolean;
}

/**
Expand Down Expand Up @@ -135,7 +141,8 @@ export class Coverage {

/**
* @param options - Set of configurable options for coverage defaults to
* `resetOnNavigation : true, reportAnonymousScripts : false`
* `resetOnNavigation : true, reportAnonymousScripts : false,`
* `includeRawScriptCoverage : false, useBlockCoverage : true`
* @returns Promise that resolves when coverage is started.
*
* @remarks
Expand Down Expand Up @@ -204,13 +211,15 @@ export class JSCoverage {
resetOnNavigation?: boolean;
reportAnonymousScripts?: boolean;
includeRawScriptCoverage?: boolean;
useBlockCoverage?: boolean;
} = {}
): Promise<void> {
assert(!this.#enabled, 'JSCoverage is already enabled');
const {
resetOnNavigation = true,
reportAnonymousScripts = false,
includeRawScriptCoverage = false,
useBlockCoverage = true,
} = options;
this.#resetOnNavigation = resetOnNavigation;
this.#reportAnonymousScripts = reportAnonymousScripts;
Expand All @@ -234,7 +243,7 @@ export class JSCoverage {
this.#client.send('Profiler.enable'),
this.#client.send('Profiler.startPreciseCoverage', {
callCount: this.#includeRawScriptCoverage,
detailed: true,
detailed: useBlockCoverage,
}),
this.#client.send('Debugger.enable'),
this.#client.send('Debugger.setSkipAllPauses', {skip: true}),
Expand Down
2 changes: 1 addition & 1 deletion test/assets/jscoverage/ranges.html
@@ -1,2 +1,2 @@
<script>
function unused(){}console.log('used!');</script>
function unused(){}console.log('used!');if(true===false)console.log('unused!');</script>
22 changes: 21 additions & 1 deletion test/src/coverage.spec.ts
Expand Up @@ -108,7 +108,27 @@ describe('Coverage specs', function () {
expect(entry.text.substring(range1.start, range1.end)).toBe('\n');
const range2 = entry.ranges[1]!;
expect(entry.text.substring(range2.start, range2.end)).toBe(
`console.log('used!');`
`console.log('used!');if(true===false)`
);
});
it('should report right ranges for "per function" scope', async () => {
const {page, server} = getTestState();

const coverageOptions = {
useBlockCoverage: false,
};

await page.coverage.startJSCoverage(coverageOptions);
await page.goto(server.PREFIX + '/jscoverage/ranges.html');
const coverage = await page.coverage.stopJSCoverage();
expect(coverage.length).toBe(1);
const entry = coverage[0]!;
expect(entry.ranges.length).toBe(2);
const range1 = entry.ranges[0]!;
expect(entry.text.substring(range1.start, range1.end)).toBe('\n');
const range2 = entry.ranges[1]!;
expect(entry.text.substring(range2.start, range2.end)).toBe(
`console.log('used!');if(true===false)console.log('unused!');`
);
});
it('should report scripts that have no coverage', async () => {
Expand Down

0 comments on commit a032583

Please sign in to comment.