Skip to content

Commit 96a9f1f

Browse files
authored
feat(coverage): support reportOnFailure option (#597)
1 parent 522b4e9 commit 96a9f1f

File tree

7 files changed

+62
-9
lines changed

7 files changed

+62
-9
lines changed

packages/core/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ const createDefaultConfig = (): NormalizedConfig => ({
165165
reporters: ['text', 'html', 'clover', 'json'],
166166
reportsDirectory: './coverage',
167167
clean: true,
168+
reportOnFailure: false,
168169
},
169170
});
170171

packages/core/src/core/runTests.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@ import { createRsbuildServer, prepareRsbuild } from './rsbuild';
1313
import type { Rstest } from './rstest';
1414

1515
export async function runTests(context: Rstest): Promise<void> {
16-
const { rootPath, reporters, projects, snapshotManager, command } = context;
16+
const {
17+
rootPath,
18+
reporters,
19+
projects,
20+
snapshotManager,
21+
command,
22+
normalizedConfig: { coverage },
23+
} = context;
1724

1825
const entriesCache = new Map<
1926
string,
@@ -97,17 +104,14 @@ export async function runTests(context: Rstest): Promise<void> {
97104
});
98105

99106
// Initialize coverage collector
100-
const coverageProvider = context.normalizedConfig.coverage.enabled
101-
? await createCoverageProvider(
102-
context.normalizedConfig.coverage || {},
103-
context.rootPath,
104-
)
107+
const coverageProvider = coverage.enabled
108+
? await createCoverageProvider(coverage, context.rootPath)
105109
: null;
106110

107111
if (coverageProvider) {
108112
logger.log(
109113
` ${color.gray('Coverage enabled with')} %s\n`,
110-
color.yellow(context.normalizedConfig.coverage.provider),
114+
color.yellow(coverage.provider),
111115
);
112116
}
113117

@@ -250,7 +254,9 @@ export async function runTests(context: Rstest): Promise<void> {
250254
}
251255
}
252256

253-
if (results.some((r) => r.status === 'fail')) {
257+
const isFailure = results.some((r) => r.status === 'fail');
258+
259+
if (isFailure) {
254260
process.exitCode = 1;
255261
}
256262

@@ -268,7 +274,7 @@ export async function runTests(context: Rstest): Promise<void> {
268274
}
269275

270276
// Generate coverage reports after all tests complete
271-
if (coverageProvider) {
277+
if (coverageProvider && (!isFailure || coverage.reportOnFailure)) {
272278
const { generateCoverage } = await import('../coverage/generate');
273279

274280
await generateCoverage(context, results, coverageProvider);

packages/core/src/types/coverage.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ export type CoverageOptions = {
100100
* @default undefined
101101
*/
102102
thresholds?: CoverageThresholds;
103+
104+
/**
105+
* Whether to report coverage when tests fail.
106+
* @default false
107+
*/
108+
reportOnFailure?: boolean;
103109
};
104110

105111
export type NormalizedCoverageOptions = Required<

packages/core/tests/__snapshots__/config.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ exports[`mergeRstestConfig > should merge config correctly with default config 1
2020
"**/*.{test,spec}.[c|m][jt]sx",
2121
],
2222
"provider": "istanbul",
23+
"reportOnFailure": false,
2324
"reporters": [
2425
"text",
2526
"html",

packages/core/tests/core/__snapshots__/rstest.test.ts.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ exports[`rstest context > should generate rstest context correctly 1`] = `
2020
"**/*.{test,spec}.[c|m][jt]sx",
2121
],
2222
"provider": "istanbul",
23+
"reportOnFailure": false,
2324
"reporters": [
2425
"text",
2526
"html",
@@ -89,6 +90,7 @@ exports[`rstest context > should generate rstest context correctly with multiple
8990
"**/*.{test,spec}.[c|m][jt]sx",
9091
],
9192
"provider": "istanbul",
93+
"reportOnFailure": false,
9294
"reporters": [
9395
"text",
9496
"html",
@@ -161,6 +163,7 @@ exports[`rstest context > should generate rstest context correctly with multiple
161163
"**/*.{test,spec}.[c|m][jt]sx",
162164
],
163165
"provider": "istanbul",
166+
"reportOnFailure": false,
164167
"reporters": [
165168
"text",
166169
"html",

website/docs/en/config/test/coverage.mdx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type CoverageOptions = {
1010
exclude?: string[];
1111
reporters?: (keyof ReportOptions | ReportWithOptions)[];
1212
reportsDirectory?: string;
13+
reportOnFailure?: boolean;
1314
clean?: boolean;
1415
thresholds?: CoverageThresholds;
1516
};
@@ -191,6 +192,23 @@ export default defineConfig({
191192
});
192193
```
193194

195+
### reportOnFailure
196+
197+
- **Type:** `boolean`
198+
- **Default:** `false`
199+
200+
Whether to report coverage and check thresholds when tests fail.
201+
202+
```ts title='rstest.config.ts'
203+
import { defineConfig } from '@rstest/core';
204+
export default defineConfig({
205+
coverage: {
206+
enabled: true,
207+
reportOnFailure: true,
208+
},
209+
});
210+
```
211+
194212
### clean
195213

196214
- **Type:** `boolean`

website/docs/zh/config/test/coverage.mdx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type CoverageOptions = {
1010
exclude?: string[];
1111
reporters?: (keyof ReportOptions | ReportWithOptions)[];
1212
reportsDirectory?: string;
13+
reportOnFailure?: boolean;
1314
clean?: boolean;
1415
thresholds?: CoverageThresholds;
1516
};
@@ -189,6 +190,23 @@ export default defineConfig({
189190
});
190191
```
191192

193+
### reportOnFailure
194+
195+
- **类型:** `boolean`
196+
- **默认值:** `false`
197+
198+
在测试失败时是否生成覆盖率报告并检查阈值。
199+
200+
```ts title='rstest.config.ts'
201+
import { defineConfig } from '@rstest/core';
202+
export default defineConfig({
203+
coverage: {
204+
enabled: true,
205+
reportOnFailure: true,
206+
},
207+
});
208+
```
209+
192210
### clean
193211

194212
- **类型:** `boolean`

0 commit comments

Comments
 (0)