
Rstest Best Practices
- 874 installs
- 86 repo stars
- Updated August 4, 2026
- rstackjs/agent-skills
rstest-best-practices is a testing skill that encodes Rstest configuration, CLI workflow, mocking, snapshot, DOM, coverage, and CI guidance for developers writing or reviewing Rstest projects.
About
rstest-best-practices is a skill from rstackjs/agent-skills that codifies rules for Rstest test projects built on `@rstest/core`. It recommends `rstest.config.ts` with `defineConfig`, explicit imports from `@rstest/core` over `globals: true`, and adapters such as `@rstest/adapter-rsbuild` with `extends: withRsbuildConfig()` for Rsbuild repos or Rslib integrations. Coverage spans CLI workflow, test writing, mocking, snapshot testing, DOM testing, multi-project setup, CI integration, performance tuning, and debugging. Developers reach for rstest-best-practices when authoring new Rstest suites, reviewing teammate tests, or troubleshooting flaky Rstest runs in Rsbuild-based frontends.
- rstest-best-practices
Rstest Best Practices by the numbers
- 874 all-time installs (skills.sh)
- +55 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #462 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/rstackjs/agent-skills --skill rstest-best-practicesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 874 |
|---|---|
| repo stars | ★ 86 |
| Last updated | August 4, 2026 |
| Repository | rstackjs/agent-skills ↗ |
How do you configure Rstest tests and CI coverage?
Use rstest-best-practices for development tasks
Who is it for?
Frontend and full-stack developers using Rstest with Rsbuild or Rslib who need consistent config, mocking, and CI patterns while writing or reviewing tests.
Skip if: Jest or Vitest-only codebases with no Rstest dependency, or teams not using the Rstack Rsbuild toolchain.
When should I use this skill?
Writing, reviewing, or debugging Rstest projects involving config, CLI runs, mocks, snapshots, DOM tests, or multi-project CI setup.
What you get
rstest.config.ts files, @rstest/core test suites with mocks and snapshots, DOM tests, and CI-ready coverage reports.
Files
Rstest Best Practices
Apply these rules when writing or reviewing Rstest test projects.
Configuration
- Use
rstest.config.tsanddefineConfigfrom@rstest/core - Prefer explicit imports
import { test, expect, describe } from '@rstest/core'overglobals: true - For Rsbuild projects, use
@rstest/adapter-rsbuildwithextends: withRsbuildConfig()to reuse build config - For Rslib projects, use
@rstest/adapter-rslibwithextends: withRslibConfig()to reuse build config - Use
setupFilesfor shared test setup (e.g., custom matchers, cleanup hooks) - When using Rsbuild plugins (e.g.,
@rsbuild/plugin-react), add them via thepluginsfield - For deep-level or advanced build configuration needs, use
tools.rspackortools.bundlerChain
CLI
- Use
rstestorrstest runto run tests (rundisables watch mode, suitable for CI) - Use
rstest --watchorrstest watchfor local development with file watching - Use
rstest listto list all test files and test names - Use
rstest -uto update snapshots - Use
--reporter=verbosewhen debugging test failures for detailed output - Use
--config(-c) to specify a custom config file path
Test writing
- Import test APIs from
@rstest/core:test,describe,expect,beforeEach,afterEach, etc. - Use
testoritfor test cases; usedescribefor grouping related tests - Use
.onlyto focus on specific tests during development, but never commit.onlyto the codebase - Use
.skipor.todoto mark incomplete or temporarily skipped tests - Prefer small, focused test cases that test a single behavior
- For async error paths, prefer
await expect(fn()).rejects.toThrow(ErrorClass)(or.rejects.toMatchObject({ ... })) overtry/catchwithexpect.failor.catch(e => e)patterns — the matcher form fails clearly if the promise unexpectedly resolves, keeps the assertion in one chain, and avoids forgetting to assert the throw at all - For async happy paths, use
await expect(fn()).resolves.toEqual(...)for the same reason - Use
includeSourcefor in-source testing of small utility functions (Rust-styleimport.meta.rstest) - For in-source tests, wrap test code in
if (import.meta.rstest) { ... }and defineimport.meta.rstestasfalsein production build config
Test environment
- Use
testEnvironment: 'node'(default) for Node.js / server-side code - Use
testEnvironment: 'jsdom'ortestEnvironment: 'happy-dom'for DOM / browser API testing - Install
jsdomorhappy-domas a dev dependency when using DOM environments - Prefer
happy-domfor faster DOM testing; usejsdomwhen better browser API compatibility is needed - For real browser testing, use
@rstest/browserwith Playwright - Use inline project configs to run different test environments within one project (e.g.,
nodeandjsdomprojects)
React / Vue testing
- For React: use
@rsbuild/plugin-reactplugin and@testing-library/reactfor component testing - For Vue: use
@rsbuild/plugin-vueplugin and@testing-library/vuefor component testing - Create a
rstest.setup.tswithexpect.extend(jestDomMatchers)andafterEach(() => cleanup())for Testing Library - Add the setup file to
setupFilesin config - For SSR testing, use
testEnvironment: 'node'and test withreact-dom/serveror framework-specific SSR APIs
Mocking
- Use
rs.mock('./module')to mock modules - Use
rs.fn()to create mock functions - Use
rs.spyOn(object, 'method')to spy on methods - Prefer
clearMocks,resetMocks, orrestoreMocksconfig options to automatically clean up mocks between tests - Use factory functions in
rs.mock('./module', () => ({ ... }))to provide mock implementations
Snapshot testing
- Use
toMatchSnapshot()for general snapshot testing - Use
toMatchInlineSnapshot()for small, readable inline snapshots - Use
toMatchFileSnapshot()for large or structured outputs (e.g., HTML, generated code) - Keep snapshots concise — only include relevant data, avoid timestamps and session IDs
- Use
expect.addSnapshotSerializer()to mask paths or sensitive data in snapshots - Use
path-serializerto normalize file paths across platforms - Review snapshot changes carefully in code review
Coverage
- Enable coverage with
--coverageCLI flag orcoverage.enabled: truein config - Install
@rstest/coverage-istanbulfor the Istanbul coverage provider - Use
coverage.includeto specify source files for coverage (e.g.,['src/**/*.{js,ts,tsx}']) - Use
coverage.thresholdsto enforce minimum coverage requirements - Use
coverage.reportersto generate reports in different formats (e.g.,text,lcov,html)
Multi-project testing
- Use
projectsfield in root config to define multiple test projects - For monorepos, use glob patterns like
'packages/*'to auto-discover sub-projects - Use
defineProjecthelper in sub-project configs - Extract shared config and use
mergeRstestConfigto compose project configs - Global options (
reporters,pool,isolate,coverage,bail) must be set at the root level, not in projects
CI integration
- Use
rstest run(notrstest watch) in CI - Use
--shardfor parallel test execution across CI machines (e.g.,--shard 1/3) - Use
--reporter=blobwithrstest merge-reportsto combine sharded results - Use
--reporter=junitwithoutputPathfor CI report integration - The
github-actionsreporter is auto-enabled in GitHub Actions for inline error annotations - Use
--bailto stop early on first failure when appropriate
Performance
- Disable
isolate(--no-isolate) when tests have no side effects for faster execution via module cache reuse - Use
pool.maxWorkersto control parallelism based on available resources - Keep test build fast by avoiding unnecessary Rspack plugins in test config
- Use test filtering (
rstest <pattern>or-t <name>) to run only relevant tests during development - Leverage watch mode's incremental re-runs for fast local feedback
Debugging
- Run with
DEBUG=rstestto enable debug mode, which writes final configs and build outputs to disk - Read generated files in
dist/.rstest-temp/.rsbuild/to confirm final Rstest/Rsbuild/Rspack config - Use VS Code's JavaScript Debug Terminal to run
rstestwith breakpoints - Use
--reporter=verbosefor detailed per-test output - Use
--printConsoleTraceto trace console calls to their source - Add VS Code launch config for debugging specific test files with
@rstest/core/bin/rstest.js
Profiling
- Use Rsdoctor with
RSDOCTOR=true rstest runto analyze test build performance - Use
samplyfor native profiling of both main and worker processes - Use Node.js
--heap-proffor memory profiling
Toolchain integration
- Use the official VS Code extension (
rstack.rstest) for in-editor test running and debugging - For Rslib libraries, use
@rstest/adapter-rslibfor config reuse - For Rsbuild apps, use
@rstest/adapter-rsbuildfor config reuse - Use
process.env.RSTESTto detect test environment and apply test-specific config
Documentation
- For the latest Rstest docs, read https://rstest.rs/llms.txt
Related skills
FAQ
What config file does rstest-best-practices recommend?
rstest-best-practices recommends rstest.config.ts using defineConfig from @rstest/core, preferring explicit test imports over globals: true and Rsbuild integration via @rstest/adapter-rsbuild when applicable.
When should developers load rstest-best-practices?
Developers should load rstest-best-practices when writing, reviewing, or troubleshooting Rstest suites covering CLI workflow, mocking, snapshots, DOM tests, coverage, multi-project setup, or CI integration.