Покриття (coverage) - частка коду, яка виконалася під час тестів.
npm install -D @vitest/coverage-v8
npx vitest run --coverage
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
price.js | 100 | 75 | 100 | 100 | 12
cart.js | 62.50 | 50 | 66.66 | 62.50 | 18-24,31
Метрики:
| Метрика | Що рахує |
|---|---|
| Statements / Lines | виконані інструкції чи рядки |
| Functions | функції, які хоч раз викликали |
| Branches | гілки умов: обидві частини if/else, ? :, ??, && |
Branches - найкорисніша: 100% рядків може бути навіть тоді, коли гілка else жодного разу не перевірялася.
Провайдери у Vitest: v8 (за замовчуванням, використовує вбудоване покриття рушія, швидкий) і istanbul (інструментує код, працює в будь-якому середовищі).
Що покриття НЕ показує:
- чи є перевірки: тест, що викликає функцію без жодного
expect, дає 100% покриття і нічого не перевіряє; - чи перевірки правильні: код виконано, але очікуваний результат у тесті міг бути скопійований з помилкової реалізації;
- граничні випадки: рядок
price * qtyпокрито, але ніхто не перевірив від'ємну кількість, нуль, дробові значення; - поєднання умов: обидві гілки двох
ifпокрито окремо, але не всі чотири комбінації; - інтеграцію: кожен модуль покрито, а разом вони не працюють.
Як користуватися з розумом:
- дивитися на непокриті рядки, а не на відсоток: звіт показує, яку логіку забули перевірити;
- поріг у CI (
coverage.thresholds) - захист від падіння покриття, але не ціль. Вимога «90% будь-якою ціною» породжує тести без сенсу; - виключити згенерований код, конфігурації, типи (
coverage.exclude), щоб вони не спотворювали картину.
Що краще оцінює якість тестів - мутаційне тестування (Stryker для JavaScript, Pest Mutate для PHP): інструмент навмисно змінює код (> на >=, + на -) і перевіряє, чи впаде хоч один тест. Якщо мутація «вижила» - тести цей код насправді не перевіряють.