Skip to content

Commit 1e38024

Browse files
atkatilafassina
andauthored
testing guide: added benchmark / code coverage (#735)
Co-authored-by: Atila Fassina <[email protected]> Co-authored-by: Atila Fassina <[email protected]>
1 parent 1ec1902 commit 1e38024

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

src/routes/guides/testing.mdx

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,94 @@ return testEffect(done =>
494494
)
495495
```
496496
497+
### Benchmarks
498+
499+
While Solid offers performance simplified, it is good to validate if that promise can be kept.
500+
Vitest offers an experimental `bench` function to run benchmarks and compare the results inside the same `describe` block;
501+
for example if you had a `<List>` flow component similar to `<For>`, you could benchmark it like this:
502+
503+
504+
```jsx title="list.bench.jsx"
505+
describe('list rendering', () => {
506+
const ITEMS = 1000
507+
const renderedFor = new Set()
508+
const listFor = Array.from({ length: ITEMS }, (_, i) => i)
509+
bench('For', () => new Promise((resolve) => {
510+
const ItemFor = (props) => {
511+
onMount(() => {
512+
renderedFor.add(props.number)
513+
if (renderedFor.size === ITEMS) { resolve() }
514+
})
515+
return <span>{props.number}</span>
516+
}
517+
render(() => <For each={listFor}>
518+
{(item) => <ItemFor number={item} />}
519+
</For>)
520+
}))
521+
522+
const renderedList = new Set()
523+
const listList = Array.from({ length: ITEMS }, (_, i) => i)
524+
bench('List', () => new Promise((resolve) => {
525+
const ItemList = (props) => {
526+
onMount(() => {
527+
renderedList.add(props.number)
528+
if (renderedList.size === ITEMS) { resolve() }
529+
})
530+
return <span>{props.number}</span>
531+
}
532+
render(() => <List each={listList}>
533+
{(item) => <ItemList number={item} />}
534+
</List>)
535+
}))
536+
})
537+
```
538+
539+
Running `[npm|pnpm|yarn] test bench` will then execute the benchmark function:
540+
541+
```ansi frame="none"
542+
[RUN] v1.4.0 solid-app/src/components/
543+
544+
 ✓ src/components/list.bench.jsx (2) 1364ms
545+
 ✓ benchmark (2) 1360ms
546+
 name hz min max mean p75 p99 p995 p999 rme samples
547+
 · For 60.5492 11.2355 47.9164 16.5155 15.4180 47.9164 47.9164 47.9164 ±13.60% 31 fastest
548+
 · List 49.7725 16.5441 69.3559 20.0914 18.0349 69.3559 69.3559 69.3559 ±21.37% 25
549+
550+
[BENCH] Summary
551+
552+
For - src/components/list.bench.tsx > benchmark
553+
 1.22x faster than List
554+
```
555+
556+
Please keep in mind that it is very difficult to create meaningful benchmarks.
557+
The numbers should always be taken with a grain of salt, but can still indicate performance degradations if compared between versions.
558+
559+
560+
### Test coverage
561+
562+
While coverage numbers can be misleading, they are used by many projects as a rough measurement of code quality.
563+
Vitest supports coverage collection. To use it, it needs an extra package:
564+
565+
<TabsCodeBlocks>
566+
<div id="npm">
567+
```bash frame="none"
568+
npm i -D @vitest/coverage-v8
569+
```
570+
</div>
571+
<div id="yarn">
572+
```bash frame="none"
573+
yarn add -D @vitest/coverage-v8
574+
```
575+
</div>
576+
<div id="pnpm">
577+
```bash frame="none"
578+
pnpm i -D @vitest/coverage-v8
579+
```
580+
</div>
581+
</TabsCodeBlocks>
582+
583+
Also, you need to [set up vitest's coverage feature](https://vitest.dev/guide/coverage.html).
584+
497585
498586
### Integration/E2E testing
499587

0 commit comments

Comments
 (0)