Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/core/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ const createDefaultConfig = (): NormalizedConfig => ({
reporters: ['text', 'html', 'clover', 'json'],
reportsDirectory: './coverage',
clean: true,
reportOnFailure: false,
},
});

Expand Down
24 changes: 15 additions & 9 deletions packages/core/src/core/runTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,14 @@ import { createRsbuildServer, prepareRsbuild } from './rsbuild';
import type { Rstest } from './rstest';

export async function runTests(context: Rstest): Promise<void> {
const { rootPath, reporters, projects, snapshotManager, command } = context;
const {
rootPath,
reporters,
projects,
snapshotManager,
command,
normalizedConfig: { coverage },
} = context;

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

// Initialize coverage collector
const coverageProvider = context.normalizedConfig.coverage.enabled
? await createCoverageProvider(
context.normalizedConfig.coverage || {},
context.rootPath,
)
const coverageProvider = coverage.enabled
? await createCoverageProvider(coverage, context.rootPath)
: null;

if (coverageProvider) {
logger.log(
` ${color.gray('Coverage enabled with')} %s\n`,
color.yellow(context.normalizedConfig.coverage.provider),
color.yellow(coverage.provider),
);
}

Expand Down Expand Up @@ -250,7 +254,9 @@ export async function runTests(context: Rstest): Promise<void> {
}
}

if (results.some((r) => r.status === 'fail')) {
const isFailure = results.some((r) => r.status === 'fail');

if (isFailure) {
process.exitCode = 1;
}

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

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

await generateCoverage(context, results, coverageProvider);
Expand Down
6 changes: 6 additions & 0 deletions packages/core/src/types/coverage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ export type CoverageOptions = {
* @default undefined
*/
thresholds?: CoverageThresholds;

/**
* Whether to report coverage when tests fail.
* @default false
*/
reportOnFailure?: boolean;
};

export type NormalizedCoverageOptions = Required<
Expand Down
1 change: 1 addition & 0 deletions packages/core/tests/__snapshots__/config.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ exports[`mergeRstestConfig > should merge config correctly with default config 1
"**/*.{test,spec}.[c|m][jt]sx",
],
"provider": "istanbul",
"reportOnFailure": false,
"reporters": [
"text",
"html",
Expand Down
3 changes: 3 additions & 0 deletions packages/core/tests/core/__snapshots__/rstest.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ exports[`rstest context > should generate rstest context correctly 1`] = `
"**/*.{test,spec}.[c|m][jt]sx",
],
"provider": "istanbul",
"reportOnFailure": false,
"reporters": [
"text",
"html",
Expand Down Expand Up @@ -89,6 +90,7 @@ exports[`rstest context > should generate rstest context correctly with multiple
"**/*.{test,spec}.[c|m][jt]sx",
],
"provider": "istanbul",
"reportOnFailure": false,
"reporters": [
"text",
"html",
Expand Down Expand Up @@ -161,6 +163,7 @@ exports[`rstest context > should generate rstest context correctly with multiple
"**/*.{test,spec}.[c|m][jt]sx",
],
"provider": "istanbul",
"reportOnFailure": false,
"reporters": [
"text",
"html",
Expand Down
18 changes: 18 additions & 0 deletions website/docs/en/config/test/coverage.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ type CoverageOptions = {
exclude?: string[];
reporters?: (keyof ReportOptions | ReportWithOptions)[];
reportsDirectory?: string;
reportOnFailure?: boolean;
clean?: boolean;
thresholds?: CoverageThresholds;
};
Expand Down Expand Up @@ -191,6 +192,23 @@ export default defineConfig({
});
```

### reportOnFailure

- **Type:** `boolean`
- **Default:** `false`

Whether to report coverage and check thresholds when tests fail.

```ts title='rstest.config.ts'
import { defineConfig } from '@rstest/core';
export default defineConfig({
coverage: {
enabled: true,
reportOnFailure: true,
},
});
```

### clean

- **Type:** `boolean`
Expand Down
18 changes: 18 additions & 0 deletions website/docs/zh/config/test/coverage.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ type CoverageOptions = {
exclude?: string[];
reporters?: (keyof ReportOptions | ReportWithOptions)[];
reportsDirectory?: string;
reportOnFailure?: boolean;
clean?: boolean;
thresholds?: CoverageThresholds;
};
Expand Down Expand Up @@ -189,6 +190,23 @@ export default defineConfig({
});
```

### reportOnFailure

- **类型:** `boolean`
- **默认值:** `false`

在测试失败时是否生成覆盖率报告并检查阈值。

```ts title='rstest.config.ts'
import { defineConfig } from '@rstest/core';
export default defineConfig({
coverage: {
enabled: true,
reportOnFailure: true,
},
});
```

### clean

- **类型:** `boolean`
Expand Down
Loading