Kódlefedettség
A Vitest támogatja a natív kódlefedettséget a v8
segítségével, és az instrumentált kódlefedettséget az istanbul
segítségével.
Kódlefedettség-szolgáltatók
A v8
és az istanbul
támogatása is opcionális. Alapértelmezés szerint a v8
kerül felhasználásra.
A lefedettségi eszközt a test.coverage.provider
v8
vagy istanbul
értékére állítva választhatja ki:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
provider: 'istanbul', // vagy 'v8'
},
},
});
Amikor elindítja a Vitest folyamatot, az automatikusan felkéri a megfelelő támogató csomag telepítésére.
Vagy ha inkább manuálisan telepítené:
npm i -D @vitest/coverage-v8
npm i -D @vitest/coverage-istanbul
V8 szolgáltató
INFO
Az alábbi V8 lefedettség leírása Vitest-specifikus, és nem vonatkozik más tesztfuttatókra. A v3.2.0
óta a Vitest AST alapú lefedettség-átalakítást használ a V8 lefedettséghez, amely az Istanbullal azonos lefedettségi jelentéseket készít.
Ezáltal a felhasználók a V8 sebességét és az Istanbul pontosságát együtt élvezhetik.
Alapértelmezés szerint a Vitest a 'v8'
lefedettségi szolgáltatót használja. Ez a szolgáltató olyan JavaScript futtatókörnyezetet igényel, amely a V8 motorra épül, mint például a NodeJS, Deno vagy bármely Chromium alapú böngésző (pl. Google Chrome).
A lefedettség gyűjtése futásidőben történik, a V8-nak utasításokat adva a node:inspector
és a Chrome DevTools Protocol segítségével a böngészőkben. A felhasználói forrásfájlok előzetes instrumentálás nélkül is végrehajthatók.
- ✅ Ajánlott opció
- ✅ Nincs előzetes transzpilálási lépés. A tesztfájlok úgy futtathatók, ahogy vannak.
- ✅ Gyorsabb végrehajtási idő, mint az Istanbullal.
- ✅ Alacsonyabb memóriahasználat, mint az Istanbullal.
- ✅ A lefedettségi jelentés pontossága ugyanolyan pontos, mint az Istanbullal (Vitest
v3.2.0
óta). - ⚠️ Bizonyos esetekben lassabb lehet, mint az Istanbul, például sok különböző modul betöltésekor. A V8 nem támogatja a lefedettség gyűjtésének korlátozását adott modulokra.
- ⚠️ Vannak kisebb korlátozások, amelyeket a V8 motor támaszt. Lásd:
ast-v8-to-istanbl
| Korlátozások. - ❌ Nem működik olyan környezetekben, amelyek nem használnak V8-at, például a Firefox vagy a Bun. Vagy olyan környezetekben, amelyek nem teszik elérhetővé a V8 lefedettséget a profilozón keresztül, mint például a Cloudflare Workers.
Istanbul szolgáltató
Az Istanbul kódlefedettségi eszközök 2012 óta léteznek, és nagyon jól beváltak a gyakorlatban. Ez a szolgáltató bármilyen JavaScript futtatókörnyezetben működik, mivel a lefedettség nyomon követése a felhasználói forrásfájlok instrumentálásával történik.
A gyakorlatban a forrásfájlok instrumentálása további JavaScript hozzáadását jelenti a felhasználói fájlokhoz:
// Egyszerűsített példa az elágazás és függvény lefedettségi számlálóira
const coverage = {
branches: { 1: [0, 0] },
functions: { 1: 0 },
}
export function getUsername(id) {
// A függvény lefedettsége megnő, amikor meghívják
coverage.functions['1']++;
if (id == null) {
// Az elágazás lefedettsége megnő, amikor meghívják
coverage.branches['1'][0]++;
throw new Error('User ID is required');
}
// Az implicit else lefedettsége megnő, ha az if-utasítás feltétele nem teljesül
coverage.branches['1'][1]++;
return database.getUser(id);
}
globalThis.__VITEST_COVERAGE__ ||= {};
globalThis.__VITEST_COVERAGE__[filename] = coverage;
- ✅ Bármilyen JavaScript futtatókörnyezetben működik
- ✅ Széles körben használt és több mint 13 éve jól bevált.
- ✅ Bizonyos esetekben gyorsabb, mint a V8. A lefedettség instrumentálása korlátozható adott fájlokra, ellentétben a V8-cal, ahol minden modul instrumentálásra kerül.
- ❌ Előzetes instrumentálási lépést igényel
- ❌ A végrehajtási sebesség lassabb, mint a V8-nál az instrumentálásból adódó többletterhelés miatt
- ❌ Az instrumentálás növeli a fájlméretet
- ❌ A memóriahasználat magasabb, mint a V8 esetében
Lefedettség beállítása
TIP
Ajánlott mindig megadni a coverage.include
opciót a konfigurációs fájlban. Ez segít a Vitestnek csökkenteni a coverage.all
által kiválasztott fájlok számát.
A lefedettséggel történő teszteléshez átadhatja a --coverage
jelzőt a CLI-ben. Alapértelmezés szerint a ['text', 'html', 'clover', 'json']
riporter kerül felhasználásra.
{
"scripts": {
"test": "vitest",
"coverage": "vitest run --coverage"
}
}
A konfigurálásához állítsa be a test.coverage
beállításokat a konfigurációs fájlban:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
reporter: ['text', 'json', 'html'],
},
},
});
Egyéni kódlefedettség-riporter
Egyéni lefedettségi riportereket használhat a csomag nevének vagy abszolút útvonalának megadásával a test.coverage.reporter
opcióban:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
reporter: [
// Riportáló megadása az NPM csomag nevével
['@vitest/custom-coverage-reporter', { someOption: true }],
// Riportáló megadása helyi útvonallal
'/absolute/path/to/custom-reporter.cjs',
],
},
},
});
Az egyéni riportereket az Istanbul tölti be, és meg kell felelniük az Istanbul riporter interfészének. Lásd a beépített riporterek implementációját referenciaként.
const { ReportBase } = require('istanbul-lib-report');
module.exports = class CustomReporter extends ReportBase {
constructor(opts) {
super();
// A konfigurációból átadott beállítások itt elérhetők
this.file = opts.file;
}
onStart(root, context) {
this.contentWriter = context.writer.writeFile(this.file);
this.contentWriter.println('Egyéni lefedettségi jelentés kezdete');
}
onEnd() {
this.contentWriter.println('Egyéni lefedettségi jelentés vége');
this.contentWriter.close();
}
};
Egyéni kódlefedettség-szolgáltató
Lehetőség van saját egyéni lefedettségi szolgáltató megadására is, a test.coverage.provider
opcióban 'custom'
érték megadásával:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
provider: 'custom',
customProviderModule: 'my-custom-coverage-provider',
},
},
});
Az egyéni szolgáltatókhoz customProviderModule
opció szükséges, amely a CoverageProviderModule
betöltéséhez szükséges modul nevét vagy útvonalát adja meg. Ennek egy objektumot kell exportálnia, amely alapértelmezett exportként implementálja a CoverageProviderModule
interfészt:
import type {
CoverageProvider,
CoverageProviderModule,
ResolvedCoverageOptions,
Vitest,
} from 'vitest';
const CustomCoverageProviderModule: CoverageProviderModule = {
getProvider(): CoverageProvider {
return new CustomCoverageProvider();
},
// Megvalósítja a CoverageProviderModule többi részét ...
};
class CustomCoverageProvider implements CoverageProvider {
name = 'custom-coverage-provider';
options!: ResolvedCoverageOptions;
initialize(ctx: Vitest) {
this.options = ctx.config.coverage;
}
// Megvalósítja a CoverageProvider többi részét ...
}
export default CustomCoverageProviderModule;
További részletekért tekintse meg a típusdefiníciót.
Az alapértelmezett kódlefedettség-mappa helyének módosítása
Amikor lefedettségi jelentést futtat, egy coverage
mappa jön létre a projekt gyökérkönyvtárában. Ha ezt egy másik könyvtárba szeretné áthelyezni, használja a test.coverage.reportsDirectory
beállítást a vitest.config.js
fájlban.
import { defineConfig } from 'vite';
export default defineConfig({
test: {
coverage: {
reportsDirectory: './tests/unit/coverage',
},
},
});
Kód kihagyása
Mindkét lefedettségi szolgáltató saját módszerekkel rendelkezik a kód figyelmen kívül hagyására a lefedettségi jelentésekből:
v8
ìstanbul
v8
aexperimentalAstAwareRemapping: true
opcióval lásd: ast-v8-to-istanbul | Kód figyelmen kívül hagyása
TypeScript használatakor a forráskódokat esbuild
segítségével transzpilálják, amely eltávolítja az összes megjegyzést a forráskódból (esbuild#516). Azok a megjegyzések, amelyek legális megjegyzéseknek minősülnek, megőrzésre kerülnek.
Beilleszthet egy @preserve
kulcsszót a figyelmen kívül hagyási jelzésbe. Vigyázzon, ezek a figyelmen kívül hagyási jelzések mostantól a végső éles buildbe is bekerülhetnek.
-/* istanbul ignore if */
+/* istanbul ignore if -- @preserve */
if (condition) {
-/* v8 ignore if */
+/* v8 ignore if -- @preserve */
if (condition) {
Egyéb opciók
A lefedettség összes konfigurálható beállításának megtekintéséhez lásd a lefedettség konfigurációs referenciáját.
Lefedettség teljesítménye
Ha a kódlefedettség generálása lassú a projektjében, lásd a Teszt teljesítmény profilozása | Kódlefedettség részt.
Vitest UI
A lefedettségi jelentést a Vitest UI felületén ellenőrizheti.
A Vitest UI akkor engedélyezi a lefedettségi jelentést, ha az expliciten engedélyezve van, és az HTML lefedettségi riporter elérhető, ellenkező esetben nem lesz elérhető:
- engedélyezze a
coverage.enabled=true
beállítást a konfigurációs fájlban, vagy futtassa a Vitestet a--coverage.enabled=true
jelzővel - adja hozzá az
html
értéket acoverage.reporter
listához: engedélyezheti asubdir
beállítást is, hogy a lefedettségi jelentést egy alkönyvtárba helyezze



