Coverage Studio у командному рядку 2.2026.4 — файл, який виміряли два рушії, рахується один раз, звідки б ви не запустили команду
2026-10-04
Виправлено
- Тека, з якої ви запускаєте команду, не вирішує, що означає звіт. 2.2026.3 прив’язує відносні шляхи звіту до теки, у якій цей звіт було записано, — але лише для команди, запущеної десь інде. Запущений із кореня дерева, яке він вимірює, тобто там, де команду покриття зазвичай і запускають, відносний шлях і далі розв’язувався щодо цієї теки, і файл, який llvm-cov уже назвав повним шляхом, рахувався вдруге: дерево з 5258 рядків читалося як 5836. Тепер вирішують лише
--cwd і місце самого звіту. Те саме виправлення є в обох редакторах, де такою текою була та, з якої запустили VS Code чи Visual Studio. export --format json записував прогін поверх ваших налаштувань. Його файл звався fucini-coverage.json — так само, як файл, з якого читаються налаштування, — тож у звичайно налаштованій теці експорт нищив ті самі пороги, за якими щойно судив. Прогін записується у coverage-run.json, а export і badge відмовляють --out, що називає файл налаштувань. --cwd приймає теку, хоч як ви її напишете. Відносну — --cwd ., --cwd ../tree — брали так, як її набрано, і читали за хибними правилами шляхів: у Windows команда відповідала, що файл налаштувань, наполовину POSIX і наполовину Windows, прочитати не вдається, і не знаходила жодного звіту. Кінцевий роздільник теж більше не є частиною теки. - Прапорець, якого ніхто не оголошував, — не звіт.
summary -o out.json брав -o за звіт і повідомляв, що такого файлу немає. Короткими є лише -h і -v; -- і далі передає файл, ім’я якого починається з дефіса, а прапорець, набраний перед командою, називається в помилці замість того, щоб отримати у відповідь усю довідку. check --json каже те саме, що й його код виходу. Без заданого порога він писав "passed": false поруч із кодом виходу 0, і конвеєр, який читав JSON замість коду виходу, валив прогін, що його команда зарахувала. passed — це код виходу одним словом; configured — те, що каже, що порога не було зовсім. Порожнє --lines "" відхиляється, а не вимикає цей поріг мовчки. - Порівняння кладе базовий звіт туди, куди кладе й прогін.
pathRemap і корінь, який називає звіт, застосовувалися до прогону, але не до базового звіту, тож базовий звіт, записаний на сервері збірки, не збігався ні з чим, і порівняння повідомляло, що ніщо не зрушило, поруч із підсумком, який явно зрушив.
Coverage Studio у командному рядку 2.2026.3 — файл, який виміряли два рушії, знову є одним файлом
2026-10-04
Виправлено
- Відносні шляхи звіту прив’язані до теки, де цей звіт було записано. llvm-cov записує повний шлях файлу; gcovr записує його відносно теки збірки, у якій лежить його звіт. Маючи обидва звіти одного дерева,
summary перелічував двічі кожен файл, спільний для них, — по разу з числами кожного рушія — і додавав обидва до підсумку, бо відносний шлях не мав кореня, щодо якого його розв’язати, і розв’язувався щодо теки, у якій саме була оболонка. Дерево з 5258 рядків подавалося як 5836, а надлишок належав файлам під шляхом, який не містить жодного з них. Тепер кожен звіт прив’язується до своєї теки та тек над нею, аж до теки, у якій виконується команда, як це вже роблять обидві редакції — тож обидва сходяться як один набір файлів, без правила pathRemap для кожної теки збірки. - Файл налаштувань, що починається з позначки порядку байтів, також відхилявся. Редактор у Windows може записати її перед текстом; її більше не вважають частиною JSON.
- Вивід, спрямований до читача, який зупиняється рано, завершується тихо.
summary, спрямований до head або до Select-Object -First у PowerShell, помирав з необробленим EPIPE і трасуванням стека. Те, що читач закриває канал, — його власний вибір, а не збій команди: тепер вона завершується з тим кодом виходу, якого досягла.
Coverage Studio у командному рядку 2.2026.1 — файл налаштувань із шаблонами читається
2026-10-04
Виправлено
- Файл налаштувань із шаблонами відхилявся. Якщо в одному шляху
fuciniCoverage.coverageFile.paths стояло **/*.lcov.info, а в наступному — **/coverage.json, кожна команда завершувалася повідомленням is not JSON: те, що між ними, сприймалося як коментар. Тепер файл читається так, як його читають редактори, — зокрема з коментарем після значення та комою перед закривальною дужкою.
Coverage Studio у командному рядку 2.2026.0 — fucini-coverage, перший випуск
2026-10-04
Додано
- Читач у командному рядку, безкоштовно.
npm install -g fucini-coverage — той самий читач, що й у двох редакціях, для місць, де редактора немає. Один пакет, одна поведінка на Windows, Linux, WSL і macOS, Node 20 або новіший.
check, контрольна точка. Код виходу 1, якщо не досягнуто порога для рядків, гілок, функцій, MC/DC, умов, регіонів, мутацій або зваженої оцінки, з налаштувань чи з командного рядка; --new-code 80 --base-ref origin/main судить рядки, які змінила гілка, за git diff, який запускає сам інструмент; --require-reasons завалює позначку виключення без причини.
summary, export, report, badge, compare. Підсумки й кожен файл; запуск як CSV за файлами чи за функціями, Markdown, LCOV, Cobertura, SARIF, список виключень, значок або Fucini JSON; багатосторінковий HTML-звіт; значок, розфарбований за шкалою з налаштувань; цей запуск відносно базового, регресії першими, з --fail-on-regression для перевірки pull request.
mcp, для ШІ-агента. Шість інструментів редакцій, що обслуговуються над запуском на 127.0.0.1 за токеном, із надрукованим записом для mcp.json клієнта.
- Файл налаштувань редакції для Visual Studio.
fucini-coverage.json поруч із кодом, із ключами fuciniCoverage.* налаштувань VS Code; .vscode/settings.json нижче за нього. Звіти називаються як файли, теки або шаблони, .gz розпаковується, і кожна команда документує себе сама: fucini-coverage help <command>.
Coverage Studio для VS Code 2.2026.2 — пробний період починається з відповіді сервера ліцензій
2026-10-04
Змінено
- Пробний період нової інсталяції починається з першої відповіді сервера ліцензій. Доки розширення один раз не зв’яжеться з fucini.software, воно працює на рівні Community і пояснює чому. Інсталяція, яка вже має пробний період або ліцензію, нічого не помітить.
- Жодного пробного періоду в контейнері розробки або Codespace. Там розширення стартує на рівні Community; усе відкриває код підписки, ключ або 7-денна перепустка.
- Журнал використання знає машину за другим хешем — від власного ідентифікатора операційної системи. Надсилається лише хеш; див. політику конфіденційності.
Coverage Studio для Visual Studio 2.2026.1 — дрібні виправлення
2026-10-04
Виправлено
- Дрібні виправлення. Супровідний випуск: невеликі внутрішні виправлення, і нічого, що змінює те, що ви бачите, або спосіб користування.
Coverage Studio для VS Code 2.2026.1 — дрібні виправлення
2026-10-04
Виправлено
- Дрібні виправлення. Супровідний випуск: невеликі внутрішні виправлення, і нічого, що змінює те, що ви бачите, або спосіб користування.
Coverage Studio для Visual Studio 2.2026.0 — покриття на екрані, для ШІ-агентів
2026-10-04
Додано
- Покриття на екрані, для ШІ-агентів. Агент, що пише тести, міг запустити їх і прочитати відсоток; він не міг запитати, що знає Visual Studio. На це відповідають шість інструментів, словами, за якими агент може діяти:
coverage_summary, coverage_gaps, tests_for_line, patch_coverage, coverage_delta і test_run_command. Агент, що розмовляє MCP, дістається до них через сервер, який Visual Studio запускає, коли ввімкнено fuciniCoverage.mcp.enabled, — типово вимкнено, лише на 127.0.0.1, за вашим власним токеном і закрито для вебсторінок. Copy MCP Server Configuration кладе запис для клієнта в буфер обміну. - Ті самі числа, що й на екрані. Інструменти відповідають із завантаженого запуску — ті самі виключення, те саме перепризначення шляхів, — тож агент, якому сказано покрити прогалини функції, і рецензент, який дивиться на поле, говорять про ті самі рядки.
Змінено
- План ключа вирішує у Visual Studio те саме, що й у VS Code. План, який не містить якоїсь функції — MC/DC, HTML-звіту, назв тестів, що виконали рядок, — не давав її у VS Code, але давав тут. Тепер обидві редакції читають ту саму таблицю: функція, якої немає в плані, недоступна, і її команда про це каже.
- Мінімальна версія, якої вимагає сервер ліцензій, діє і тут. Обидві редакції мають однакову версію, починаючи з 2.2026.0, тож збірка, старіша за цей мінімум, просить оновлення, як це робить редакція для VS Code.
Coverage Studio для VS Code 2.2026.0 — покриття на екрані, для ШІ-агентів
2026-10-04
Додано
- Покриття на екрані, для ШІ-агентів. Агент, що пише тести, міг запустити їх і прочитати відсоток; він не міг запитати, що знає редактор. На це відповідають шість інструментів, словами, за якими агент може діяти:
coverage_summary, coverage_gaps, tests_for_line, patch_coverage, coverage_delta і test_run_command. Власний агент VS Code має їх як інструменти мовної моделі, без жодного налаштування. Будь-який інший агент, що розмовляє MCP, дістається до них через сервер, який розширення запускає, коли ввімкнено fuciniCoverage.mcp.enabled, — типово вимкнено, лише на 127.0.0.1, за вашим власним токеном і закрито для вебсторінок. Copy MCP Server Configuration кладе запис для клієнта в буфер обміну. - Ті самі числа, що й на екрані. Інструменти відповідають із завантаженого запуску — ті самі виключення, те саме перепризначення шляхів, — тож агент, якому сказано покрити прогалини функції, і рецензент, який дивиться на поле, говорять про ті самі рядки.
Coverage Studio для Visual Studio 1.2026.22 — файл, який виміряли два рушії, є одним файлом
2026-10-04
Виправлено
- Файл, який виміряли два рушії, є одним файлом. llvm-cov записує повний шлях файлу; gcovr записує його відносно теки збірки, у якій лежить його звіт. Відносний шлях прив’язується до власної теки звіту та тек над нею — але перед тим розв’язувач питав, чи існує шлях таким, яким він є, а на це питання відповідає тека, з якої запущено сам Visual Studio. Якщо ця тека містила файл, шлях лишався відносним: файл мав два імені, двічі з’являвся у вікні Coverage і двічі входив до підсумків. Дерево з 5258 рядків читалося як 5836. Шлях, який не називає власного місця, більше взагалі не питають; його прив’язують туди, де було записано звіт, і рядок це показує.
Coverage Studio для VS Code 1.2026.23 — файл, який виміряли два рушії, є одним файлом, а вибраний режим смужки не потрапляє у ваші налаштування
2026-10-04
Виправлено
- Файл, який виміряли два рушії, є одним файлом. llvm-cov записує повний шлях файлу; gcovr записує його відносно теки збірки, у якій лежить його звіт. Відносний шлях прив’язується до власної теки звіту та тек над нею — але перед тим розв’язувач питав, чи існує шлях таким, яким він є, а на це питання відповідає тека, з якої запущено extension host, тобто після
code . — корінь вашого проєкту. Шлях тоді лишався відносним: файл мав два імені, двічі з’являвся у поданні Coverage і двічі входив до підсумків. Дерево з 5258 рядків читалося як 5836. Шлях, який не називає власного місця, більше взагалі не питають; його прив’язують туди, де було записано звіт, і рядок це показує. - Вибраний режим смужки тримається протягом сеансу, а ваші налаштування лишаються такими, як ви їх написали. Вибір режиму в рядку стану, у списку або через Toggle Coverage Painting записував його у
settings.json — файл, який у багатьох проєктах під контролем версій, і переписувала його кнопка, призначена для натискання двічі на хвилину. Тепер вибір живе протягом сеансу, а режим, який ви вписали в налаштування, і далі перемагає, коли вікно відкривається.
Coverage Studio для Visual Studio 1.2026.21 — чи помітив би тест? Мутаційний запуск на курсорі
2026-10-03
Додано
- Run Mutation Tests Here. Покриття каже, що рядок виконався; інструмент мутаційного тестування каже, чи помітив би тест, що рядок хибний. Функція, у якій стоїть курсор, — або виділені рядки, або файл — це те, що засобу запуску теки наказано мутувати, і його звіт завантажується поруч із покриттям на екрані: Stryker.NET для C#, StrykerJS для JavaScript і TypeScript, PIT із Maven для Java. Мутаційний запуск проєкту триває годину; однієї функції — хвилину.
Coverage Studio для VS Code 1.2026.22 — чи помітив би тест? Мутаційний запуск на курсорі
2026-10-03
Додано
- Run Mutation Tests Here. Покриття каже, що рядок виконався; інструмент мутаційного тестування каже, чи помітив би тест, що рядок хибний. Функція, у якій стоїть курсор, — або виділені рядки, або файл — це те, що засобу запуску теки наказано мутувати, і його звіт завантажується поруч із покриттям на екрані: Stryker.NET для C#, StrykerJS для JavaScript і TypeScript, PIT із Maven для Java. Мутаційний запуск проєкту триває годину; однієї функції — хвилину.
Coverage Studio для Visual Studio 1.2026.20 — сам застосунок, із покриттям
2026-10-03
Додано
- Run App with Coverage… вимірює те, до чого доходить людина, а не лише те, що роблять тести: застосунок .NET із теки запускається під
dotnet-coverage від Microsoft, у власній консолі, і працює, доки його не закриють. Те, що було пройдено, потім завантажується як будь-який запуск, а в сеансі покриття додається до того, що виконали тести. Потрібно dotnet tool install --global dotnet-coverage.
Coverage Studio для VS Code 1.2026.21 — сам застосунок, із покриттям
2026-10-03
Додано
- Run App with Coverage… вимірює те, до чого доходить людина, а не лише те, що роблять тести: застосунок .NET із теки запускається під
dotnet-coverage від Microsoft, у власній консолі, і працює, доки його не закриють. Те, що було пройдено, потім завантажується як будь-який запуск, а в сеансі покриття додається до того, що виконали тести. Потрібно dotnet tool install --global dotnet-coverage.
Coverage Studio для Visual Studio 1.2026.19 — zip-артефакти з GitHub і GitLab
2026-10-03
Додано
- Базовий звіт CI із zip-артефакту. GitHub і GitLab публікують артефакт як архів. Якщо
baseline.report називає такий — URL-адресу або zip на диску, — він відкривається, і звіт із нього зберігається: елемент, названий після # (ci/artifact.zip#coverage/lcov.info), інакше єдиний файл архіву, інакше єдиний його файл, схожий на звіт.
Coverage Studio для VS Code 1.2026.20 — zip-артефакти з GitHub і GitLab
2026-10-03
Додано
- Zip-артефакти з GitHub і GitLab. CI публікує артефакт, а артефакт — це архів. Отриманий zip тепер відкривається, і звіт із нього зберігається — елемент, названий після
# в URL-адресі (…/zip#coverage/lcov.info), інакше єдиний файл архіву, інакше єдиний його файл, схожий на звіт. Для URL-адреси в coverageFile.paths, для baseline.report і для базового звіту, який є zip-файлом на диску.
Виправлено
- Файли базового звіту Cobertura не знаходилися під власним
<source> звіту. Порівняння казало 0 file(s) moved поруч із підсумком, який змінився. Тепер використовується корінь, який називає звіт, як і для звіту, що завантажується.
Coverage Studio для Visual Studio 1.2026.18 — новий код за автором і за датою
2026-10-03
Додано
- Новий код за автором і за датою. Новим кодом були рядки, змінені відносно посилання git. Два параметри питають про те, чого посилання не може:
fuciniCoverage.gitDiff.author — рядки, написані однією людиною, — і fuciniCoverage.gitDiff.since — рядки, написані від певного дня. Обидва зчитуються з git blame і застосовуються до покриття змін і до порогу для нового коду.
Coverage Studio для VS Code 1.2026.19 — новий код за автором і за датою
2026-10-03
Додано
- Новий код за автором і за датою. Новим кодом були рядки, змінені відносно посилання git. Два параметри питають про те, чого посилання не може:
fuciniCoverage.gitDiff.author — рядки, написані однією людиною, — і fuciniCoverage.gitDiff.since — рядки, написані від певного дня. Обидва зчитуються з git blame і застосовуються до покриття змін і до порогу для нового коду.
Coverage Studio для Visual Studio 1.2026.17 — один тест із покриттям, у Go та Rust
2026-10-02
Додано
- Run This Test with Coverage читає Go і Rust. У файлі Go
func TestXxx під курсором запускається сама, у власному пакеті й за точною назвою — go test ./pkg/calc -run "^TestTotal$". У файлі Rust функція #[test] запускається за своїм шляхом у крейті, з --exact; у mod — тести цього модуля; інтеграційний тест у tests/ — у власному бінарнику.
Coverage Studio для VS Code 1.2026.18 — один тест із покриттям, у Go та Rust
2026-10-02
Додано
- Run This Test with Coverage читає Go і Rust. У файлі Go
func TestXxx під курсором запускається сама, у власному пакеті й за точною назвою — go test ./pkg/calc -run "^TestTotal$". У файлі Rust функція #[test] запускається за своїм шляхом у крейті, з --exact; у mod — тести цього модуля; інтеграційний тест у tests/ — у власному бінарнику.
Coverage Studio для Visual Studio 1.2026.16 — покриття умов GCC 14, рядок за рядком
2026-10-02
Додано
- Покриття умов GCC 14, рядок за рядком.
-fcondition-coverage читався як два лічильники на файл; тепер кожна умова позначається на своєму рядку й називається в підказці — умова 1 ніколи не була істинною, умова 0 ніколи не була ні істинною, ні хибною — з JSON від gcov і з його текстового лістингу. threshold.conditions задає для нього поріг, Copy Coverage Summary має стовпець Conditions, badge.metric приймає conditions, а пошук — conditions < 80.
Виправлено
- Показник гілок функції рахував і результати її умов.
branches 8/12 там, де інструмент казав 4 із 6. Умови там не враховуються, як і в показниках файлу та запуску.
Coverage Studio для VS Code 1.2026.17 — покриття умов GCC 14, рядок за рядком
2026-10-02
Додано
- Покриття умов GCC 14, рядок за рядком.
-fcondition-coverage читався як два лічильники на файл; тепер кожна умова позначається на своєму рядку й називається в підказці — умова 1 ніколи не була істинною, умова 0 ніколи не була ні істинною, ні хибною — з JSON від gcov і з його текстового лістингу. threshold.conditions задає для нього поріг, Copy Coverage Summary має стовпець Conditions, badge.metric приймає conditions, а пошук — conditions < 80.
Виправлено
- Показник гілок функції рахував і результати її умов.
branches 8/12 там, де інструмент казав 4 із 6. Умови там не враховуються, як і в показниках файлу та запуску.
Coverage Studio для Visual Studio 1.2026.15 — подання Coverage стежить за редактором
2026-10-02
Додано
- Подання Coverage стежить за редактором. Файл, на який ви дивитеся, підсвічується в дереві, теки над ним розгортаються, а його рядок прокручується у видиму область.
fuciniCoverage.coverageView.followActiveEditor це вимикає.
Coverage Studio для VS Code 1.2026.16 — подання Coverage стежить за редактором
2026-10-02
Додано
- Подання Coverage стежить за редактором. Файл, на який ви дивитеся, підсвічується в дереві, теки над ним розгортаються, а його рядок прокручується у видиму область.
fuciniCoverage.coverageView.followActiveEditor це вимикає.
Coverage Studio для Visual Studio 1.2026.14 — позначки виключення лише для гілок і покриття гілок у звітах .NET
2026-10-02
Додано
- Позначки виключення лише для гілок і позначки gcovr.
LCOV_EXCL_BR_LINE і LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP вилучають із підрахунку гілки на своїх рядках, а самі рядки лишають; LCOV_EXCL_EXCEPTION_BR_LINE вилучає лише ті гілки, яких досягає виняток. Кожна позначка читається і з префіксами gcovr: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOV_EXCL_BR_LINE та решта.
Виправлено
- Звіт .NET не показував покриття гілок. Coverlet і
dotnet-coverage записують атрибут branch рядка Cobertura як True, а читався лише true з малої літери — тож кожне рішення в такому звіті відкидалося. Тепер читаються обидва написання. Числа зміняться: покриття гілок проєкту .NET з'являється там, де його не було, а з ним і його оцінка. - Звіт Cobertura, об'єднаний із кількох дерев, знаходив лише файли першого дерева. Такий звіт називає по одному
<source> на дерево; тепер пробується кожен, у порядку звіту.
Coverage Studio для VS Code 1.2026.15 — позначки виключення лише для гілок і покриття гілок у звітах .NET
2026-10-02
Додано
- Позначки виключення лише для гілок і позначки gcovr.
LCOV_EXCL_BR_LINE і LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP вилучають із підрахунку гілки на своїх рядках, а самі рядки лишають; LCOV_EXCL_EXCEPTION_BR_LINE вилучає лише ті гілки, яких досягає виняток. Кожна позначка читається і з префіксами gcovr: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOV_EXCL_BR_LINE та решта.
Виправлено
- Звіт .NET не показував покриття гілок. Coverlet і
dotnet-coverage записують атрибут branch рядка Cobertura як True, а читався лише true з малої літери — тож кожне рішення в такому звіті відкидалося. Тепер читаються обидва написання. Числа зміняться: покриття гілок проєкту .NET з'являється там, де його не було, а з ним і його оцінка. - Звіт Cobertura, об'єднаний із кількох дерев, знаходив лише файли першого дерева. Такий звіт називає по одному
<source> на дерево; тепер пробується кожен, у порядку звіту.
Coverage Studio для Visual Studio 1.2026.13 — найменше тестів, які все ще виконують кожен рядок
2026-10-01
Додано
- Show Minimal Test Set… знаходить найменшу кількість тестів, які все ще виконують кожен рядок, що його виконує набір, і перелічує під ними тести, які не додають жодного власного рядка. Для швидкого запуску перед комітом і для тих, хто проріджує набір, — з нагадуванням, що зайвий за рядками не означає зайвий за тим, що тест перевіряє.
Coverage Studio для VS Code 1.2026.14 — найменше тестів, які все ще виконують кожен рядок
2026-10-01
Додано
- Show Minimal Test Set… знаходить найменшу кількість тестів, які все ще виконують кожен рядок, що його виконує набір, і перелічує під ними тести, які не додають жодного власного рядка. Для швидкого запуску перед комітом і для тих, хто проріджує набір, — з нагадуванням, що зайвий за рядками не означає зайвий за тим, що тест перевіряє.
Coverage Studio для Visual Studio 1.2026.12 — виключення, які кажуть чому
2026-10-01
Додано
- Обґрунтовані виключення. Код, вилучений із підрахунку там, де його написано, може сказати чому —
// LCOV_EXCL_LINE: defensive, unreachable by construction, [ExcludeFromCodeCoverage(Justification = "…")], — і причини потрапляють у звіт: Export Coverage Report… перелічує виключення та їхні обґрунтування у Markdown і в CSV. З fuciniCoverage.exclusions.requireReason виключення, що не називає причини, стає попередженням на своєму рядку й не дає пройти Check Coverage Thresholds.
Coverage Studio для VS Code 1.2026.13 — виключення, які кажуть чому
2026-10-01
Додано
- Обґрунтовані виключення. Код, вилучений із підрахунку там, де його написано, може сказати чому —
// LCOV_EXCL_LINE: defensive, unreachable by construction, [ExcludeFromCodeCoverage(Justification = "…")], — і причини потрапляють у звіт: Export Coverage Report… перелічує виключення та їхні обґрунтування у Markdown і в CSV. З fuciniCoverage.exclusions.requireReason виключення, що не називає причини, стає попередженням на своєму рядку й не дає пройти Check Coverage Thresholds.
Coverage Studio для Visual Studio 1.2026.11 — поріг для нового коду і покриття, що змінилося без жодної правки
2026-10-01
Додано
- Поріг для нового коду, поруч із порогами для всього запуску.
fuciniCoverage.threshold.newCode — це найменше покриття рядків, у відсотках, для рядків, змінених відносно gitDiff.baseRef. Check Coverage Thresholds повідомляє про його порушення окремим реченням — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran), — а весь запуск лишається на екрані. - Show Indirect Coverage Changes… перелічує рядки, покриття яких змінилося, хоча ніхто їх не редагував, — код, що перестав виконуватися, бо зник тест або бо гілка вище в коді тепер повертає керування раніше. Відносно базового звіту CI, якщо
baseline.report його називає, інакше — відносно попереднього запуску.
Coverage Studio для VS Code 1.2026.12 — поріг для нового коду і покриття, що змінилося без жодної правки
2026-10-01
Додано
- Поріг для нового коду, поруч із порогами для всього запуску.
fuciniCoverage.threshold.newCode — це найменше покриття рядків, у відсотках, для рядків, змінених відносно gitDiff.baseRef. Check Coverage Thresholds повідомляє про його порушення окремим реченням — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran), — а весь запуск лишається на екрані. - Show Indirect Coverage Changes… перелічує рядки, покриття яких змінилося, хоча ніхто їх не редагував, — код, що перестав виконуватися, бо зник тест або бо гілка вище в коді тепер повертає керування раніше. Відносно базового звіту CI, якщо
baseline.report його називає, інакше — відносно попереднього запуску.
Coverage Studio для Visual Studio 1.2026.10 — запуск лише тих тестів, яких торкаються ваші зміни
2026-10-01
Додано
- Run Tests Affected by My Changes… перелічує тести, які виконали рядок, що його робоче дерево змінює відносно
fuciniCoverage.testImpact.baseRef (типово HEAD), першим — той, що виконав найбільшу частину зміни. Вибір тесту відкриває його; там, де звіти отримано із запуску для кожного тесту (testRun.perTest), перший пункт запускає лише ці тести.
Виправлено
testRun.skipWhenTestsFail діє і після запуску. Звіти, записані червоним запуском, лишалися на диску, де спостерігач завантажував їх за мить. Тепер їх вилучають.- Копію звіту про покриття, яку робить засіб журналювання TRX, ніколи не приймають за трасувальний файл.
Coverage Studio для VS Code 1.2026.11 — запуск лише тих тестів, яких торкаються ваші зміни
2026-10-01
Додано
- Run Tests Affected by My Changes… перелічує тести, які виконали рядок, що його робоче дерево змінює відносно
fuciniCoverage.testImpact.baseRef (типово HEAD), першим — той, що виконав найбільшу частину зміни. Вибір тесту відкриває його; там, де звіти отримано із запуску для кожного тесту (testRun.perTest), перший пункт запускає лише ці тести.
Виправлено
testRun.skipWhenTestsFail діє і після запуску. Звіти, записані червоним запуском, лишалися на диску, де спостерігач завантажував їх за мить. Тепер їх вилучають.- Копію звіту про покриття, яку робить засіб журналювання TRX, ніколи не приймають за трасувальний файл.
Coverage Studio для Visual Studio 1.2026.9 — пройдено чи ні — на позначках, і власні файли покриття коду Visual Studio
2026-09-30
Додано
- Пройдено чи ні — на позначках. Рядок, який виконав тест, що не пройшов, отримує червону смужку на початку, а його підказка називає тести, що не пройшли; Show Tests That Ran This Line каже, які з тестів не пройшли. Для цього потрібен звіт, який каже, які тести виконали рядок, і файл результатів засобу запуску тестів — TRX або JUnit XML — у теці звіту або вказаний у
fuciniCoverage.testResults.paths. Run Tests with Coverage тепер просить такий файл у dotnet test. - Власне покриття коду Visual Studio — завантажене. Файл
.coverage, який записує Analyze Code Coverage у Visual Studio, конвертується за допомогою dotnet-coverage і завантажується сам: Coverage Studio спирається на вбудований збирач, а не змагається з ним.
Coverage Studio для VS Code 1.2026.10 — пройдено чи ні — на позначках
2026-09-30
Додано
- Пройдено чи ні — на позначках. Рядок, який виконав тест, що не пройшов, отримує червону смужку на початку, а його підказка називає тести, що не пройшли; Show Tests That Ran This Line каже, які з тестів не пройшли. Для цього потрібен звіт, який каже, які тести виконали рядок, і файл результатів засобу запуску тестів — TRX або JUnit XML — у теці звіту або вказаний у
fuciniCoverage.testResults.paths. Run Tests with Coverage тепер просить такий файл у dotnet test.
Coverage Studio для Visual Studio 1.2026.8 — перезавантаження, що зберігають ваш пошук, ваш сеанс і ваш останній запуск
2026-09-30
Виправлено
- Поле пошуку зберігає запит і фокус, коли покриття перезавантажується. Кожне перезавантаження очищало його, часто ще під час набору запиту. Запит на кшталт
< 80% також зберігає ризикові гарячі точки, які йому відповідають. - Сеанс покриття більше не рахує той самий запуск двічі. Кожне перезавантаження незмінених звітів додавало їх знову, і кожен лічильник виконань подвоювався. Тепер сеанс зберігає кожен набір звітів один раз.
- Базовий звіт CI більше не затримує завантаження. Спершу показується завантажене, а порівняння йде слідом. Базовий звіт готується один раз і зберігається, доки його файл і налаштування лишаються незмінними, а коли URL-адреса недосяжна, використовується копія, отримана раніше.
- «Від останнього запуску» переживає перезавантаження незмінених звітів. Зміна налаштувань або оновлення робили запуск на екрані його ж останнім запуском, і всі зміни від попереднього запуску зникали. Таке повторне читання більше не зберігається і в історії.
- Одне завантаження за раз. Два перезавантаження, запитані разом, ішли паралельно, і перемагало повільніше. Перезавантаження, запитані під час завантаження, тепер стають одним завантаженням після нього.
- Базовий звіт CI через HTTP отримується так само, як у VS Code. Один клієнт, остання копія зберігається на випадок, коли сервер недосяжний, а
remote.headers надсилаються лише на адресу, для якої їх написано, — і ніколи через незахищений HTTP. - Команда, робота якої завершується невдачею, каже про це. Збій у команді чи таймері проковтувався; тепер це рядок у вікні Output.
- Менше роботи в потоці інтерфейсу. Спостерігачі за файлами створюються у фоні, записи Error List обчислюються один раз на завантаження, а журнал пишеться порціями, а не рядок за рядком.
- Два вікна Visual Studio більше не псують історію запусків. Її індекс замінюється за один крок під блокуванням, спільним для обох, і відтворюється із запусків, коли його втрачено.
- Run Native Project with Coverage збирає власну платформу проєкту і бере
llvm-cov та llvm-profdata з LLVM компілятора, парою. - Кольори попередження, помилки й успіху у вікні Coverage відповідають світлій темі так само, як і темній.
- Файл налаштувань, відкритий із незбереженими змінами, не перезаписується. Сторінка налаштувань каже спершу зберегти його.
Змінено
- Файл покриття, який ви обираєте, і звіт, який записує тестовий запуск, запам'ятовуються за вас, а не записуються в
.vscode/settings.json. Цей файл часто комітять, тож тестовий запуск лишав у репозиторії зміну, про яку ніхто не просив. Шляхи, які вже є в coverageFile.paths, працюють і далі.
Coverage Studio для VS Code 1.2026.9 — перезавантаження, що зберігають ваш пошук, ваш сеанс і ваш останній запуск
2026-09-30
Виправлено
- Поле пошуку зберігає запит і фокус, коли покриття перезавантажується. Кожне перезавантаження очищало його, часто ще під час набору запиту. Запит на кшталт
< 80% також зберігає ризикові гарячі точки, які йому відповідають. - Сеанс покриття більше не рахує той самий запуск двічі. Кожне перезавантаження незмінених звітів додавало їх знову, і кожен лічильник виконань подвоювався. Тепер сеанс зберігає кожен набір звітів один раз.
- Базовий звіт CI більше не затримує завантаження. Спершу показується завантажене, а порівняння йде слідом. Базовий звіт готується один раз і зберігається, доки його файл і налаштування лишаються незмінними, а коли URL-адреса недосяжна, використовується копія, отримана раніше.
- Перевірка змінених файлів звітів виконується по одному проходу за раз. На повільному мережевому диску два проходи бачили ту саму зміну, і покриття завантажувалося двічі.
- «Від останнього запуску» переживає перезавантаження незмінених звітів. Зміна налаштувань або оновлення робили запуск на екрані його ж останнім запуском, і всі зміни від попереднього запуску зникали. Таке повторне читання більше не зберігається і в історії.
Змінено
- Файл покриття, який ви обираєте, і звіт, який записує тестовий запуск, запам'ятовуються за вас, а не записуються в
.vscode/settings.json. Цей файл часто комітять, тож тестовий запуск лишав у репозиторії зміну, про яку ніхто не просив. Шляхи, які вже є в coverageFile.paths, працюють і далі.
Coverage Studio для Visual Studio 1.2026.7 — тестові запуски, що виконують саме те, що називають
2026-09-30
Виправлено
- Рішення .NET із двома чи більше тестовими проєктами більше не втрачає покриття всіх проєктів, крім одного.
dotnet test писав по звіту на проєкт, і всі вони переносилися в той самий coverage/coverage.cobertura.xml, тож завантажувався лише останній. Тепер така тека запускає dotnet test окремо для кожного тестового проєкту, кожен звіт потрапляє в coverage/<Project>/, а запуск одного проєкту замінює лише звіт цього проєкту. - Збереження кількох файлів одразу запускає тести кожного збереженого файлу. З
testRun.onSave запускалися тести лише останнього файлу; збереження, що надходять під час запуску, запам'ятовуються й запускаються разом після нього. - Run This Test with Coverage і запуски для кожного тесту виконують саме те, що називають. Фільтр .NET шукав за підрядком:
Total запускав і TotalTax. Тепер тест запускається за точною назвою, клас — за назвою з крапкою після неї, а тест у вкладеному класі знаходиться (Outer+Inner). - Тест jest або vitest, у назві якого є
(, + чи $, запускається. Назва передавалася в -t, який читає регулярний вираз, тож такий тест ні з чим не збігався і нічого не запускалося. - Run This Test with Coverage читає тестові файли VB і F#.
<Fact> над Public Sub і [<Fact>] над let чи member ніколи не розпізнавалися. - Скасування тестового запуску завершує кожен процес, який він запустив. Завершувалася лише оболонка, а
dotnet test працював далі за нею. Закриття Visual Studio теж скасовує запуск. - Набір тексту під час запуску після збереження більше не зсуває позначки. Вони прикріплені до тексту, який виміряв запуск.
- Рішення на мережевому ресурсі запускає свої тести там. Запуск починався в
C:\Windows, бо командна оболонка не приймає шлях \\server\share як свою теку.
Coverage Studio для VS Code 1.2026.8 — тестові запуски, що виконують саме те, що називають
2026-09-30
Виправлено
- Рішення .NET із двома чи більше тестовими проєктами більше не втрачає покриття всіх проєктів, крім одного.
dotnet test писав по звіту на проєкт, і всі вони переносилися в той самий coverage/coverage.cobertura.xml, тож завантажувався лише останній. Тепер така тека запускає dotnet test окремо для кожного тестового проєкту, кожен звіт потрапляє в coverage/<Project>/, а запуск одного проєкту замінює лише звіт цього проєкту. - Збереження кількох файлів одразу запускає тести кожного збереженого файлу. З
testRun.onSave запускалися тести лише останнього файлу; збереження, що надходять під час запуску, запам'ятовуються й запускаються разом після нього. - Run This Test with Coverage і запуски для кожного тесту виконують саме те, що називають. Фільтр .NET шукав за підрядком:
Total запускав і TotalTax. Тепер тест запускається за точною назвою, клас — за назвою з крапкою після неї, а тест у вкладеному класі знаходиться (Outer+Inner). - Тест jest або vitest, у назві якого є
(, + чи $, запускається. Назва передавалася в -t, який читає регулярний вираз, тож такий тест ні з чим не збігався і нічого не запускалося. - Назва тесту з лапками доходить до термінала цілою. Команда з
\" усередині лапок розпадалася на першій же з них. - Run This Test with Coverage читає тестові файли VB і F#.
<Fact> над Public Sub і [<Fact>] над let чи member ніколи не розпізнавалися. - Тестове завдання, що завершується, не запустивши процесу, більше не змушує Run Tests with Coverage чекати вічно. Команда завершується й каже, що запуск нічого не записав.
Coverage Studio для Visual Studio 1.2026.6 — які тести виконали рядок, покриття після кожного збереження і базовий звіт CI
2026-09-29
Додано
- Які тести виконали цей рядок. Там, де звіт це записує, — coverage.py з
--show-contexts, відстежувані методи OpenCover, трасувальний файл lcov, записаний для кожного тесту, — CodeLens функції каже, скільки тестів її виконали, а Show Tests That Ran This Line перелічує їх, найактивніші першими, і відкриває той, який ви оберете. Для запуску dotnet test параметр testRun.perTest запускає тести по одному класу, тож кожен звіт каже, який клас його записав.
- Покриття після кожного збереження. З
testRun.onSave збереження вихідного файлу запускає тести, що його покривають, з покриттям, і поле за цим стежить. У рішенні .NET запускаються лише тестові проєкти, які посилаються на проєкт збереженого файлу; кілька збережень поспіль — один запуск.
- Run This Test with Coverage. Коли курсор стоїть у тестовому методі, тестовому класі чи
describe або в тестовому файлі, одна команда запускає з покриттям саме це — dotnet test --filter, jest/vitest -t або ідентифікатор вузла pytest — і завантажує те, що він записав. Тест зчитується з тексту, тож це працює для C#, VB, F#, JavaScript, TypeScript і Python без мовної служби.
- Exclude from Coverage і два фільтри .NET. Клацання правою кнопкою на рядку дерева покриття або Exclude This File from Coverage для відкритого файлу додає файл чи теку до
fuciniCoverage.ignore, і він зникає з усіх підсумків. ignore.namespaces виключає файли простору імен (*.Migrations), а ignore.attributes — клас, метод чи властивість під атрибутом; типово це ExcludeFromCodeCoverage, який OpenCover, dotCover і конвертований lcov не враховують.
- Exclude Selection from Coverage. Виділіть рядки й оберіть дію в лампочці або в контекстному меню редактора: над класом, методом чи властивістю .NET вона пише
[ExcludeFromCodeCoverage] — у короткій формі, якщо файл уже імпортує System.Diagnostics.CodeAnalysis, — а деінде LCOV_EXCL_LINE або пару LCOV_EXCL_START/STOP у коментарі самої мови. Позначку, яка вже є, не дублює.
- Простори імен, класи й методи. Для звіту .NET, що називає свої класи, — Cobertura, Coverlet, OpenCover — список Folders / Namespaces показує той самий запуск за просторами імен, класами й методами, з тим самим сортуванням і фільтром; рядок методу відкриває файл на цьому методі. Типи, згенеровані компілятором, як-от
<>c і асинхронні автомати станів, згортаються в клас, для якого їх згенеровано.
- Поле пошуку над деревом покриття. Введіть слова, щоб лишилися рядки, чия назва або шлях містить їх усі, або порівняння —
< 80%, lines >= 90, branches = 0, — щоб лишилися рядки, чиє число його проходить; разом — обидві умови. Рядки методів і ризикові гарячі точки теж шукаються; Escape очищує.
- Run Native Project with Coverage. Стартовий проєкт C++, з меню Tools: проєкт ClangCL збирається ще раз з інструментуванням покриття clang у
coverage/native/, запускається, і його звіт завантажується; будь-який інший набір інструментів запускається під OpenCppCoverage, якщо той установлено, а коли не можна ні так, ні так, речення каже, що встановити.
- Сеанси покриття і тренд. Start Coverage Session — і кожен запуск, завантажений відтоді, додається до попередніх — рядки, гілки й функції однаково: те, що виконав будь-який із них, покрите, — тож модульні тести, інтеграційні тести й прохід застосунком показують, чого вони досягли разом. Під панеллю інструментів покриття рядків зі збереженої історії показано як тренд, одна точка на запуск.
- Compare Two History Runs, як у VS Code: оберіть два збережені запуски, і файли, що змінилися між ними, буде перелічено від старішого до новішого, хоч би який ви обрали першим.
- Compare with CI Baseline.
baseline.report називає звіт, який публікує збірка вашої основної гілки, — URL-адресу, що отримується з remote.headers, або завантажений файл, — і кожне завантаження порівнюється з ним: картка рядка стану каже, де стоїть цей запуск, а Compare with CI Baseline перелічує файли, що змінилися. Базовий звіт проходить той самий список виключень, що й запуск, тож підсумки порівнюються чесно.
- Де їх знайти. Нові команди — у Tools > Coverage Studio і в контекстному меню редактора; Show Tests That Ran This Line також доступна через Ctrl+Shift+U, T, а Exclude Selection from Coverage — як дія лампочки.
Виправлено
- Звіт тестового запуску більше не містить імені користувача й машини. Збирач Microsoft Code Coverage називає свій звіт
<user>_<machine>_<stamp>.cobertura.xml, і ця назва стояла в дереві й на кожному його знімку екрана; тепер звіт перейменовується на coverage.cobertura.xml перед завантаженням.
- Про згенерований файл казали, що його виключив
fuciniCoverage.ignore. Кожен виключений файл тепер рахується під параметром, який його виключив, — ignore, ignore.generated або ignore.namespaces, — тож показана назва і є тією, яку треба змінити.
- Трасувальний файл lcov, записаний для кожного тесту, читається як один запис на файл, з підсумованими секціями тестів, як його читає VS Code; раніше запис кожного тесту був окремим файлом.
- Журнал каже, що парсер пропустив. Файли, у яких парсер не знайшов нічого для інструментування (
FUCINI_PARSE_030), і власний опис прогалин у звіті (FUCINI_PARSE_031, MissingPdb від OpenCover) записуються в журнал, як їх записує VS Code.
- Заголовок із макросами більше не стоїть у дереві на 100%. llvm-cov і gcov приписують використання макросу рядкам, що його визначають; гілки й функції на виключених рядках тепер ідуть разом із рядками, а файл, у якому не лишилося нічого вимірюваного, вилучається із запуску й називається у виводі (
FUCINI_EXCLUDE_001).
- П'ять звітів, відхилених як непідтримуваний формат, тепер розпізнаються. JaCoCo XML від Kover, звіт Stryker.NET, звіт NCover, застарілий resultset SimpleCov і звіт SonarQube з багатьма порожніми файлами тепер впізнаються за тим, що вони містять на початку. Звіт Clover або SonarQube, у шляхах якого трапляється слово
cobertura, більше не читається як Cobertura.
- Числа, що збігаються з інструментами, які їх записали. Показник гілок збірки MC/DC збігається з
llvm-cov report; винятки-гілки LCOV 2 (BRDA:12,e0,1,3) рахуються; функція llvm-cov оголошується лише у файлі, який її визначає; блок Go, перелічений двома тестовими бінарниками, додає свої лічильники; рішення Cobertura, про яке звітують два класи, і рядок JaCoCo, перелічений двічі, зберігають усі свої гілки — один раз.
- Дрібніші. Трасувальний файл, обірваний посеред запису, більше не втрачає файл;
gcov -t над кількома файлами .gcda дає по файлу на кожен, екземпляри шаблонів читаються один раз, а лічильники на кшталт 1.20k з gcov -H зберігаються; файли GNATcoverage більше не всі позначаються як змінені після свого покриття; мутант Stryker у стані очікування чи перерваний запуск PIT більше не зменшують оцінку.
- Ручна зміна файлу налаштувань застосовується, щойно його збережено, як VS Code застосовує зміну налаштувань.
Coverage Studio для VS Code 1.2026.7 — які тести виконали рядок, покриття після кожного збереження і базовий звіт CI
2026-09-29
Додано
- Які тести виконали цей рядок. Там, де звіт це записує, — coverage.py з
--show-contexts, відстежувані методи OpenCover, трасувальний файл lcov, записаний для кожного тесту, — CodeLens функції каже, скільки тестів її виконали, а Show Tests That Ran This Line перелічує їх, найактивніші першими, і відкриває той, який ви оберете. Для запуску dotnet test параметр testRun.perTest запускає тести по одному класу, тож кожен звіт каже, який клас його записав.
- Покриття після кожного збереження. З
testRun.onSave збереження вихідного файлу запускає тести, що його покривають, з покриттям, і поле за цим стежить. У рішенні .NET запускаються лише тестові проєкти, які посилаються на проєкт збереженого файлу; кілька збережень поспіль — один запуск.
- Run This Test with Coverage. Коли курсор стоїть у тестовому методі, тестовому класі чи
describe або в тестовому файлі, одна команда запускає з покриттям саме це — dotnet test --filter, jest/vitest -t або ідентифікатор вузла pytest — і завантажує те, що він записав. Тест зчитується з тексту, тож це працює для C#, VB, F#, JavaScript, TypeScript і Python без мовної служби.
- Exclude from Coverage і два фільтри .NET. Клацання правою кнопкою на рядку дерева покриття або Exclude This File from Coverage для відкритого файлу додає файл чи теку до
fuciniCoverage.ignore, і він зникає з усіх підсумків. ignore.namespaces виключає файли простору імен (*.Migrations), а ignore.attributes — клас, метод чи властивість під атрибутом; типово це ExcludeFromCodeCoverage, який OpenCover, dotCover і конвертований lcov не враховують.
- Exclude Selection from Coverage. Виділіть рядки й оберіть дію в лампочці або в контекстному меню редактора: над класом, методом чи властивістю .NET вона пише
[ExcludeFromCodeCoverage] — у короткій формі, якщо файл уже імпортує System.Diagnostics.CodeAnalysis, — а деінде LCOV_EXCL_LINE або пару LCOV_EXCL_START/STOP у коментарі самої мови. Позначку, яка вже є, не дублює.
- Простори імен, класи й методи. Для звіту .NET, що називає свої класи, — Cobertura, Coverlet, OpenCover — список Folders / Namespaces показує той самий запуск за просторами імен, класами й методами, з тим самим сортуванням і фільтром; рядок методу відкриває файл на цьому методі. Типи, згенеровані компілятором, як-от
<>c і асинхронні автомати станів, згортаються в клас, для якого їх згенеровано.
- Поле пошуку над деревом покриття. Введіть слова, щоб лишилися рядки, чия назва або шлях містить їх усі, або порівняння —
< 80%, lines >= 90, branches = 0, — щоб лишилися рядки, чиє число його проходить; разом — обидві умови. Рядки методів і ризикові гарячі точки теж шукаються; Escape очищує.
- Сеанси покриття і тренд. Start Coverage Session — і кожен запуск, завантажений відтоді, додається до попередніх — рядки, гілки й функції однаково: те, що виконав будь-який із них, покрите, — тож модульні тести, інтеграційні тести й прохід застосунком показують, чого вони досягли разом. Під панеллю інструментів покриття рядків зі збереженої історії показано як тренд, одна точка на запуск.
- Compare with CI Baseline.
baseline.report називає звіт, який публікує збірка вашої основної гілки, — URL-адресу, що отримується з remote.headers, або завантажений файл, — і кожне завантаження порівнюється з ним: картка рядка стану каже, де стоїть цей запуск, а Compare with CI Baseline перелічує файли, що змінилися. Базовий звіт проходить той самий список виключень, що й запуск, тож підсумки порівнюються чесно.
Виправлено
- Звіт тестового запуску більше не містить імені користувача й машини. Збирач Microsoft Code Coverage називає свій звіт
<user>_<machine>_<stamp>.cobertura.xml, і ця назва стояла в дереві й на кожному його знімку екрана; тепер звіт перейменовується на coverage.cobertura.xml перед завантаженням.
- Тестовий запуск падав у Windows, коли термінал — PowerShell. Лапки навколо
Code Coverage;Format=cobertura губилися дорогою до pwsh, який читав ; як кінець команди; тепер рецепт передається терміналу слово за словом і береться в лапки для тієї оболонки, яку він запускає.
- Про згенерований файл казали, що його виключив
fuciniCoverage.ignore. Кожен виключений файл тепер рахується під параметром, який його виключив, — ignore, ignore.generated або ignore.namespaces, — тож показана назва і є тією, яку треба змінити.
- Заголовок із макросами більше не стоїть у дереві на 100%. llvm-cov і gcov приписують використання макросу рядкам, що його визначають; гілки й функції на виключених рядках тепер ідуть разом із рядками, а файл, у якому не лишилося нічого вимірюваного, вилучається із запуску й називається у виводі (
FUCINI_EXCLUDE_001).
- П'ять звітів, відхилених як непідтримуваний формат, тепер розпізнаються. JaCoCo XML від Kover, звіт Stryker.NET, звіт NCover, застарілий resultset SimpleCov і звіт SonarQube з багатьма порожніми файлами тепер впізнаються за тим, що вони містять на початку. Звіт Clover або SonarQube, у шляхах якого трапляється слово
cobertura, більше не читається як Cobertura.
- Числа, що збігаються з інструментами, які їх записали. Показник гілок збірки MC/DC збігається з
llvm-cov report; винятки-гілки LCOV 2 (BRDA:12,e0,1,3) рахуються; функція llvm-cov оголошується лише у файлі, який її визначає; блок Go, перелічений двома тестовими бінарниками, додає свої лічильники; рішення Cobertura, про яке звітують два класи, і рядок JaCoCo, перелічений двічі, зберігають усі свої гілки — один раз.
- Дрібніші. Трасувальний файл, обірваний посеред запису, більше не втрачає файл;
gcov -t над кількома файлами .gcda дає по файлу на кожен, екземпляри шаблонів читаються один раз, а лічильники на кшталт 1.20k з gcov -H зберігаються; файли GNATcoverage більше не всі позначаються як змінені після свого покриття; мутант Stryker у стані очікування чи перерваний запуск PIT більше не зменшують оцінку.
Змінено
- Більше жодного
FUCINI_ENCODING_001 при кожному завантаженні. Звіт без позначки порядку байтів читається як UTF-8, як його пише кожен інструмент, без примітки про це.
Coverage Studio для Visual Studio 1.2026.5 — спостереження там, де з'явиться звіт
2026-09-28
Додано
- Відносний запис із підстановкою шукається на будь-якій глибині.
*.lcov.info у coverageFile.paths знаходить файл, де б він не був під базовою текою, — так, як VS Code читав його завжди; абсолютний запис — ${workspaceFolder}/build/coverage-merged/*.lcov.info, ** для будь-якої глибини — шукає саме там, де сказано, як і раніше.
- Спостереження там, де з'явиться звіт. Спостерігач охоплює теки, які називають налаштування, незалежно від того, чи вже є там звіт: теку файлу з абсолютним шляхом, теки перед підстановкою — з усім, що під ними, коли шаблон сягає підтек, — і базову теку для відносної підстановки. Звіт, який збірка туди записує, завантажується сам; запис у будь-який інший файл у цих теках ігнорується.
Виправлено
- Звіт llvm-cov у форматі JSON відхилявся як непідтримуваний формат. Формат розпізнається за першими 4096 символами, а llvm-cov пише свою позначку
"type": "llvm.coverage.json.export" у самому кінці; в експорті, перший файловий запис якого містить багато гілок і вкладених розгортань макросів, у цій голові не було нічого іншого впізнаваного. Такий звіт тепер упізнається за початком, {"data":[{"files":[, якого немає в жодному іншому форматі.
- Те саме для
gcov --json-format. gcov пише функції файлу перед його рядками, і у файлі з десятком функцій у перевіреній голові теж немає жодного запису рядка; тепер його визначає власний ключ документа gcc_version.
Coverage Studio для VS Code 1.2026.6 — підстановка в повному шляху, спостереження там, де з'явиться звіт
2026-09-28
Додано
- Підстановка в абсолютному записі
coverageFile.paths. ${workspaceFolder}/build/coverage-merged/*.lcov.info завантажує кожен такий файл у цій теці, а ** означає будь-яку глибину: пошук іде в теках перед першою підстановкою, решта — шаблон під ними, так, як редакція для Visual Studio завжди читала такий запис. Раніше абсолютний запис шукали так, як записано, тож запис із зірочкою не збігався ні з чим — і, будучи підстановкою, ніколи не повідомлявся як такий, що нічого не знайшов. Звіт, який з'являється там пізніше, завантажує спостерігач або опитування, як і літеральний запис; підстановка, що нічого не знаходить, не повідомляється, бо може чекати на збірку.
Виправлено
- Звіт llvm-cov у форматі JSON відхилявся як непідтримуваний формат. Формат розпізнається за першими 4096 символами, а llvm-cov пише свою позначку
"type": "llvm.coverage.json.export" у самому кінці; в експорті, перший файловий запис якого містить багато гілок і вкладених розгортань макросів, у цій голові не було нічого іншого впізнаваного. Такий звіт тепер упізнається за початком, {"data":[{"files":[, якого немає в жодному іншому форматі.
- Те саме для
gcov --json-format. gcov пише функції файлу перед його рядками, і у файлі з десятком функцій у перевіреній голові теж немає жодного запису рядка; тепер його визначає власний ключ документа gcc_version.
Coverage Studio для Visual Studio 1.2026.4 — два звіти, одна відповідь і зелений там, де покрито
2026-09-26
Додано
- Вибір або поєднання звітів файлу. Клацніть правою кнопкою файл у вікні Coverage і виберіть Choose Coverage Source... — пункт є там, де файл вимірює більше ніж один завантажений звіт, — або скористайтеся Tools > Coverage Studio > Choose Coverage Source for This File...: кожен звіт із власними числами, а далі Combine them — agree (покрито лише там, де рядок виконав кожен звіт: одна кодова база, два компілятори) і — union (покрито там, де це зробив будь-який: кілька наборів тестів однієї збірки), для файлу, його теки чи шаблону. Рядки, щодо яких звіти розходяться, бірюзові на полі та в Annotated Source, із тим, що сказав кожен звіт; рядок у вікні називає звіти й кількість спірних рядків, а рядок стану й обидві картки кажуть, звідки беруться числа.
- Червоний, бурштиновий і зелений. Gutter: Coverage фарбує кожен покритий рядок зеленим поруч із червоним і бурштиновим — режим для кожного, хто чекав, що файл на 100 % буде зеленим. П'ять відтінків теплової карти — це налаштування (
heatmap.colors, heatmap.colorsDark), і вікно налаштувань показує попередній перегляд кожного кольору, поки його вибирають.
Виправлено
- Число файлу в рядку стану — те саме, що в його картці. Метрика, у якій нічого немає, — MC/DC у файлі без рішень — рахувалася як 100 % в елементі й не рахувалася зовсім у картці, яку він відкриває.
- Заголовок із самих констант більше не показує 0 % чи 100 %. Директиви препроцесора, як і коментарі, вважаються відсутністю коду, коли ввімкнено
excludeComments.
Coverage Studio для VS Code 1.2026.5 — два звіти, одна відповідь і зелений там, де покрито
2026-09-26
Додано
- Вибір або поєднання звітів файлу.
coverageFile.sources вирішує для кожного файлу, який із кількох завантажених звітів говорить за нього, — або поєднує їх: agree вважає рядок покритим лише там, де його виконав кожен звіт, і позначає бірюзовим рядки, щодо яких вони розходяться; union — там, де це зробив будь-який. Choose Coverage Source... на рядку подання Coverage або для відкритого файлу пише правило за вас. Входить до платних планів; у Community вирішує найновіший звіт.
- Червоний, бурштиновий і зелений, і режим поля одним клацанням. Режим
coverage фарбує покриті рядки зеленим; відтінки теплової карти — це налаштування з живим попереднім переглядом на панелі налаштувань; кнопка в рядку стану та Alt+G перемикають поле між «вимкнено», «непокриті», «покриття» і «теплова карта».
Виправлено
- Число файлу в рядку стану — те саме, що в його картці. Метрика, у якій нічого немає, — MC/DC у файлі без рішень — рахувалася як 100 % в елементі й не рахувалася зовсім у картці, яку він відкриває.
- Заголовок із самих констант більше не показує 0 % чи 100 %. Директиви препроцесора, як і коментарі, вважаються відсутністю коду, коли ввімкнено
excludeComments.
Coverage Studio для Visual Studio 1.2026.3 — нічого обирати, крім коду
2026-09-24
Змінено
- Діалог Licence запитує лише код. Чотирьох кнопок планів більше немає: код підписки або запрошення називає пул, а пул знає свій план, тож людина не могла відповісти нічого кращого за сам код — а запрошення Business, вставлене з іще вибраним Pro, відхилялося як призначене не для того плану. Вставте код і натисніть Activate.
Coverage Studio для VS Code 1.2026.4 — нічого обирати, крім коду
2026-09-24
Змінено
- Enter Subscription Code запитує лише код. Запитання про план зникло: код називає пул, а пул знає свій план, тож далі сервер бере все на себе й більше не відхиляє код як призначений не для того плану. Посилання в один клік у листах не змінилися; у листах активації більше немає кроку «оберіть свій план», і той самий код активує Coverage Studio для Visual Studio без потреби у VS Code.
Coverage Studio для Visual Studio 1.2026.2 — кожен запуск тестів, кожен звіт і що змінилося
2026-09-24
Додано
- Покриття після кожного запуску тестів. Collect Coverage in Test Explorer… кладе поруч із рішенням один
.runsettings зі збирачем Cobertura від Microsoft — підхоплюється сам, коли Tools → Options → Test → Auto detect runsettings files увімкнено, або вибирається один раз у Test → Configure Run Settings; відтоді кожен запуск у Test Explorer пише звіт під тестовим проєктом, і він завантажується щойно з'являється, злитий з усім, що називають налаштування. Ніщо не чіпляється до Test Explorer, тож Visual Studio 2026 і Microsoft.Testing.Platform працюють як є. Run Tests with Coverage розпізнає dotnet test, vitest, jest, pytest, go, cargo, maven, gradle, phpunit і ctest, запускає їх з увімкненим покриттям у вікні Output і завантажує те, що вони записали; тестовий проєкт без coverlet.collector запускається зі збирачем, що постачається з тестовим SDK.
- Від останнього запуску. Кожне завантаження порівнюється з попереднім: трикутник на полі біля кожного рядка, що почав або перестав виконуватися, тренд поруч з оцінкою і Compare with Last Run для файлів, чиї числа змінилися.
history.enabled зберігає запуски між перезапусками; gitDiff.enabled звужує запуск до рядків, які змінила ваша гілка.
- Пороги та Error List. Check Coverage Thresholds оцінює запуск за
threshold.*; з compliance.diagnostics, problems.enabled, problems.perLine або deadCode.enabled знахідки стоять в Error List поруч із знахідками самого компілятора, і кожна відкриває свій файл.
- Звіти, експорти та значок. Show Annotated Source відкриває активний файл як сторінку в області документів — кожен рядок у своєму кольорі, знахідки поруч — прокручувану разом із редактором в обидва боки. Open HTML Report і Generate Full HTML Report пишуть запуск до
htmlReport.outputDir і відкривають браузер. Export Coverage Report… пише CSV на файл або на функцію, Markdown, LCOV, Cobertura, SARIF, значок SVG або Fucini JSON. Generate Coverage Badge тримає значок у репозиторії, після кожного завантаження з badge.autoUpdate.
- Risk hotspots і фільтри рядків у вікні Coverage, як у VS Code: функції, де складний код зустрічається з малим покриттям, найгірші першими; і випадний список поруч із сортуванням для всіх файлів, файлів з прогалинами, непротестованих файлів або файлів, змінених від останнього запуску.
- Файл налаштувань у корені рішення.
fucini-coverage.json поруч із рішенням читається після .vscode/settings.json, і вікно налаштувань записує його, коли саме він є файлом, що існує — для команди, яка воліла б не тримати теку .vscode. Обидві редакції його читають.
- .NET без церемоній.
ignore.generated залишає файли дизайнера, згенеровані файли, obj\ і міграції поза кожним підсумком; testRun.skipWhenTestsFail залишає на екрані останнє добре покриття, коли запуск завершується червоним.
Ще не в цій редакції
- Панель Test Coverage — це API VS Code, а Solution Explorer не може показувати позначки. Compare Two History Runs з'явиться, коли про нього попросять передплатники.
Coverage Studio for VS Code 1.2026.3 — гарячі точки, фільтри та .NET без пакета
2026-09-24
Додано
- Які файли показувати. Другий випадний список на панелі інструментів подання Coverage, поруч із сортуванням: усі файли, файли з прогалинами, непротестовані файли або файли, чиї числа змінилися від попереднього запуску. Теки йдуть за своїми файлами і зберігають власні числа. У кожному плані.
- Risk hotspots. Під деревом: функції, де складний код зустрічається з малим покриттям, найгірші першими, і кожна відкриває свій файл на цій функції. Функція потрапляє туди за оцінкою CRAP —
hotspots.crapThreshold, за замовчуванням 30, число, яке запропонували автори метрики — або лише за цикломатичною складністю, hotspots.complexityThreshold, за замовчуванням вимкнено. Community бачить кількість і найгіршу оцінку; ранжований список — у Pro.
dotnet test без пакета. Run Tests with Coverage спершу читає файли проєктів: де жоден не посилається на Coverlet, запуск використовує власний збирач Microsoft — --collect:"Code Coverage;Format=cobertura" — що постачається з Microsoft.NET.Test.Sdk, і його звіт завантажується як звіт Coverlet.
- Згенеровані файли .NET залишаються поза підсумками.
ignore.generated, увімкнений за замовчуванням, вилучає *.Designer.cs, *.g.cs, *.generated.cs, *.razor.g.cs, AssemblyInfo, глобальні using-и, усе під Migrations/ і під obj/ з кожного підсумку, сторінки та експорту. Файл дизайнера, який ніхто не тестує, більше не коштує рішенню його порога.
- Невдалий запуск зберігає останнє добре покриття. З
testRun.skipWhenTestsFail запуск, що завершується невдалим тестом, залишає покриття на екрані як було і повідомляє про це в панелі Output. За замовчуванням вимкнено.
Змінено
- Запуск із Test Explorer знаходиться сам. Без жодних налаштувань відомі імена тепер включають теку
TestResults/<run>/ кожного тестового проєкту, а не лише теку самої робочої області, та <user>_<machine>_<date>.cobertura.xml збирача Microsoft поруч із файлом Coverlet. Рішення .NET, тести якого запускали у Visual Studio, показує своє покриття при першому відкритті; кожна тека запуску завантажується, а злиття зберігає для кожного файлу слово найновішого запуску.
Coverage Studio для Visual Studio 1.2026.1 — те саме покриття в іншій IDE
2026-09-23
Додано
- Друге розширення, для Visual Studio 2022 і 2026 — Community, Professional та Enterprise. Той самий читач, що в редакції для VS Code, тож той самий звіт дає ті самі числа, до цифри, в обох редакторах; і ті самі налаштування
fuciniCoverage.*, що читаються з .vscode/settings.json та з власних користувацьких налаштувань VS Code, якщо він є на машині. Воно не використовує власного покриття коду Visual Studio: у Visual Studio 2022 це функція Enterprise, а в Community та Professional це єдине покриття, яке IDE покаже. - У редакторі: смужка на полі для кожного рядка — червона ніколи не виконувався, бурштинова частково, теплова карта за кількістю відвідувань — вбудовані лічильники, рядок над кожною функцією з її покриттям, складністю, оцінкою CRAP і MC/DC, смуги на смузі прокрутки, підказка, яка каже, яку гілку не пройдено, і крапка на рядку, який ви змінили після звіту.
- Вікно Coverage (View → Other Windows → Coverage): кожен файл з його метриками й один бал над усіма, з сортуванням, з невиміряними файлами нижче; елементи рядка стану
Coverage і File, кожен відкриває повну картку. - Команди у Tools → Coverage Studio, з двоклавішними акордами після
Ctrl+Shift+U: N/P — наступний і попередній непокритий рядок, B — наступне частково протестоване рішення, R — перезавантажити. Режим спостереження перезавантажує, коли файл, який пише ваша збірка, змінюється. - Getting Started, шість кроків із кнопкою для кожного, 18 мовами; відкривається сам першого разу.
- Налаштування через шестірню на панелі інструментів вікна Coverage, що записує користувацькі налаштування цієї редакції або
.vscode/settings.json теки і зберігає коментарі файлу, який редагує. - Ліцензія: входить у кожен платний план. Машині, де активовано Coverage Studio для VS Code, нічого більше не потрібно — ключ знаходиться сам; будь-де інде Tools → Coverage Studio → Licence… приймає код передплати з вашого листа активації. Без передплати покриття не читається: у Visual Studio безкоштовного рівня немає.
Ще не в цій редакції
- Run Tests with Coverage і панель Test Coverage — це API VS Code; Solution Explorer не може показувати позначки. Анотований перегляд вихідного коду, HTML-звіт та експорти, Check Thresholds, записи в Error List, історія і тренд та diff-покриття прийдуть у тому порядку, в якому їх проситимуть передплатники.
Coverage Studio for VS Code 1.2026.2 — Початок роботи, і два редактори на одну передплату
2026-09-23
Додано
- Покроковий посібник. Get started with Coverage Studio — у Help → Welcome → Walkthroughs, і відкривається сам після встановлення — веде нового користувача від звіту покриття до рядків, які ніхто не тестує, за шість кроків, кожен із кнопкою для команди, про яку він. Усіма вісімнадцятьма мовами.
- Ідентифікатор інсталяції залишається там, де його читає Coverage Studio для Visual Studio. Редакція для Visual Studio перевіряє ключ у
license.key за тим самим відбитком і не може читати сховище стану цього розширення; тепер при кожній активації ідентифікатор записується також поруч із глобальним сховищем розширення, тож машині, активованій у VS Code, не потрібна друга активація у Visual Studio. Випадковий UUID, ні до чого не прив'язаний, нікуди не надсилається.
Змінено
- Повернення припиняє передплату. Схвалене повернення або чарджбек тепер негайно скасовує передплату, і її код активації більше не видає ключів; повернення — одне на клієнта. Ключі, що вже є на машині, працюють до власного закінчення, як і раніше. Політика повернень каже, що саме відбувається.
Coverage Studio for VS Code 1.2026.1 — Імена файлів, які завжди можна прочитати
2026-09-21
Виправлено
- Імена файлів у поданні Coverage читаються за будь-якої ширини. Імʼя було єдиною частиною рядка, що стискалася — до семи символів у звичайній бічній панелі. Тепер воно малюється повністю, а стовпці метрик, оцінка і смуга заходять під нього зліва, розчиняючись на зрізі, щоб половина числа ніколи не читалась як ціле. Кожне значення, як і раніше, є у підказці рядка.
- Позначка «файл змінено» встигає за файлом. Після завантаження вона йшла за першою правкою і першим відновленням, а далі ніщо її не зрушувало до наступного завантаження. Тепер доходить кожне збереження і кожна зміна на диску.
- Панель інструментів подання Coverage більше не розриває підписи своїх кнопок. У вузькій бічній панелі вона тепер переноситься між елементами керування, а поле сортування переходить в окремий рядок.
- Значок покриття безкоштовний і у вікні вибору експорту. Generate Coverage Badge завжди записував SVG-значок на будь-якому рівні, тоді як Export Coverage Report… відмовляв у тому самому файлі на Community. Тепер його записують обидва.
- Show Worst-Covered Folders ліцензується так само, як два інші списки. Нічого не змінюється на Community, де всі три безкоштовні й не рахуються, і для жодного вже виданого ключа.
Додано
- Мінімальна підтримувана версія. Розширення тепер приблизно раз на тиждень читає невелику підписану політику з нашого сервера ліцензій. Коли збірка старша за найстарішу ще підтримувану версію, пробний період і безкоштовний рівень зупиняються та просять оновитися; платній ліцензії повідомляється дата, і спершу вона продовжує працювати протягом пільгового періоду. Читання не надсилає нічого про вас чи вашу інсталяцію, а інсталяція, яка не може звʼязатися із сервером, ніколи не зупиняється з цієї причини. Зараз мінімум не задано.
Змінено
- Починаючи з цього випуску ліцензія пропрієтарна. Розширення публікувалося на умовах MIT, що ніколи не відповідало продукту, який продається за підпискою. Опубліковану збірку можна встановлювати і використовувати в межах вашого плану, зокрема комерційно; її не можна копіювати, змінювати, розповсюджувати чи піддавати зворотній розробці. Те, що вона створює з ваших даних — звіти, експорти, значки, — належить вам, а колишню умову про зазначення авторства знято. Копія ранішого випуску лишається на тих умовах, з якими вона надійшла.
- Кнопка дій зі шляхом (⋯) не займає місця, доки ви не наведете вказівник на рядок. 25 пікселів, які вона тримала зарезервованими в кожному рядку, тепер дістаються імені файлу; під час наведення вона зʼявляється одразу після імені, і в рядку ніщо не зсувається.
Coverage Studio for VS Code 1.2026.0 — Умови, мутанти й тести за рядком
2026-09-20
Виправлено
- Трасувальні файли LCOV 2 перелічують кожну функцію один раз.
FN:<рядок>,<кінцевий рядок>,<ім’я> читається так, як його пише lcov 2.0 — раніше кожна функція з’являлася двічі: як ніколи не викликана і як така, що на рядку 0, — а разом із ним читаються й пари FNL:/FNA: з lcov 2.2.
- Шаблон C++ більше не позначається як ніколи не виконаний через те, що одне інстанціювання ним не було, а функція, повна макросів, знову є однією функцією, а не однією на макрос.
- Тексти згоди кажуть те, що установка справді надсилає: жодної щомісячної сторінки вашого коду, а зведення використання несе код запиту, за яким видано ваш ключ.
Додано
- Покриття умов — окрема метрика.
a && b це одне рішення і дві умови, і набір тестів може пройти обидві гілки, жодного разу не побачивши b хибним. Тепер у нього власний рядок, стовпець, експорт, значок, вага в оцінці (3, між гілками і MC/DC) та поріг — читається з BullseyeCoverage, експорту cond у TRACE32 і -fcondition-coverage у GCC 14.
- Мутанти там, де вони є. Звіти PIT і Stryker читаються мутант за мутантом: ті, що вижили, позначаються на власному рядку в редакторі, зі зміною й тестами, що його виконували, у підказці, і перелічуються у HTML-звіті та в анотованому коді.
- Які тести виконали цей рядок. coverage.py із
--show-contexts і OpenCover із -coverbytest кажуть, які тести дісталися рядка; підказка з кількістю влучань називає їх.
- Частина виконаного рядка, яка ніколи не виконувалась, підсвічується в редакторі, а функції C і C++ отримують складність і оцінку CRAP, пораховані з даних про гілки, які llvm-cov уже містить.
- Проєкти JaCoCo, Cobertura і Coverlet завантажуються з першого відкриття, без жодного налаштування — зокрема там, куди типово пишуть Maven, Gradle і
dotnet test.
- Кожна метрика поряд із кожним файлом, за будь-якої ширини, упорядкована за вагою у вашій оцінці, і те, що не вміщується, прокручується, а не зникає — а значок Coverage показує лічильник, коли трасувальний файл перезавантажився, поки ви дивилися в інше місце.
- Канал попередніх збірок, до якого можна долучитися добровільно, і одна кнопка в заголовку редактора, що вимикає розфарбовування покриття і повертає рівно те, що було.
Змінено
- Bullseye і TRACE32: покриття гілок більше не включає умови. Рішення тепер є покриттям гілок, а умови — покриттям умов, тож показник гілок такого проєкту змінюється, а з ним і складена оцінка. Поставте
whmWeights.conditions на 0, щоб отримати колишню оцінку.
- Безкоштовний рівень Community має тижневу норму: по п’ять на тиждень для кожної з облікованих дій, де було двадцять на день, а на межі пропонується передплата або 7-денний пропуск. Установка, що вже в роботі, зберігає старі ліміти 30 днів і отримує одне повідомлення з датою.
- Пробний період і безкоштовний рівень ведуть журнал використання з ліцензійним сервером: хеш ідентифікатора машини VS Code, видання, день початку оцінювання та лічильники облікованих дій — і нічого більше; ніколи на платній ліцензії і ніколи з очікуванням. Обмін на телеметрію тепер одноразові 30 днів.
- Щомісячної сторінки з кодом більше немає — вона не збирається, не зберігається і не надсилається нікому, а залишена попередньою збіркою видаляється під час першого запуску цієї.
0.2026.82 — Пороги, що пасують вашому проєкту, і все, що містять ваші звіти
2026-09-17
Виправлено
- Теплова карта на темній темі читається в правильному напрямку. Її градієнт ішов від блідо-жовтого до темно-коричневого, тож найгарячіший цикл мав найтьмянішу смужку. Темна тема тепер має власний градієнт — від приглушеного оливкового до яскравого помаранчевого.
- Підказка MC/DC знову показує свої подробиці, а рішення з llvm-cov правильно рахує свої умови. Поточна версія VS Code згортала підказку в один рядок; а
(a && b) || c подавалося з однією умовою на 100 % під заголовком, який слушно вказував 2 із 3 пар. - Функції C++ називаються так, як ви їх написали:
clamp_to<int> і gearbox::next_gear замість імені від компонувальника ??$clamp_to@H@@YAHHHH@Z, для llvm-cov, lcov і gcov. - Кількість рядків Istanbul збігається з nyc, XML від
dotnet-coverage читається, рядки SimpleCov :nocov: виключаються, а не вважаються пошкодженими, а звіт, який містить лише зведення, зберігає свої цифри, у якому б порядку звіти не читалися. - Робочі області з кількома коренями: HTML-звіт більше не називає теку двічі, подання Coverage ставить над текою робочої області її назву, а правило
pathRemap може містити ${workspaceFolder} так само, як і ${workspaceRoot}.
Додано
- Показано все, що містить звіт. Виклики функцій, об’єктний код і мутаційний показник отримують стовпець у поданні Coverage, в HTML-звіті та в експортах CSV і Markdown, рядок у картках рядка стану і значок в анотованому вихідному коді — а метрику, якої звіт не містить, пропущено, а не виведено як нуль.
- Складність і CRAP. Якщо звіт містить цикломатичну складність (OpenCover, JaCoCo, Clover, Cobertura), кожна функція отримує показник CRAP у своєму CodeLens, файл отримує Max CRAP, що веде до методу, а HTML-звіт перелічує Riskiest Methods.
- Більше з кожного формату: іменовані плечі гілок, виключені рядки, діапазони стовпців у межах рядка, інструмент, версія і дата звіту, а також попередження, які інструмент у нього записав.
- Необов’язкові ваги для об’єктного коду та мутаційного показника в композитному показнику, обидві
0, доки ви їх не задасте.
Змінено
- Типові пороги більше не дорівнюють 100 %. Поріг, якого ви не задали, тепер означає 80 для рядків, 80 для функцій, 75 для регіонів, 70 для гілок і 75 для композитного показника, без запобіжника для MC/DC, інстанціацій, викликів функцій чи об’єктного коду — те, чого можна вимагати від звичайного проєкту.
fuciniCoverage.threshold.profile: "safety" повертає кожен запобіжник на рівень 100, точно як раніше, а поріг, який ви задали самі, має перевагу над будь-яким профілем. Якщо ви покладалися на старі типові значення, вас оцінюють поблажливіше, доки ви не виберете safety; інсталяція, яка працювала раніше, отримує про це одноразове повідомлення з кнопкою, яка його встановлює. - Метрика без запобіжника показує нейтральне тире в картках замість позначки чи хрестика, а панель параметрів показує попередній перегляд вердикту за запобіжниками, які справді діють.
0.2026.81 — Точні відсотки й звіт, який можна надіслати
2026-09-16
Виправлено
- Покриття в буфері з незбереженими змінами знову збігається. Прогін, завантажений, поки файл мав незбережені правки, зсував кожну позначку, підказку й CodeLens на стільки рядків, на скільки ці правки їх посунули. Правки тепер відновлюються з файлу на диску, а цілий рядок, вставлений над рядком, більше не вважає той рядок відредагованим.
- Злиття й повторювані записи LCOV додаються. Новіший файл трасування більше не зберігає зведення гілок і MC/DC старішого прогону, а файл, вказаний двічі в одному файлі трасування, об’єднується так, як його об’єднує genhtml.
- Ліцензійний ключ залишається на своїй машині. Settings Sync більше не переносить його на інші встановлення, де він блокував покриття; прострочений ключ Business, Enterprise або Pro Plus поновлюється сам до 45 днів після закінчення.
- Віддалені файли трасування отримуються обережніше.
remote.headers залишаються на своєму походженні через переспрямування, отримання здається через 30 секунд, сторінка входу відхиляється замість кешування, а вікно, відкрите офлайн, завантажує останню завантажену копію. Самооновлення встановлює лише власне видання. - Парсери: лічильники рядків llvm-cov збігаються з
llvm-cov show, рішення OpenCover з різних методів більше не перезаписують одне одного, xccov, TRACE32 і EMMA зберігають свої показники рядків, класи Cobertura, що ділять файл, є одним файлом, зведені звіти JaCoCo читаються, а зіставлення шляхів розв’язує .. і порівнює цілі сегменти. - У редакторі: історія ведеться для кожної робочої області, позначки залишаються на справжніх файлах, а не на панелі HEAD редактора порівняння, рядки за кінцем файлу не малюються, значки Провідника у Windows працюють для шляхів
C:\…, а великі прогони швидше шукаються.
Додано
- Надіслати діагностичний звіт. Його пропонують сповіщення про невдале завантаження, віддалене отримання, злиття, порівняння історії або чат. Він показує саме той JSON, який було б надіслано, з необов’язковим 4-КБ зразком файлу, коментарем і адресою для відповіді, і нічого не надсилає, доки ви не натиснете Надіслати.
- Звіти про помилки. Помилка
FUCINI_* повідомляється без вмісту файлів, шляхів чи імен, коли рівень телеметрії VS Code — all або error. Три рядки журналу отримали власні коди: FUCINI_REMOTE_002, FUCINI_REMOTE_003 і FUCINI_GITDIFF_002, кожен описано в посібнику користувача.
Змінено
- Кожен відсоток покриття має два десяткові знаки, відсічені, а не округлені:
87.43%, а 100.00% лише коли покриття рівно 100. - Пороги вирішують за точним значенням. Досі кожен відсоток спершу округлювався до цілого, тож 89,6 % проходив поріг 90 %. Проєкт, який проходив лише завдяки округленню, тепер показуватиме NON-COMPLIANT, доки його покриття справді не досягне порога.
- Телеметрія щоденна. Кожне встановлення щодня надсилає невелике ліцензійне повідомлення на рівні телеметрії VS Code
all; з увімкненим telemetry.enabled зведення використання надсилається щодня замість щомісяця. Встановлення, що розблокували функції за телеметрію, запитують, перш ніж їхні умови зміняться.
0.2026.80 — Оновлення, яке видно
2026-09-14
Додано
- Подання Coverage повідомляє про нове оновлення — і не забуває про нього. Смужка над банером ліцензії показує нову версію поруч із вашою та ті самі три кнопки, що й сповіщення про оновлення: «Завантажити & встановити», «Список змін» і «Пропустити цю версію». Значок подання на панелі дій також отримує позначку, тож її видно й тоді, коли подання закрите. Сповіщення з’являлося лише один раз, під час автоматичної перевірки, і клацання будь-де ще приховувало його до наступної перевірки через день; смужка лишається, доки оновлення не встановлено, не пропущено або не вимкнено
fuciniCoverage.update.checkForUpdates, і не зникає після перезавантаження вікна.
0.2026.79 — Один пінг на день
2026-09-14
Змінено
- Невеликі пінги надсилаються не частіше ніж раз на день, разом. Оновлення, зміна ліцензії, новий формат покриття та файл, який не вдалося прочитати, раніше були окремими пінгами, що надсилалися одразу, щойно їх помічали, — а на деяких установках їх помічали знову в кожному сеансі: відкликане місце повідомляло про відкликання під час кожного запуску, а перемикання між робочими областями з різними форматами щоразу повідомляло про «новий» набір. Тепер вони збираються й надсилаються одним пінгом, не частіше ніж раз на день. День, коли повідомляти нічого, нічого не надсилає.
- Повідомляється лише те, що справді змінилося. Ліцензія, яка протягом дня змінилася й повернулася назад, ні про що не повідомляє, а формати — це всі формати, які установка будь-коли завантажувала, а не лише формати останньої робочої області. Пінг установки й повідомлення про видалення, як і раніше, надсилаються одразу, і нічого нового не збирається.
- Власний перемикач телеметрії VS Code тепер стосується й невеликих пінгів. Якщо
telemetry.telemetryLevel має значення off, для щоденного пінгу нічого не збирається й нічого не надсилається; досі його враховували лише щомісячне зведення та повідомлення про видалення. Одноразовий пінг установки не змінився.
- Місяць, що завершився, поки редактор простоював, усе одно надсилається. Щомісячне зведення перевірялося лише після завантаження покриття, тож установка, якою перестали користуватися, так і не надсилала свій останній місяць. Тепер воно також перевіряється щогодини, поки VS Code відкрито, — як і раніше, лише з увімкненою телеметрією й не частіше ніж раз на 30 днів.
Виправлено
- Пінг, який сервер відхилив, більше не вважається надісланим. Будь-яка відповідь сервера, зокрема помилка, сприймалася як доставка, тож відхилений щоденний пінг втрачав зібране, а відхилений пінг установки не надсилався повторно. Тепер враховується лише успішна відповідь; відхилений щоденний пінг або щомісячне зведення зберігається й надсилається знову через день.
0.2026.78 — Нові чотирнадцять днів
2026-09-13
Змінено
- Кожен період оцінювання одноразово отримує нові 14 днів. Під час першого запуску цього випуску пробний період поновлюється на кожному встановленні Pro без платної ліцензії — байдуже, чи він вичерпався давно, чи ще мав кілька днів у запасі, — і триває 14 днів від того дня. Коли це стається, про це повідомляє коротке сповіщення. Платної ліцензії це не торкається, а видання Community, яке не має пробного періоду, не змінилося.
- Платна ліцензія показує «Активовано», зеленим. Банер ліцензії раніше показував підписникові «Активовано — залишилося днів: 30». Ключ підписки діє до кінця оплаченого періоду й поновлюється разом із ним, тож цей зворотний відлік ніколи б не перестав читатися як пробний період, що ось-ось вичерпається. Тепер заголовок каже просто Активовано, дата стоїть у подробицях як «Діє до», а відлік повертається лише в останній тиждень перед закінченням терміну дії ключа, поруч із уже наявною приміткою про скоре поновлення.
0.2026.77 — Вставте свій код, і це все
2026-09-12
Додано
- «Enter Subscription Code» — і більше нічого не запитують. Виберіть свій план, вставте код із листа про покупку, підтвердьте — і ваш ліцензійний ключ буде видано та застосовано за вас. Досі єдиний шлях із самого редактора вів через анкету для оцінювання — ім’я, електронна пошта, тип облікового запису, компанія, опитування, — а це неправильна форма, щоб ставити її перед тим, хто вже заплатив. Іншим шляхом було посилання
vscode:// у листі, і насторожено ставитися до такого клацання розумно, а не боязко: подібне посилання може запустити будь-яка сторінка, яку ви відкриваєте, і саме тому активація просить підтвердження. Команда є в палітрі команд, а також є кнопкою на банері ліцензії в панелі покриття та в діалозі активації — у кожному стані, бо ліцензія переїжджає між машинами, а купівля посеред пробного періоду — звичайний випадок, а не виняток.
- Спосіб побачити тарифи просто з пробного періоду. Сторінка з цінами була доступна з екранів безкоштовного рівня, але не з діалогу активації чи банера ліцензії — того єдиного місця, куди справді дивиться той, хто бачить «Залишилося 3 дні». Такому читачеві пропонували анкету й підказку про
settings.json — і жодної ціни.
Змінено
- Діалог активації та банер ліцензії більше не починаються з
FCK1. Обидва раніше відкривалися вашим кодом запиту й порадою «вставте ключ у settings.json» — а це шлях для випадку, коли до нашого сервера ліцензій узагалі не дістатися. Показане першим, воно читалося як інструкція: покупця, який тримав код підписки FCB1…, відправляли до «Enter Activation Key» — єдиного поля, яке гарантовано його відкине. Обидва шляхи на місці, нижче за ті, що пасують людині, яка вже купила, і описані як те, чим вони насправді є.
0.2026.76 — Команда, яку назвав лист
2026-09-12
Виправлено
- «Request Activation Key» тепер справді команда. Ваш лист про покупку — і сторінка активації, у кожній мові — кажуть, що якщо посилання на один клац не переживе вашу поштову програму, ви можете виконати Fucini Coverage: Request Activation Key з палітри команд, обрати свій план і вставити свій код. Ця назва належала смузі заголовка панелі та самому посиланню, але ніколи — команді, тож у палітрі під нею не було нічого; а найближчий за назвою відповідник, Enter Activation Key, приймає ключ
FCK1…, який видає наш сервер, а не код FCB1…, який несе ваш лист. Виконання інструкції приводило вас саме до того єдиного поля, яке гарантовано відмовиться від того, що у вас у руках. Тепер це справжня команда.
- Діалог активації пропонує Запросити ліцензію…, поки пробний період або ключ ще діє. Раніше цю кнопку приховували, доки щось із них не спливе, виходячи з міркування, що робочій інсталяції немає потреби звертатися до сервера ліцензій. Але купівля посеред пробного періоду — звичайний випадок, а не виняток, і покупець у такому становищі не мав із діалогу жодного шляху до поля, куди вводиться його код: дві кнопки, що залишалися, просили ключ, який з’являється лише після активації коду.
0.2026.75 — Палітра для людей із дальтонізмом
2026-09-12
Додано
- Палітра для людей із дальтонізмом. Установіть
colorScale.preset на colorblind, і покриття малюватиметься червоно-помаранчевим, помаранчевим і синім (палітра Okabe–Ito) замість червоного, бурштинового й зеленого — і градієнт, і смуги на полях, і підсвічування рядків, і значки в Провіднику, і позначки змін від останнього запуску. Колір, який ви задали самі, має перевагу.
0.2026.74 — Покриття з фільтром за тестом
2026-09-12
Додано
- Фільтр покриття за тестом у власному поданні Test Coverage у VS Code. Коли трасувальний файл називає свої тести — секції
TN: у lcov — кожен тест стає елементом під Fucini Coverage у Test Explorer, кожен файл у поданні Test Coverage перелічує тести, які щось у ньому виконали, а вибір одного показує рядки, яких досяг саме цей тест. ${command:…} у налаштуваннях шляхів. ${command:cmake.buildDirectory}/coverage.info слідує за вибраним набором CMake. Команда виконується перед кожним пошуком, щонайбільше п’ять секунд і лише в довіреній робочій області; команда, що не спрацювала, залишає змінну як є, а вивід пояснює чому.- Швидкий старт за 30 секунд і порівняння з альтернативами тепер відкривають сторінку в Marketplace і головну сторінку.
Виправлено
- Трасувальний файл, що записав файл окремо для кожного тесту, враховував його стільки ж разів. Тепер ці записи додаються разом у межах трасувального файлу, як їх читає genhtml: файл враховується в підсумках один раз, а з кількома завантаженими трасувальними файлами рядки жодного тесту не губляться.
0.2026.73 — Підписані оновлення та ключ, що переживає перехід
2026-09-11
Виправлено
- Ідентифікатор встановлення тепер зберігається до того, як його щось використає. 0.2026.72 збірка 2 припинила обчислювати ідентифікатор заново при кожному виклику, але під час запуску все ще ніхто не чекав, доки його буде записано, тож вікно, закрите одразу після відкриття, усе ще могло його втратити — а разом із ним і відбиток машини, до якого прив’язано ключ активації. Тепер запуск чекає.
- Перехід із Pro на Community більше не робить ключ активації недійсним. Кожна редакція має власне сховище розширення, тому Community починала з новим ідентифікатором встановлення та новим відбитком, тоді як ключ у ваших налаштуваннях — зокрема той, який перехід щойно запросив для безкоштовного розблокування, — був прив’язаний до старого. Тепер перехід передає ідентифікатор далі.
Безпека
- Оновлення з fucini.software підписані й перевіряються перед встановленням. Кожен
.vsix у каналі оновлень містить хеш SHA-256 і підпис Ed25519, створений ключем, якого ніколи немає на вебсервері. Вбудований засіб оновлення та перехід на Community звіряють обидва із завантаженим файлом і відхиляють усе інше — сторінку помилки проксі, обірване завантаження, збережену в кеші старішу збірку чи файл не від нас. Самого HTTPS тут недостатньо: корпоративний проксі з інспекцією TLS заново підписує кожне з’єднання, яке через нього проходить. - Кожен випуск має власне ім’я файлу. Канал оновлень тепер вказує на
.vsix із номером версії замість файлу, який перезаписувався з кожним випуском, тож кеш, що ігнорує Cache-Control, не зможе видати збірку минулого місяця за збірку цього. Посилання на сторінці завантаження не змінилися.
0.2026.72 — Рішення, перевірені лише в один бік
2026-09-10
Додано
- Перехід до рішень, перевірених лише в один бік. Next Partly-Tested Decision і його попередній двійник проходять по розгалуженнях, частину гілок яких було виконано, а частину — ніколи. Це та прогалина, якої навігація по непокритих рядках показати не може: рядок, чий оператор виконався, вважається покритим і лишається покритим, скільки б його гілок не залишилося невиконаними —
if (a && b), досягнутий один раз із хибним a, покритий на 100% за рядками й перевірений наполовину. Одна зупинка на рішення, а не на гілку, бо гілки if/else можуть бути за сторінки одна від одної, а перехід до п’ятої гілки switch каже менше, ніж перехід до самого switch. Рішення, до жодної гілки яких не дійшли, лишаються командам для непокритих рядків, які там і так зупиняються, — а файл, у звіті якого розгалужень немає взагалі, так і каже, замість стверджувати, що кожне рішення перевірено в обидва боки.
Reload Coverage перечитує те, що вже завантажено. З вимкненим стеженням єдиним шляхом до свіжих чисел після повторного запуску тестів було Load Coverage, яке знову виконує пошук і може повернутися з іншим набором, ніж той, що на екрані. Ця команда перечитує саме те, що завантажено зараз, включно з файлами, вибраними вручну, яких пошук більше не знайшов би.
Copy Coverage Summary подає запуск таблицею Markdown. Найгірше покритий файл першим, із підсумковим рядком, готово для вставлення в pull request. Стовпці розгалужень і MC/DC з’являються лише тоді, коли щось у запуску їх виміряло: стовпець із рисок читається як нульове покриття, а не як «не вимірювалося», що є протилежністю правди.
Виправлено
- Ідентифікатор встановлення міг змінюватися між сеансами — а саме з нього будується відбиток ліцензії. Він визначався заново під час кожного звернення й зберігався без очікування запису, тож другий виклик або вікно редактора, закрите невдовзі після запуску, могли створити новий. Ідентифікатор, що змінюється, — це ключ активації, який перестає збігатися; крім того, це завищувало кожен показник, що рахується на встановлення. Тепер він визначається один раз за сеанс і зберігається до того, як щось ним скористається. Збірка 2.
0.2026.71 — Який трасувальний файл покрив цей рядок
2026-09-08
Додано
- Атрибуція походження на рівні рядка. Коли завантажено більше ніж один трасувальний файл, спливна підказка з кількістю влучень завершується рядком Покрито: і переліком звітів, які зафіксували влучення в цьому рядку — а клацання на рядку трасувального файлу в поданні Coverage тепер підсвічує рядки, які він додав, у кожному відкритому редакторі, так само як раніше підсвічувало виміряні ним файли. Це те єдине питання, на яке може відповісти об’єднаний запуск і не може окремий звіт: два трасувальні файли, що вимірюють один файл, розходяться щодо його рядків, і досі об’єднання це розходження згладжувало. Об’єднання й далі відбувається за файлами — найновіший звіт цілком виграє спільний файл, — тож походження за рядками індексується до об’єднання. Враховуються лише покриті рядки: звіт, що записав рядок як
0, його не покрив.
- Запис
TN: у lcov нарешті читається. Трасувальний файл, який називає свій набір тестів — TN:integration — показується як coverage.info (integration) усюди, де названо походження, і ця назва зберігається під час експорту назад у lcov замість порожнього запису. Більшість інструментів пишуть TN: порожнім і нічого не змінюється; ті, що його заповнюють, — це саме ті, чиї файли об’єднують, і назва є єдиним, що каже, який із них який.
fuciniCoverage.lineHighlight підфарбовує самі рядки. off | uncovered | heatmap, типово вимкнено: напівпрозоре тло за кожним непокритим і частково покритим рядком, а в режимі heatmap — і за кожним виконаним, тим тепліше, чим частіше він виконувався. Окремий параметр, а не четверте значення editorGutter.mode, бо їх хочуть у різних поєднаннях: прогалини підфарбовані з чистим полем, або смужки без кольору за кодом. Напівпрозоре, бо міститься під текстом, і фарбує прогалини, а не покриті рядки, з тієї самої причини, що й поле.
fuciniCoverage.overviewRuler самостійно вирішує щодо смужки на смузі прокручування. follow (типово) робить те саме, що й раніше: смужка там, де поле малює непокритий або частковий стовпчик, і ніколи для теплової карти. uncovered малює її навіть із вимкненим editorGutter.mode — карта прогалин файлу вздовж смуги прокручування і нічого поруч із кодом. off лишає стовпчики й прибирає смужку. Раніше лінійка була жорстко прив’язана до поля, тож ці два поєднання були недоступні.
Виправлено
- Трасувальний файл, який не вдається розібрати, тепер каже, як його прочитали. «…неправильно сформований» лишало читача в невіданні, чи файл узагалі розпізнано як той формат, на який він схожий, — а документ Cobertura, відхилений аналізатором VectorCAST, це інша проблема, ніж справді обрізаний документ Cobertura. Повідомлення тепер завершується словами Файл прочитано як cobertura., коли якийсь аналізатор його прийняв. Якщо не прийняв жоден, нічого не додається: «не у форматі, який читає це розширення» уже все сказало.
0.2026.70 — Повідомлення про застарілі дані знову зі своєю піктограмою
2026-09-08
Виправлено
- Повідомлення про застарілі дані у підказці рядка стану знову показує свою піктограму годинника замість тексту
$(history). Повідомлення, яке каже, що числа під ним описують старішу версію файлів, має той самий знак $(history), що й сам рядок стану. У рядку стану цей знак малюється як піктограма годинника зі стрілкою, бо StatusBarItem.text підставляє піктограми самостійно; підказка ж — це MarkdownString, який має ввімкнути це через supportThemeIcons, чого ніколи не робив, — тож єдине місце, яке пояснює, чому покриттю не можна вірити, починалося з шматка сирого синтаксису. Тепер підказка вмикає його.
0.2026.69 — Режими поля редактора, віддалені трасувальні файли, багатокореневі робочі області та невиміряні файли
2026-09-08
Додано
- Власне поле редактора тепер може показувати непокриті рядки або теплову карту влучань. Типово воно й далі показує лише знахідки — смужки MC/DC, трикутники «з попереднього прогону», крапки відредагованих рядків, — а кольоровим поданням цілого файлу лишається Annotated Source.
fuciniCoverage.editorGutter.mode вмикає більше: uncovered ставить смужку на кожен рядок, який жодного разу не виконався, і бурштинову — на кожен рядок, у якому якусь вітку гілки жодного разу не взято, а на покритих рядках нічого, тож зелена стіна не ховає три червоні; heatmap додає теплий відтінок на кожен виконаний рядок — тим гарячіший, чим частіше він виконувався. Choose Editor Gutter Mode... перемикає між трьома режимами з палітри або з меню рядка стану. README раніше прямо заявляв про «нативні смуги»; тепер він каже, що там є насправді. - Вбудовані лічильники влучань.
fuciniCoverage.hitCounts.inline дописує ×12 після кожного рядка, з якого починається інструкція, включно з ×0, — те саме число, яке завжди було в підказці при наведенні, тільки без наведення. Toggle Inline Hit Counts перемикає його; меню рядка стану пропонує його як «Показати» або «Сховати» залежно від стану. ${env:NAME}, ${config:section.key}, ${userHome} і ${workspaceFolderBasename} в кожному налаштуванні шляху, поруч із ${workspaceFolder}, який там уже був. Змінна, якої розширення не знає, залишається як записано, тож помилка друку з'являється в журналі пошуку як шлях, який шукали, а не зникає безслідно. - Запис
coverageFile.paths може бути URL-адресою http(s)://. Артефакт отримується у сховище розширення при кожному завантаженні покриття й читається звідти; подання Coverage називає URL-адресу, а не шлях до кешу. Кожне отримання умовне (ETag / Last-Modified), тож повторне отримання незміненого артефакту нічого не завантажує, а коли отримання не вдається, натомість завантажується остання завантажена копія, а причина — у виводі. fuciniCoverage.remote.headers додає заголовки Name: value із розгорнутими змінними — Authorization: Bearer ${env:CI_TOKEN} тримає токен подалі від settings.json, — а fuciniCoverage.remote.refreshMinutes отримує його знову за таймером. Додайте #lcov.info (або іншу назву файлу) як фрагмент URL-адреси, коли сама адреса не закінчується на назву файлу, щоб формат був відомий. - Завантаження та Generate Full HTML Report показують поступ, і їх можна скасувати. Завантаження десяти чи більше трасувальних файлів, або 8 МБ чи більше їх, виконується під сповіщенням про поступ із кнопкою Cancel, яке називає файл, що читається, і фазу (читання, потім перевірка джерел); менше завантаження лише крутить індикатор у рядку стану, як і раніше. Скасування залишає попередній прогін завантаженим і каже про це. HTML-звіт робить те саме для кожної відрендереної й записаної сторінки.
- Ще дві причини для перезавантаження. Абсолютний запис
coverageFile.paths поза робочою областю — дерево збірки поруч із робочою копією, кореневий каталог виводу Bazel — тепер теж опитується, тож файл, що з'явився там після відкриття вікна, завантажується, а не лишається назавжди непоміченим; спостерігач бачив тільки робочу область. А fuciniCoverage.watch.reloadAfterTasks називає завдання (label із tasks.json або source: name, як їх показує список Run Task, наприклад npm: test), завершення яких перезавантажує покриття, незалежно від того, чи ввімкнено watch.enabled, — для збірок, за якими спостерігач не встигає: прогін, що замінює дерево виводу за символічним посиланням, звіт на мережевому ресурсі, крок покриття, що дообробляє свій файл. - Багатокореневі робочі області. Кожна тека робочої області тепер шукається на власних умовах:
coverageFile.defaultLocation, coverageFile.paths, pathRemap, ignore, watch.*, remote.*, badge.*, каталоги звітів, gitDiff.*, problems.perLine, editorGutter.mode і hitCounts.inline читаються для кожної теки окремо, тож діє власний .vscode/settings.json теки або її запис у .code-workspace; ${workspaceFolder} означає власну теку запису; трасувальні файли, знайдені в усіх теках, зливаються в один прогін, а подання Coverage групує файли за теками. ${workspaceRoot} у правилі pathRemap спочатку пробує власну теку трасувального файлу, потім інші. Усе, чому потрібна одна тека — діалоги вибору файлів, вивід звіту й значка, метадані git, Run Tests with Coverage, — бере теку активного редактора, а за кількох тек і без редактора тестовий запуск питає, яку саме. Тека, додана до робочої області або вилучена з неї, сама перезавантажує покриття. До цього дванадцять місць брали першу теку, і другий корінь отримував хибну базу для всього. - Прогін публікується у власне подання Test Coverage VS Code. З
fuciniCoverage.testCoverage.publish (типово ввімкнено) кожен завантажений прогін іде також у нативну панель Test Coverage, її пофайлові відсотки в Провіднику та власний перемикач редактора «Show Inline Coverage» — рядки, вітки гілок і функції, з деталями, що завантажуються на вимогу. Show in Test Coverage View публікує активний прогін і відкриває панель, хоч би що казало налаштування; меню рядка стану пропонує це за quickActions.showTestCoverage. - Коли файли не збігаються, пропонується правило переприв'язки шляхів. Найпоширеніше «завантажилося, а нічого не підсвічується» — це трасувальний файл, чиї шляхи походять із контейнера або робочої копії CI (
/build/src/a.c, /home/runner/work/repo/repo/src/a.c, C:\agent\_work\1\s\src\a.c), тоді як у робочій області є src/a.c. Коли після завантаження лишаються незіставлені файли, розширення шукає їхні назви в робочій області, виводить правило префікса, яке пояснює найбільше з них, записує його в журнал як [FUCINI_REMAP_002], а результат завантаження пропонує Apply Suggested Remap — одне клацання дописує правило до fuciniCoverage.pathRemap і перезавантажує. Suggest Path Remap Rule виконує той самий аналіз на вимогу. Без клацання нічого не записується. fuciniCoverage.ignore: файли, які ніколи не рахуються. Вендорні, згенеровані чи сторонні файли (vendor/**, **/*.generated.ts, build/**) відкидаються з прогону під час його завантаження, тож подання Coverage, рядок стану, пороги, значки, CodeLens, історія та експорти рахують без них; результат завантаження каже, скільки їх пропущено, а вивід називає їх. Шаблони зіставляються зі шляхом відносно робочої області та з абсолютним шляхом; шаблон без / збігається з назвою теки чи файлу на будь-якій глибині, як у .gitignore. Для цілих файлів — рядки всередині файлу й далі використовують власні маркери виключення інструмента. - Порядкові записи в Problems, за бажанням.
fuciniCoverage.problems.perLine (off, uncovered або uncoveredAndPartial; типово вимкнено) ставить діагностику рівня Information на кожен суцільний блок рядків, які жодного разу не виконалися, — мертва функція на сорок рядків це один запис, а не сорок, — а в другому режимі ще й на кожен рядок, у якому якусь вітку гілки жодного разу не взято. Лише для відкритих документів, тож прогін на дві тисячі файлів не затопить панель; записи йдуть за своїми рядками під час редагування буфера й зникають, коли документ закривається. Пофайловий запис за problems.enabled не змінився. - Значок покриття для README. Generate Coverage Badge записує SVG у стилі shields для активного прогону в робочу область (
fuciniCoverage.badge.outputPath, типово coverage-badge.svg), щоб README вбудував його через  без жодного хостингового сервісу. badge.metric вибирає рядки, гілки, MC/DC або зважену оцінку; колір іде за рівнями colorScale; badge.autoUpdate переписує його після кожного завантаження. SVG-значок, який Export Coverage Report уже пропонував, тепер використовує той самий рендерер. - Невиміряне проти непокритого. Файл, якого не завантажив жоден тест, у трасувальному файлі взагалі відсутній, тож розширення завжди відрізняло його від виміряного файлу з 0 влучань — і не включало в числа, і саме так проєкт, половина модулів якого не має тестів, читається як «92%». Тепер ця різниця видима: відкриття такого файлу ставить
not measured у рядок стану, а fuciniCoverage.unmeasured.mode вирішує, що ще відбувається. list додає в подання Coverage групу Невиміряні з кожним файлом робочої області того виду, який прогін вимірював, але якого в прогоні немає, рахує їх у результаті завантаження, позначає їх ? у Провіднику, коли ввімкнено значки, і дозволяє threshold.unmeasuredFiles провалити Check Coverage Thresholds понад вибране число. count іде далі: кожен такий файл приєднується до прогону як 0% — один непокритий рядок на кожен рядок коду, — тож рядок стану, пороги, значки, історія, експорти й подання Test Coverage бачать чесне число; файл усюди зображується як невиміряний, ніколи як «більше не відповідає своєму покриттю». unmeasured.exclude не пускає туди заголовки й подібне (типово **/*.h, **/*.hpp, **/*.hh, **/*.inl, **/*.d.ts). Типово вимкнено; стан у рядку стану — єдина зміна, яка діє завжди. - Подання Покриття показує, що зробило злиття. Від 0.2026.63 власний повторний запуск модуля, завантажений поверх запуску всього проєкту, заміняє числа того запуску для файлів модуля, і кожен рядок називав звіт, з якого його показано — але рядок, чиї числа переважили старіший звіт, виглядав точнісінько як рядок, виміряний одним із кількох звітів, і ніщо не казало, яку частину звіту переважено. Тепер значок файлу трасування такого рядка обведено; кожен рядок файлу трасування над деревом рахує, що злиття зробило з його файлами («42 файли · 7 переважено новішим звітом», «7 файлів · переважує 7 у старіших звітах»); а клацання рядка файлу трасування підсвічує в повному дереві виміряні ним файли, притлумлюючи решту, доки його не клацнути знову.
fuciniCoverage.coverageView.mergedMarks (типово ввімкнено) вимикає обведення й підсвічування; лічильники залишаються.
0.2026.68 — Командні місця запитують код запрошення
2026-09-07
Виправлено
- У користувача Business або Enterprise тепер запитують код запрошення, а не код компанії. З 2 вересня сервер ліцензій відхиляє спільний код компанії для місця Business або Enterprise: місце, зайняте за ним, не називало нікого, тож тепер кожне командне місце прив’язане до адреси, на яку надійшло запрошення, а активує його код запрошення
FCI1… з того листа. Анкета ж і далі підписувала поле «Код компанії», радила запитати його в керівника й показувала зразок FCB1… — тобто відправляла людей вставляти той єдиний код, який більше не працює, а коли поле лишали порожнім, вимагала ввести код компанії. У командних планах поле тепер називається «Код запрошення», підказка пояснює, звідки береться код і що спільний код компанії місце не активує, зразок показує форму FCI1…, а повідомлення перевірки просить код запрошення. Pro запитує свій код підписки під його власною назвою. Pro Plus не змінився: він навмисно зберігає спільний код. Нове формулювання є в усіх 17 мовах інтерфейсу.
0.2026.67 — ${workspaceFolder} працює в обох налаштуваннях шляхів
2026-09-05
Виправлено
${workspaceFolder} тепер працює в coverageFile.paths, як завжди працював у coverageFile.defaultLocation. Ці два налаштування стоять поруч, і лише одне з них документувало змінну, тож люди писали її в обох — а запис, що починається з ${, не є абсолютним, тому він потрапляв у глоб пошуку як літерал під базовою текою, нічого не знаходив, і розширення повідомляло, що покриття немає. Такий запис тепер спочатку розгортається, що робить його абсолютним шляхом, і просто перевіряється. У налаштуванні він лишається таким, як записаний, не записується вдруге в іншій формі, коли той самий файл вибирають, і сам зникає з налаштування, коли його вивантажують із подання Coverage.- Про налаштований трасувальний файл, якого немає, тепер повідомляється у виводі. Запис із хибним шляхом зазнавав невдачі так, що ніхто про це не повідомляв: «покриття не знайдено», що не відрізнити від проєкту, у якому його справді немає.
[FUCINI_DISCOVERY] тепер називає кожен запис, за яким не знайдено файлу, і шлях, де шукали, — один раз на запис, а не при кожному перезавантаженні; запис із підстановкою не повідомляється, бо він може чекати, поки збірка щось запише.
0.2026.66 — Гілки, MC/DC та оцінка в CodeLens функції
2026-08-29
Додано
- CodeLens кожної функції тепер показує гілки, MC/DC та зведену оцінку, а не лише рядки та влучання — «add: покрито 92% (12/13 рядків, 52 влучання, оцінка 88%, гілки 3/4 (75%), MC/DC 2/3 (66%))». Кожне з них опускається для функції, про яку трасувальному файлу нема чого повідомити — збірка на чистому C без даних про гілки або збірка, не інструментована з
-fcoverage-mcdc, — замість оманливого 0/0; оцінка так само показується лише поруч хоча б з одним із двох інших, бо з рядками як єдиною метрикою вона за означенням є тим самим числом, з якого лінза й так починається.
- Підказка значка походження каже, як давно записано кожен трасувальний файл, а не лише його часову позначку — «Виміряно module.info (2026-08-15 14:32 · 3 години тому), замість того, що казав про нього lcov.info (2026-08-01 09:10)». Проміжки йдуть аж до «щойно»; після 30 днів показується лише абсолютна дата.
- Однаковий mtime трасувальних файлів більше не минає мовчки. Два звіти, записані на одному кроці збірки, або файлова система, у якої роздільність mtime грубша за секунду, можуть дати ту саму часову позначку файлам, які обидва вимірюють, — раніше переможець визначався порядком у
coverageFile.paths, і на екрані ніщо цього не пояснювало. Тепер канал виводу про це каже: [FUCINI_MERGE_TIE] називає обидва трасувальні файли й скільки файлів у них спільних.
- «Show What Changed Since Last Run» у меню
… рядка файлу, щойно є попередній прогін для порівняння, — та сама пофайлова різниця, яку вже обчислює Compare with Last Run, спрямована на один файл, про який ви спитали, а не на все дерево. Файл, у якому нічого не зрушило, так і каже, замість того щоб не пропонувати нічого.
- Команда Tune Colour Scale: спробуйте кольори й пороги
colorScale.* на живому поданні Coverage, перш ніж на них зупинитися. Кожна правка пишеться просто в налаштування — подання й так перемальовується за будь-якої зміни colorScale/threshold, тож запис значення і є попереднім переглядом, — а завершальне «Залишити» або «Повернути початкові значення» замикає коло.
- Пофайлові прогалини покриття на панелі Problems, по одному запису на кожен завантажений вихідний файл нижче
threshold.statement, за новим налаштуванням fuciniCoverage.problems.enabled (типово вимкнено — типовий поріг для інструкцій дорівнює 100). Кожен запис підсумовує, що не покрито («покрито 62% рядків — 14 непокритих рядків, 2 непокриті функції»), і несе швидке виправлення, яке відкриває встановлене розширення чату (Copilot, Claude Code, …) із запитом написати тест для цієї прогалини — порядкова діагностика затопила б Problems на справжній кодовій базі, тож усе лишається на рівні файлу, тому, на якому читач справді може діяти.
Виправлено
- Причину для відсутнього, невідповідного чи перевіреного файлу в поданні Coverage тепер можна виділити й скопіювати. Раніше вона жила лише в рідній підказці
title рядка, яку — бо вона браузерна — виділити не можна; хто хотів вставити точну причину в звіт про помилку, мусив передруковувати її вручну. Тепер при наведенні той самий текст показується у справжній оформленій панелі, яку можна виділити мишею, як будь-який інший вміст сторінки. Підказки звичайного файлу (лише його шлях) це не стосується.
- Функція, чий список параметрів займає кілька рядків, більше не повідомляється хибно як переміщена.
detectMismatch дозволяв записаному рядку оголошення розходитися з місцем, де насправді знайдено його ім’я, щонайбільше на два рядки — досить для звичної розбіжності між рядком сигнатури, рядком типу повернення й відкривною дужкою, але не для багаторядкового списку параметрів, який може рознести їх як завгодно далеко. void LOG_Emit(...) — сім параметрів, по одному на рядок — записана на своїй відкривній дужці, рядок 163, повідомлялася як "LOG_Emit" is at line 3: найближчий текстовий збіг, яким виявилася згадка імені самої функції в коментарі-заголовку файлу, далеко і від рядка 163, і від справжнього оголошення в рядку 156. Тепер перевірка приймає й ім’я, знайдене далі назад, якщо кожен рядок між ним і записаним читається як одне безперервне оголошення — без порожнього рядка, без рядка, що завершує попередню інструкцію чи блок, — що для списку параметрів справджується завжди, а для справді переміщеної функції майже ніколи. Там, де невідповідність справжня, повідомлений рядок тепер є найближчим збігом до записаного, а не завжди першим знайденим у файлі.
- Значок походження більше не каже «+N». Завантаження власного звіту модуля поверх ширшого прогону позначало значок файлу назвою модуля плюс кількістю інших трасувальних файлів, що теж його покривали, — задумано як «стільки було відкинуто», читалося як «ці звіти згодні», і з дерева не було як зрозуміти, які саме з n малися на увазі. Тепер значок називає лише той трасувальний файл, чиї числа на екрані; підказка, як і раніше, розписує, що було відкинуто й чим.
- Значок походження більше не виштовхує сусідню назву файлу за край панелі. Ширина значка була фіксованою (
flex: none), тож щойно рядку бракувало місця, назва файлу вбирала весь дефіцит і скорочувалася першою, хоча з двох менш важливий саме значок. Тепер значок поступається власною шириною раніше, ніж назва файлу втратить бодай один символ; відсотка й смужки, які й так стоять вище за назву, це не стосується.
0.2026.65 — Повторний прогін модуля замінює те, що казав ширший прогін
2026-08-15
Змінено
- Власний повторний прогін модуля замінює те, що казав про нього ширший прогін, а не додається до нього. Завантаження звіту на весь проєкт, а поверх нього — власного звіту одного модуля раніше підсумовувало їхні влучання для кожного спільного файлу: повторний прогін лише тестів цього модуля роздував числа, які ширший, уже застарілий прогін встиг повідомити, замість оновлювати їх. Тепер трасувальний файл із найновішим mtime на диску беззастережно перемагає для кожного файлу, який він вимірює: інструкції, гілки, оголошення й пофайлові зведення (гілок, MC/DC, функцій, викликів функцій, об’єктного коду та мутацій) беруться лише з цього звіту, незалежно від того, де кожен зі шляхів стоїть у
coverageFile.paths, — повторний прогін модуля перемагає, бо він справді новіший, а не тому, що випадково завантажився останнім. Трасувальний файл, який узагалі не повідомляє інструкцій для файлу — експорт об’єктного коду TRACE32, звіт мутацій Stryker поруч зі справжнім, — і далі додає лише те зведення, яке справді несе, не чіпаючи порядкову й гілкову деталізацію ранішого звіту; цей випадок не змінився. Це також усуває давній дефект, коли в пофайловому зведенні MC/DC (або функцій, викликів функцій, мутацій), виміряному двома прогонами, знаменник додавався разом із чисельником, занижуючи справжній відсоток. Підказка значка походження тепер каже «замість того, що казав про нього _», а не «додано разом».
Виправлено
- Довга назва файлу в поданні Coverage тепер скорочується трьома крапками, а не вилазить за межі. Елементу з назвою в рядку бракувало
min-width: 0 — єдиного правила, яке дає overflow/text-overflow: ellipsis флекс-елемента справді спрацювати; без нього довга назва зберігала повну ширину, щойно панель звужувалася достатньо, і залазила під значок походження, відсоток і смужку після неї.
0.2026.64 — Сортування подання Coverage за оцінкою
2026-08-01
Додано
- Сортуйте подання Coverage за оцінкою, а не лише за назвою. Кожен рядок і так несе оцінку WHM і розбивку за метриками; щоб знайти найгірший файл у великому дереві, доводилося читати алфавітний список згори донизу. Розкривний список поруч із Collapse all / Expand all тепер пропонує Назва файлу, Зведена оцінка, Рядки, Гілки та MC/DC — кожен режим, крім Назви файлу, перемішує теки й файли разом, найгірші спершу за відсотком самої метрики, тож погано протестована тека стоїть точно так само, як погано протестований файл, а не окремою групою. Файл без даних для обраної метрики (скажімо, формат, що ніколи не повідомляє гілок) іде в самий низ, а не читається як 0%. Вибір записується в нове налаштування
fuciniCoverage.coverageView.sortBy у момент вибору, тож він переживає перезавантаження вікна замість щоразу починати з Назви файлу.
Виправлено
- Багаторядкова сигнатура функції більше не позначається хибно як «переміщена».
fnMap Istanbul дає функції два посилання на рядки — де стоїть її ім’я і де починається тіло, — і парсер віддавав перевагу рядку тіла для перевірки відповідності, яка потім шукає ім’я у вихідному тексті. Для будь-якої функції, чий список параметрів займає понад два рядки (звична річ у кодовій базі з переносом на 100 стовпцях), справжній рядок імені був надто далеко від записаного, і файл пригашувався в поданні Coverage з хибним попередженням «більше не відповідає своєму покриттю». Тепер парсер віддає перевагу рядку самого імені — саме його перевірка відповідності завжди й шукала.
0.2026.63 — Кожен рядок називає свій трасувальний файл
2026-07-20
Додано
- Кожен рядок каже, який трасувальний файл його виміряв. Завантаження звіту одного модуля поверх загального прогону — це ті самі файли, виміряні двічі, і дерево нічого не говорило про те, який звіт читає рядок. Тепер, коли завантажено більше одного трасувального файлу, кожен рядок файлу несе назву звіту, який його виміряв — останнього завантаженого, якщо їх було кілька, — з
+1 за кожен інший і підказкою, що називає їх. Об’єднання додає влучання разом, а не обирає переможця, і підказка про це каже. З одним трасувальним файлом нічого не малюється, бо не було б чого розрізняти.
Змінено
- Власна сторінка розширення називає кожен параметр із його справжнім типовим значенням. Двадцять параметрів не мали жодного рядка — мова, три пороги, одна вага і п’ятнадцять перемикачів швидких дій, — а рядок телеметрії стверджував, що вона типово ввімкнена, хоча вже давно вимкнена. Тепер тест звіряє сторінку з маніфестом, разом із типовими значеннями.
Виправлено
- Повторна перевірка джерел під
files.watcherExclude, додана в попередньому випуску, тепер слухається staleWarning.enabled, як і решта цієї перевірки, а не власної назви параметра.
0.2026.62 — Провідник не чіпаємо, приглушені джерела перевіряються
2026-07-06
Змінено
- Провідник залишаємо у спокої. Значки покриття біля файлів у Провіднику типово вимкнені. Цей стовпчик належить тому, хто ним користується — VS Code розміщує там власні M і U від git, і вміщується лише один значок, — а подання «Покриття» містить ті самі файли з тими самими числами, у місці, яке для них і існує.
explorerBadges.enabled вмикає їх назад без змін.
Виправлено
- Джерело під
files.watcherExclude теж перевіряється. Живу відповідність між файлом і його покриттям рухають збереження та спостерігач файлової системи, а той мовчить про все виключене — передусім про згенеровані джерела в build/, де застарілу позначку помітити найважче. Тепер ці файли опитуються на тому самому двосекундному такті, що й трасувальні файли, і перечитуються лише тоді, коли справді змінилися. Понад дві сотні таких файлів — і замість опитування у вивід іде повідомлення.
0.2026.61 — Одне запитання про тестовий запускач, а не одне на кожен запуск
2026-06-09
Додано
- Про тестовий запускач питають один раз, а не перед кожним запуском. Робоча область із кількома розпізнаними запускачами — скажімо, конфіг jest і
go.mod — показувала вибір перед кожним Run Tests with Coverage, беручи натискання за вже ухвалене рішення. Тепер відповідь запам’ятовується для робочої області, і запит про це каже. Forget the Test Runner повертає питання, а запам’ятований запускач, якого в робочій області вже немає, ігнорується, а не запускається.
Змінено
- Власна сторінка розширення називає кожну команду. Чотирнадцять із тридцяти чотирьох випали з її таблиці — вони описані тут і в посібнику, але не на сторінці, яку читають перед встановленням. Тепер перелічені всі, і тест це підтримує.
0.2026.60 · збірка 3 — Скасування знову прибирає крапки
2026-06-01
Виправлено
- Скасування знову прибирає крапки з відредагованих рядків. Буфер, змінений після прогону, показує сірі крапки на переписаних рядках, і покриття від них відступає. Скасування цих правок залишало крапки на місці: рахувалася кожна зміна, зокрема й та, що повертала текст назад. Тепер запам’ятовується, що буфер тримав до першого натискання, і щойно він тримає це знову, крапки зникають, а числа знову стосуються його.
- Номери випуску звіряються між собою. Маніфест, верхній запис журналу змін і тег випуску несуть версію та збірку, усі три вводяться вручну, і вони вже розходилися. Тепер набір тестів їх порівнює й перевіряє, що записи йдуть від найновішого й кожен має справжню дату.
0.2026.59 — Вивантаження, що триває
2026-05-12
Змінено
- Вивантажений трасувальний файл лишається вивантаженим. Прибирання файлу зі списку в поданні «Покриття» тривало рівно стільки, скільки вікно: без налаштувань пошук повертається до відомих імен і наступного ранку знову знаходив
lcov.info, а єдиним способом сказати інакше було налаштувати шлях, щоб виключити один файл. Тепер рішення запам’ятовується для робочої області. Його скасовує повторний вибір файлу або згадка в coverageFile.paths — файл, названий у параметрі, ніколи не приховується, тож ніщо не зникне без чийогось слова.
Виправлено
- Швидше перемальовування відредагованого буфера. Список переписаних рядків обчислювався заново з усіх записаних правок при кожному перемальовуванні, тож довгий файл, який редагували цілий день, платив кількість рядків × кількість правок за відповідь, що не змінювалася від останнього натискання. Тепер вона обчислюється раз на натискання.
0.2026.58 · збірка 2 — Тестовий запуск запам’ятовує свій трасувальний файл
2026-05-01
Змінено
- Тестовий запуск запам’ятовує свій трасувальний файл — так само, як вибір вручну. Run Tests with Coverage завантажував те, що записав запуск, а тоді питав, чи додати це до
coverageFile.paths. Файл, вибраний вручну, записується туди сам від 0.2026.56, а тестовий запуск — та сама дія іншим шляхом, тож тепер він записує його так само. Обома керує один параметр, coverageFile.rememberPicks; рядок трасувального файлу в поданні «Покриття» — місце, де будь-який із них знову прибирається.
Виправлено
- Фонові таймери зупиняються разом із розширенням. Спостерігач за трасувальним файлом звільнявся разом із вікном, але двосекундне опитування за ним і будь-яка відкладена перевірка джерела — це звичайні таймери, які ніщо не звільняє. Вимкнення розширення або перезавантаження вікна з вимкненим розширенням залишало їх працювати й читати робочу область, до якої розширення вже не мало жодного стосунку.
0.2026.57 · збірка 4 — Підписаний живий перегляд, намальовані прапорці, усі формати у діалозі вибору
2026-04-24
Додано
- Живий перегляд каже, що саме він переглядає. Перегляд у панелі налаштувань тепер починається з Прогін: coverage/lcov.info · 12 файлів, а коли активний редактор показує файл, який покриває прогін, — з Активний файл: src/a.c із власним вердиктом цього файлу під вердиктом прогону. Він іде за редактором і за кожним завантаженням, за тим, що зараз у формі — з незбереженими правками включно. Коли панель попереду, клік у поданні «Покриття» перемикає перегляд на цей файл замість того, щоб його відкривати.
- Діалог вибору називає кожен формат. Спочатку Усі формати покриття, далі LCOV; JSON (llvm-cov, Istanbul/nyc, coverage.py, SimpleCov, Coveralls, gcov, xccov, Stryker); XML (Cobertura, JaCoCo, Clover, OpenCover, GNATcoverage, Bullseye, SonarQube, VectorCAST, TRACE32, EMMA, UCIS/UCDB, NCover, dotCover, PIT); профіль покриття Go; лістинг gcov і Testwell CTC++ — а
.lcov, .gcov, .txt і .coveragexml більше не сірі.
Змінено
- Підказки рядка стану носять кольорову шкалу. Смужки метрик у підказках прогону та файлу беруть три кольори
colorScale.*, розподілені за власним порогом кожної метрики, де він налаштований, і за точками шкали інакше; таблички вердикту зберігають свої фіксовані кольори стану.
- Намальовані прапорці в налаштуванні мови. Емодзі-прапорці з 0.2026.56 у Windows показуються як дві голі літери. Список тепер називає кожну мову нею самою — Nederlands (nl) — з рядком маленьких намальованих прапорців під ним, які вибирають у списку.
0.2026.56 · збірка 3 — Вибрані файли запам'ятовуються, файли трасування в поданні «Покриття», прапорці в налаштуванні мови
2026-04-08
Додано
- Вибір запам'ятовується. Файл, обраний через Pick Coverage File, жив лише у вікні, де його обрали. Тепер він сам потрапляє в
coverageFile.paths у налаштуваннях робочого простору — відносно базової теки, якщо він у ній, інакше абсолютним шляхом — тож наступне вікно його завантажує, а спостерігач перезавантажує. coverageFile.rememberPicks (типово увімкнено) зберігає стару поведінку для тих, хто її хоче. Абсолютний запис у цьому налаштуванні тепер називає один файл, де б він не був.
- Файли трасування в поданні «Покриття». Над деревом — по рядку на кожен завантажений файл трасування з кількістю файлів і кнопкою вивантаження, що прибирає його з прогону й з налаштувань; кнопка Вибрати… поруч додає новий. Вивантаження останнього файлу трасування очищає прогін.
- Прапорці в налаштуванні мови. Список мов у панелі налаштувань показував голі коди; тепер кожен запис має прапорець і назву мови нею самою — 🇳🇱 Nederlands (nl), 🇯🇵 日本語 (ja), 🌐 Автоматично.
0.2026.55 — Останній рядок PHP-файлу не є покриттям за кінцем файлу
2026-03-27
Виправлено
- Останній рядок PHP-файлу більше не вважається покриттям за кінцем файлу. Xdebug і PCOV записують неявний return кінця файлу в рядку після останнього переносу, тож php-code-coverage пише влучання в «рядок 252» файлу з 251 рядка — і перевірка невідповідності називала це суперечністю в кожному PHP-файлі з кінцевим переносом. Один рядок за кінцевим переносом тепер дозволено; посилання далі, або за файл без кінцевого переносу, залишається суперечністю.
0.2026.54 · збірка 2 — Рядок пробного періоду у What Community Includes
2026-03-24
Додано
- Рядок пробного періоду у What Community Includes, у виданні Community. Це видання ніколи не мало пробного періоду, тож його список тепер починається з Почати 14-денний пробний період Pro…, що відкриває сторінку Pro; активація видання Pro потім пропонує прибрати видання Community з дороги. Community залишається безкоштовною, хоч би що ви вирішили.
0.2026.53 — Show Worst-Covered Folders
2026-03-03
Додано
- Show Worst-Covered Folders. Відповідь на рівні тек на Show Worst-Covered Files: кожна тека, упорядкована за покриттям усього, що в ній, від найгіршої, з того самого індексу, з якого малюються значки у Провіднику; вибір розкриває теку в Провіднику. У меню рядка стану через
quickActions.worstCoveredFolders.
0.2026.52 — Пороговий контроль на панелі «Проблеми»
2026-01-23
Додано
- Пороговий контроль на панелі «Проблеми». З увімкненим
compliance.diagnostics кожна метрика threshold.*, що не пройшла, — одна помилка в «Проблемах» на файлі трасування, який її не пройшов; оновлюється при кожному завантаженні та командою Check Coverage Thresholds, очищається, коли контроль пройдено. Типово вимкнено, бо типовий поріг для операторів — 100.
Змінено
- Опис
watch.enabled більше не обіцяє запит. Він досі казав, що безкоштовний рівень запитують перед перезавантаженням — правда до 0.2026.48, але не після. Переписано всіма 18 мовами.
0.2026.51 · збірка 2 — Run Tests with Coverage
2025-12-08
Додано
- Run Tests with Coverage. Розпізнає vitest, jest, pytest, go, cargo, dotnet, maven, gradle, phpunit або ctest з кореня робочого простору, запускає його з увімкненим покриттям у завданні термінала, завантажує записане незалежно від того, чи пройшли тести, і один раз пропонує додати цей шлях до
coverageFile.paths, щоб відтепер завантаженням займався спостерігач. Кілька рушіїв пропонуються на вибір; жоден не відсилає до рецептів.
0.2026.50 — Покриття йде за текстом у зміненому буфері
2025-10-23
Додано
- Покриття йде за текстом у зміненому буфері. Зміни, внесені в кожен відкритий буфер після завантаження прогону, зберігаються, і кожна поверхня, що читає номери рядків прогону — кількість влучань при наведенні, смужка MC/DC, трикутник «з попереднього прогону», CodeLens, Next Uncovered — читає крізь них: позначка рухається разом зі своїм рядком і зникає з переписаного рядка, де маленька сіра крапка пояснює чому.
dirtyMarks.enabled вимикає крапки.
0.2026.49 — З попереднього прогону, у полі редактора
2025-09-26
Додано
- З попереднього прогону, у полі редактора. Кожен рядок, виконаний у попередньому прогоні й не виконаний у цьому, має червоний трикутник у полі редактора, кожен рядок, що пішов у зворотний бік, — зелений, обидва зі смужкою на оглядовій лінійці та кількістю влучань при наведенні. Рядки без змін нічого не показують.
sinceLastRun.enabled вимикає це.
Змінено
- База для «останнього прогону» переживає перезапуск. З увімкненим
history.enabled найновіший прогін з історії стає базою при першому завантаженні у вікні, тож збірка, що завершилася до відкриття вікна, все одно показує, що змінила — у полі редактора та в Compare with Last Run.
0.2026.48 · збірка 6 — Перезавантаження само по собі всюди, позначка йде за файлом, точна різниця при наведенні
2025-09-19
Додано
- Вердикт щодо файлу залишається актуальним після завантаження. Файл перевірявся на відповідність покриттю один раз, під час завантаження файлу трасування, і більше ніколи: редагуйте його весь день — і поля редактора далі малювали числа про версію, якої вже не існувало. Тепер збереження в редакторі одразу перевіряє цей файл знову, а зміна ззовні редактора —
git checkout, форматувальник, генератор — перевіряє його з диска за мить. Файл, який починає суперечити своєму прогону, отримує позначку; checkout, що повертає виміряну версію, її знімає.
- Точна різниця при наведенні. Там, де файл більше не відповідає своєму покриттю, подання «Покриття» та підказка у Провіднику кажуть точно, що це довело: рядок, як він читається зараз, проти того, що записав звіт, якщо файл трасування зберіг текст; рядок і невдала контрольна сума, якщо він зберіг дайджест; покриття за кінцем файлу; функція, якої вже немає там, куди її ставить звіт. Та сама деталь потрапляє в канал виводу, по рядку на файл, куди веде Показати які у результаті завантаження.
- Перемикач для значків у Провіднику.
explorerBadges.enabled (типово увімкнено) ховає оцінку, ✓ і ⚠ поруч із кожним покритим файлом у Провіднику, а разом із ними й підказку за метриками. Поля редактора, рядок стану та подання «Покриття» не змінюються.
Змінено
- Кожен рівень перезавантажує сам, коли змінюється файл трасування. З 2026-09-02 безкоштовний рівень зупинявся на запиті виявлено нове покриття — завантажити?, тоді як платні ліцензії перезавантажували мовчки. Збірка завершується, числа нові, а той, хто увімкнув стеження, вже відповів на це запитання — тож запит зник на кожному рівні, як і повідомлення, що його пояснювало.
- Завантаження, які продукт робить сам, більше не рахуються в денний ліміт безкоштовного рівня. Перезавантаження від спостерігача чи пошук під час запуску — це не завантаження, про яке хтось просив; їх облік витратив би ліміт установки Community за один ранок тестових прогонів і залишив би на екрані старий прогін без жодного попередження. Ліміт тепер вимірює лише команду та вибір файлу.
- Сама лише змінена позначка часу більше не позначає файл. Попередження N файл(ів) змінено після цього прогону бралося з mtime кожного джерела, а
git pull чи форматувальник змінює кожен mtime, не змінюючи виміряного. Його прибрано разом із позначкою в рядку стану. Файл тепер називається зміненим лише тоді, коли його вміст суперечить прогону, і рядок стану, результат завантаження та новий рядок виводу FUCINI_MISMATCH_001 читають саме це. staleWarning.enabled зберігає назву й тепер описує саме перевірку вмісту.
- Стеження за текою під
files.watcherExclude повідомляється у виводі. Результати збірки — перше, що виключають зі спостерігача VS Code, після чого новий прогін помічає лише опитування раз на 2 с. Канал виводу тепер називає теку та шаблон під час запуску спостерігача.
0.2026.47 · збірка 2 — Незіставлені шляхи на екрані, підказка при першому запуску, ще дві клавіші
2025-08-09
Додано
- Підказка при першому запуску для робочого простору, де нема чого завантажувати. Спостереження увімкнене типово, а стартове завантаження тихе, тож свіжа інсталяція в проєкті без файлу трасування нічого не казала. Перше тихе завантаження, яке нічого не знаходить, тепер каже про це — один раз назавжди — і пропонує два корисні кроки: вибрати файл покриття вручну або відкрити рецепти, як створити його вашим інструментарієм. Завантаження, запущене вручну, зберігає власне повідомлення.
- Клавіші для Toggle Annotated Source і Load Coverage.
Alt+A перемикає активну вкладку між кодом і його анотованим поданням; Alt+Shift+R знову шукає й перезавантажує покриття (Ctrl+Alt+A / Ctrl+Alt+R на macOS). Переназначаються, як і дві клавіші з 0.2026.45.
Змінено
- Шляхи, які нічому не відповідають у робочому просторі, підраховуються на екрані. Шлях із файлу трасування, що не зіставляється з жодним файлом робочого простору, завантажується й ніколи не підсвічується — найпоширеніше «спрацювало, але нічого не видно» — і досі єдиним слідом був рядок
FUCINI_REMAP_001 у каналі виводу з правилом pathRemap, яке б це виправило, непрочитаний. Результат завантаження тепер їх підраховує, з кнопкою Які? для імен і запропонованого правила та Відкрити налаштування pathRemap для місця, куди його вписати. - Вибір файлу в меню рядка стану називає формати, які він читає. Його опис досі перелічував п'ять форматів із першого випуску; тепер він каже про двадцять п'ять — від lcov, Cobertura і JaCoCo до gcov, llvm-cov, TRACE32 і звітів про мутації.
0.2026.46 — Вихід із конфлікту редакцій і тихіший ліміт
2025-08-06
Змінено
- Встановлено обидві редакції: дві кнопки замість інструкцій. Коли Pro і Community встановлені разом, жодна не може активуватися — вони визначають ті самі команди й подання — і повідомлення про це раніше закінчувалося вказівками до подання «Розширення». Обидва рішення — по одній команді кожне, тож тепер це кнопки: Залишити це видаляє іншу редакцію й пропонує перезавантаження; Показати обидва в Розширеннях відкриває подання «Розширення» саме на цих двох. Якщо видалення не вдається, перезавантаження все одно пропонується — саме воно визначає, яка редакція активна.
- Ліміт використання оголошується повністю один раз, далі — лише в рядку стану. Перший раз, коли досягнуто ліміт Community, він заслуговує на повну відповідь — цифри, план, розблокування через телеметрію, список того, що входить до рівня. П'ятий раз, через десять хвилин, — ні. Протягом сеансу подальші досягнення того самого ліміту показують восьмисекундний рядок у рядку стану й нічого не переривають. Введення ключа починає все заново, бо нова ліцензія — це новий набір лімітів.
0.2026.45 — Клавіші для Next / Previous Uncovered
2025-07-26
Додано
- Next / Previous Uncovered отримали клавіші. Це дві команди, які натискають знову й знову під час читання файлу, і досі кожне натискання означало відкрити палітру команд і набрати назву.
Alt+N переходить до наступного непокритого діапазону, Alt+P — до попереднього (Ctrl+Alt+N / Ctrl+Alt+P на macOS, де Option вводить символи). Обидві діють лише у сфокусованому текстовому редакторі й переназначаються в Keyboard Shortcuts, як будь-які інші типові.
0.2026.44 · збірка 3 — Ліміти безкоштовного рівня, одним списком
2025-07-24
Додано
- Що входить до Community, одним списком. Безкоштовний рівень обмежує вісім дій і не включає дванадцять функцій, і кожне з цих рішень діяло на своїх дверях — тож єдиним способом дізнатися форму рівня було наштовхнутися на кожну стіну по черзі, посеред роботи. Нова команда What Community Includes показує все одразу: кожну обмежену дію з тим, скільки її дня чи місяця вже використано, кожну невключену функцію за назвою, і два способи зняти обмеження — платний план або розблокування через телеметрію.
- Пропонується всюди, де виникає питання. Пункт у меню рядка стану, кнопка в банері ліцензії подання Coverage і кнопка на двох повідомленнях, які інсталяція Community зустрічає на стіні — досягнуто ліміт використання і ця дія не входить. Рядки виводяться з того самого набору прав, який застосовують шлюзи, тож список каже саме те, що станеться.
Змінено
- Режим спостереження каже, що він робитиме на безкоштовному рівні. Пункт рядка стану обіцяв усім «автоматично перезавантажувати покриття», а на Community це обіцянка, якої спостерігач не дотримує — він помічає й питає. Тепер пункт так і каже, а команда називається Toggle Tracefile Watch, бо «Toggle Watch» ніколи не казав, за чим саме спостерігати. Сама поведінка не змінилася.
0.2026.43 · збірка 3 — Невдале завантаження пояснює чому, а приховані файли підраховано
2025-06-25
Змінено
- Файл трасування, який не завантажується, тепер каже чому і що спробувати. Кожна невдача раніше давала те саме сповіщення — «no coverage could be parsed. See output.» — а причина лежала за один канал звідти як код і повідомлення парсера. Тепер сповіщення починається з файлу й сортує відмову за її суттю: не у форматі, який читає це розширення, некоректна структура (зазвичай збірка ще записувала файл), коректна структура, але нічого не записано (запуск не виконав інструментованого коду) або не вдалося прочитати. Слова самого парсера йдуть поруч, кілька файлів підраховуються, а канал виводу пропонується за кнопкою Показати вивід, а не відкривається примусово.
- Файли, які файл трасування перелічує, але в яких нічого вимірювати, тепер підраховуються на екрані. Заголовок лише з оголошеннями завжди не потрапляв до подання Coverage замість оцінки 100% із 0 з 0 — і його ім'я записувалося в канал виводу, і більше нікуди. Результат завантаження тепер каже N файл(ів) без коду для інструментування не показано, з кнопкою Які?, що відкриває канал із іменами.
0.2025.42 · збірка 3 — NCover і dotCover, .NET-покриття, якому не було куди йти
2025-06-08
Додано
- NCover і JetBrains dotCover. Cobertura від Coverlet і OpenCover вже читалися тут, що покриває більшість нової роботи в .NET і жодної зі старішої. Збірка, що досі пише NCover-івський
Coverage.xml, або команда, яка вимірює dotCover, мала покриття на диску, яке це розширення не могло відкрити. Жоден із форматів не потребує конвертера: обидва вже несуть імена файлів і номери рядків. - Виключена точка NCover відкидається, а не рахується як невиконана.
excluded="true" позначає код, свідомо виведений з вимірювання — член із [ExcludeFromCodeCoverage] або фільтр NCoverExplorer. Рахувати це як непокрите означало б, що виключення знижує число, яке воно мало виправити. - dotCover потребує
/ReportType=DetailedXML. Його інший XML-звіт — це зведення без жодного номера рядка; такий звіт розпізнається і відхиляється з підказкою прапорця, що це виправляє, а не провалюється як невідомий формат. dotCover фіксує лише так/ні для кожного оператора, ніколи кількість відвідувань, тож покритий оператор дає одне влучення.
0.2025.41 · збірка 4 — Мутаційне тестування: PIT і Stryker
2025-05-28
Додано
- Мутаційне тестування. Покриття каже, що рядок виконався; оцінка мутацій каже, що щось не спрацювало, коли цей рядок змінили. Набір тестів може виконати кожен рядок файлу й не виявити жодного з внесених дефектів, і жодне число покриття про це не скаже. PIT охоплює Java, Kotlin і Scala; Stryker — JavaScript, TypeScript, C# і Scala.
- Це ніколи не усереднюється з покриттям. Змішування «чи виконався цей рядок» із «чи щось помітило, коли я його змінив» не відповідає ні на одне, тож воно не має ваги у зведеній оцінці й контролюється окремо через
fuciniCoverage.threshold.mutation — типово 0, бо оцінка мутацій — це ціль для підвищення, а не планка, яку слід подолати з першого дня. - Мутант, що ніколи не отримав чесного прогону, рахується в жодній половині.
NON_VIABLE у PIT та CompileError і Ignored у Stryker — мутації, які інструмент не зміг зробити; рахувати їх невиявленими означало б карати набір тестів за дефект, якого йому ніколи й не пропонували.
0.2025.40 — Плоскотекстовий формат gcov, для компіляторів старіших за GCC 9
2025-05-16
Додано
- Анотований список
.gcov. gcov --json-format з'явився в GCC 9, а вбудовані крос-компілятори часто набагато старіші; досі відповіддю було спершу встановити lcov чи gcovr. Кількість виконань має п'ять записів, і лише два з них — числа, а анотації branch/call/function прив'язуються до сусіднього рядка, а не свого власного — усе це тепер читається правильно. - Анотації виклику стають покриттям точок виклику.
call N returned X% — це саме та метрика викликів функцій, додана в 0.2025.38, яку цей формат ніс задовго до того, як тут з'явилося куди її класти.
0.2025.39 · збірка 2 — Покриття об'єктного коду, а разом із ним і асемблер
2025-04-27
Додано
- Покриття об'єктного коду — скільки зібраного двійкового файлу справді виконалося. Єдина метрика тут, що взагалі не вимірюється з коду: вона надходить від налагоджувача, що спостерігає потік інструкцій на справжньому пристрої без жодного впливу на час виконання. Це також чесна відповідь на питання «чи покриває це асемблер?» — рукописний асемблер ніколи не інструментується, і жодна інша тутешня метрика до нього не дістанеться.
- Це вимога, а не ще одна вага. Покриття об'єктного коду поглинає покриття операторів — 100% тут означає 100% там, але не навпаки — тож воно не має ваги у зведеній оцінці й натомість контролюється порогом, саме так, як цього вимагає DO-178C рівня A на додачу до MC/DC.
- Розрив — це і є результат. Прогін зі 100% покриттям рядків і меншим за 100% покриттям об'єктного коду точно вказав на породжений компілятором код, якого немає у вашому джерелі; картка відповідності каже «312 байтів не виконано, при 100% покритті рядків» замість того, щоб ховати це за «94%». Протилежний випадок — коли ввесь двійковий файл нібито виконався, а його джерело ні — повідомляється як суперечність, а не як низька оцінка.
0.2025.38 · збірка 2 — Покриття викликів функцій, і VectorCAST та TRACE32 завершено
2025-04-01
Додано
- Покриття викликів функцій — чи був задіяний кожен сайт виклику. Інше питання, ніж покриття функцій: функція, викликана один раз з одного з трьох її сайтів виклику, повна за Функціями і на третину повна тут. VectorCAST, TRACE32 і Cantata всі повідомляли про це, поки в цій моделі не було де розмістити число.
- Це завершує VectorCAST і TRACE32. Попередні релізи свідомо відмовилися згортати ці дані в покриття гілок, бо завищення відсотка гілок завищує число, яке потрапляє в аудит. Обидва формати тепер завантажують те, що завжди надсилали.
Змінено
- Шлюз відповідності й зважена оцінка тепер знають про сім метрик, а не шість — два нові налаштування,
fuciniCoverage.whmWeights.functionCalls і fuciniCoverage.threshold.functionCalls, з описами всіма 17 мовами.
0.2025.37 — Покриття функцій як кількість, а не лише як місце
2025-02-16
Змінено
- Покриття функцій тепер рахується, навіть коли інструмент не каже, де саме функції. Експорт
func у TRACE32, самозакриті елементи <method> у VectorCAST і зведення method, % в EMMA — усі троє чітко повідомляли кількість функцій, не даючи місця для CodeLens, і всі троє відкидалися на вході. Декларації лишаються бажаним джерелом, де вони є; там, де їх немає, тепер використовується число, повідомлене інструментом, як запасний варіант.
0.2025.36 · збірка 4 — UCIS та Aldec UCDB, і нові парсери, покриті тестами до рядка
2025-02-03
Додано
- UCIS та UCDB XML — VHDL і Verilog, з симулятора. Два документи відповідають цій назві, і в проєкту є той, який написав його симулятор, тож читаються обидва: стандартна форма обміну Accellera
<UCIS> і власний ux:ucdb від Aldec, який насправді видає acdb2xml з Active-HDL і Riviera-PRO. Покриття операторів і гілок переноситься; перемикання, FSM, покриття тверджень і функціональне покриття не читаються, і документ, що містить лише їх, повідомляє про це замість того, щоб завантажитися порожнім. - Відкритий VHDL уже нічого тут не потребував: бекенд GCC у GHDL інструментує через
-Wc,-ftest-coverage -Wc,-fprofile-arcs, і результат проходить через gcov, gcovr чи lcov. Цей реліз — для комерційних симуляторів.
0.2025.35 · збірка 3 — EMMA XML, і Delphi нарешті має шлях сюди
2025-01-22
Додано
- EMMA XML. Delphi не мав узагалі жодного шляху сюди — ні lcov, ні Cobertura, — а DelphiCodeCoverage пише саме цю схему з
-xml. Це також те, що досі видає чимало старішого Java-тулінгу, тож один парсер відкриває мову і водночас прибирає спадщину. - Додайте
-xmllines, і звіт отримує справжні порядкові лічильники влучень, тож індикатори покриття рядка працюють; без цього є лише відсоток зведення, який отримує підсумок файлу без індикаторів замість здогадки. Крапкова назва пакета стає директорією, лише коли файл — джерело родини Java; у звіті Delphi те саме поле — назва модуля, і додавання префікса вигадало б папку, якої немає на диску.
0.2025.34 · збірка 3 — Lauterbach TRACE32, одна метрика на експорт
2025-01-01
Додано
- Експорти покриття TRACE32.
COVerage.EXPORT.ListModule записує те, що вимірив налагоджувач із трасування на самому пристрої — не інструментоване джерело, а потік інструкцій, який процесор справді виконав, на реальному пристрої, без жодного впливу на час виконання. Один експорт несе одну метрику за раз: stmt стає покриттям рядків; dec/cond стають покриттям гілок; mcdc стає MC/DC. Завантажте два експорти одного прогону — вони об'єднаються за назвою модуля. - Експорти з покриттям
func, call чи object відхилялися за назвою, а не завантажувалися порожніми, з поясненням, яку саме метрику містить файл — тепер усі троє мають дім, відповідно у 0.2025.37, 0.2025.38 і 0.2025.39.
0.2025.33 · збірка 4 — Testwell CTC++, читаний за колонкою, бо текст не розділений пробілами
2024-12-19
Додано
- Текстові списки профілю виконання Testwell CTC++.
ctcpost перетворює MON.sym і MON.dat на текстовий список фіксованої ширини — інструмент, що стоїть навпроти Bullseye в європейських вбудованих і безпекових оцінках, і той, що вимірює багатоумовне покриття. Читається за позицією колонки, а не розбиттям за пробілами, бо опис сам може починатися з цифри. - Багатоумовність — це не MC/DC, і не подається як MC/DC. CTC++ рахує комбінації умов; MC/DC питає, чи показано, що кожна умова незалежно впливає на результат. Розміщення цих чисел за шлюзом MC/DC дало б аудитору число під назвою, яку воно не означає, тож тут вони — покриття гілок, чим і є.
0.2025.32 · збірка 4 — VectorCAST XML, і MC/DC, яке тихо відкидалося
2024-12-08
Додано
- VectorCAST XML. VectorCAST пише звіт Cobertura аж до doctype, а тоді додає атрибути для того, чого звичайна Cobertura сказати не може. Тобто ці файли вже завантажувалися тут і виглядали повними — а
mcdcpair-coverage тихо відкидався на вході саме для тієї аудиторії, яка купила інструмент спеціально, щоб його отримати. Тепер ці підрахунки пар живлять шлюз MC/DC, відсоток і зведену оцінку. - Покриття викликів функцій свідомо не наближується. Згортання його в покриття гілок завищило б число, яке потрапляє в аудит; воно чекає, поки в моделі з'явиться для нього назва, що відбувається в 0.2025.38.
Змінено
- Читач Cobertura тепер несе діалект:
<coverage line-rate=…> — це родина, а не один формат, і те, який діалект читається, супроводжує розбір, а не вгадується для кожного елемента.
0.2025.31 — Ada, Swift і покриття, яке перезавантажується саме
2024-11-07
Додано
- GNATcoverage XML — нарешті Ada. Команди авіоніки DO-178C та залізничні команди EN 50128 — саме та аудиторія, для якої створювалися зважений за безпекою бал і підтримка MC/DC у цьому продукті, і досі вони не могли завантажити тут нічого, якщо їхній
gnatcov не був достатньо новим, щоб видавати ще й Cobertura, яка відкидає все, що нижче рядка. gnatcov coverage --annotate=xml записує каталог, а не файл: завантажуйте файли *.xml для кожного джерела — відкриття index.xml підкаже, де насправді лежить покриття, замість незрозумілої помилки. Частково покритий рядок лишається покритим рядком із непокритим рішенням: нестача видно в покритті гілок і MC/DC, там, де їй і місце. Ділянки звільнення стають виключеними рядками, невизначене зобов’язання рахується як непокрите, а не покрите, а з --level=stmt+mcdc MC/DC рахується на умову й живить поріг та композитний бал.
- BullseyeCoverage та Visual Studio
.coveragexml. Bullseye — комерційний інструмент для C/C++, який справді мають вбудовані та критичні до безпеки команди; запустіть його власний covxml і завантажте результат. Його головна метрика — покриття умов/рішень, а не рядків, і тут ці дві речі лишаються окремими; крім того, зонд з одним результатом оцінюється з одного, а не з двох, тож повністю протестований switch не показується наполовину покритим. .coveragexml із Visual Studio завершує .NET для команд на MSTest і vstest замість Coverlet: спершу перетворіть двійковий .coverage командою dotnet-coverage convert. Частково покриті рядки переживають цей шлях в обох випадках.
- Загальне покриття SonarQube — і пряма відповідь щодо Xcode. Чотири атрибути на двох елементах, і це важливо, бо майже будь-який інструмент, який не вміє видати жоден з інших форматів, уміє видати цей: проєкт, чий інструмент покриття це розширення ніколи не бачило, тепер має шлях усередину. Це також те, що пише
xcresultparser, і саме так сюди потрапляють проєкти на Swift та Objective-C: сам .xcresult не має парсера, і документація тепер пояснює чому, а не лишає вас здогадуватися — xccov повідомляє відсотки, а не дані по рядках, а архів із даними по рядках читається лише файл за файлом, у документі, який ніколи не називає файл, що його описує.
- Стиснені gzip трасувальні файли завантажуються як є.
gcov --json-format типово пише .gcov.json.gz, тож формат, який рекламувала документація, був тим, який більшість людей насправді не могли завантажити. Розпізнавання йде за «магічними» байтами самого файлу, а не за назвою, тож стиснений звіт, що втратив своє .gz, усе одно працює — і будь-який підтримуваний формат тепер може прийти стисненим, не лише gcov’івський.
- Swift і Objective-C — із власного звіту Xcode.
xcrun xccov view --report --json — єдиний документ покриття, який збірка iOS чи macOS створює без додаткових інструментів. Ви отримуєте відсотки за файлами, лічильники виконань за функціями та CodeLens. Він не містить порядкових даних, і Studio їх не вигадує, тож для цього формату поля залишаються порожніми: вигадана позначка невідрізненна від виміряної. Для порядкового покриття Swift скористайтеся llvm-cov export -format=lcov або slather — обидва вже працювали.
- Coveralls JSON — його пишуть репортери для Elixir, Ruby, Python, Rust, Go та JavaScript. Він порядковий, тож позначки працюють.
- Активні дні, спрацювання порогів і ліцензія, до якої належить зведення — три доповнення до щомісячного зведення використання, для встановлень, які увімкнули телеметрію.
Вилучено
- Ім'я комп'ютера більше не надсилається.
hostname був у базовому наборі телеметрії від самого початку — поза будь-якими перевірками, надсилався всіма, хто мав увімкнену телеметрію. Ім'я комп'ютера дуже часто є іменем людини, номером робочого місця або проєктом клієнта, і воно не відповідало на жодне питання про використання краще, ніж операційна система. Тепер встановлення визначається лише випадковим ідентифікатором встановлення. Відтепер ніщо, що називає вас або вашу машину, її не залишає: ні ім'я комп'ютера, ні ім'я користувача ОС, ні домашній каталог, ні мережеві інтерфейси, ні шляхи до файлів, ні назва теки проєкту, ні мітка облікового запису. Лишаються операційна система, її версія та архітектура — який тип машини, а не яка саме.
- Телеметрія тепер видаляється щонайпізніше за 90 днів, тоді як політика раніше казала лише, що дані “зберігаються, доки вони корисні”, а це взагалі не строк.
Змінено
- Платна ліцензія тепер перезавантажує покриття сама. Стеження за файлом покриття завжди означало запитання «виявлено нове покриття, завантажити?» після кожної збірки, на будь-якому рівні — запитання з єдиною розумною відповіддю, поставлене кілька разів на годину. Тепер цей запит — поведінка безкоштовного рівня Community; платна ліцензія просто завантажує. Community зберігає стеження, виявлення та запит, які завжди мав.
- Невідповідний файл називається разом із перевіркою, що це довела, на платній ліцензії. Виявлення не обмежене й не буде: сказати людині, що її покриття більше не описує її файл, — не те, що їй продають. Community і далі отримує висновок, і рядок і далі приглушується. Платна ліцензія додає вказівку: позначку, значок у провіднику та рядок, функцію чи контрольну суму за цим.
- Телеметрія надсилає менше й каже, кому належить. Місячне зведення більше не містить шляхів до файлів, назви теки вашого проєкту чи мітки облікового запису. Обмін можливостей на телеметрію тепер запитує адресу електронної пошти, щоб тому, хто погодився, можна було розповісти, що надсилає його інсталяція, і видалити це на запит.
- Виправлено три описи налаштувань.
watch.enabled, staleWarning.enabled і telemetry.enabled розійшлися з тим, що робить код — найбільше telemetry.enabled: він описував надсилання значно більшого обсягу, ніж надсилається насправді.
Виправлено
- Вибір файлу більше не ховає формати, які вміє читати. «Pick Coverage File» фільтрував лише
info, json і xml, тож coverage.out з Go і .gcov.json.gz з gcov — обидва формати, які це розширення читає, — були неактивні саме в тому діалозі, що просить обрати файл.
- Звичайна інсталяція Community більше не надсилає сторінку свого вихідного коду. Перевірка, що захищала зразок розміченого коду, вважала будь-яку інсталяцію Community такою, що прийняла телеметричний обмін, а не лише ті, які його справді прийняли.
- Одне попередження на завантаження замість двох — файл, який більше не відповідає своєму покриттю, майже завжди був також змінений після запуску, і кожне повідомлялося окремо.
- Видалення більше не повідомляє ім'я користувача ОС і домашній каталог того, чия ліцензія це забороняє.
0.2025.30 · збірка 3 — Те, що ваша збірка вже записує
2024-10-18
Додано
- Профілі покриття Go.
go test -coverprofile — єдиний вивід покриття, який створює стандартний інструментарій Go: немає lcov, на який можна було б спертися, як у Rust, Dart чи Elixir, тож проєкт на Go не мав нічого, що це розширення могло б прочитати. Профіль записує блоки, а не рядки, і кожен рядок, який охоплює блок, отримує його лічильник — разом із закривальною дужкою, — точно так, як їх підсвічує go tool cover -html. coverage.out додано до резервних імен пошуку, тож проєкт на Go без жодного налаштування знаходить свій профіль так само, як проєкт на C знаходить lcov.info.
- Clover XML і OpenCover XML. Clover — це те, що насправді мають проєкти на PHP:
php-code-coverage може видавати Cobertura, але Clover є типовим і саме його налаштовує майже кожен phpunit.xml, тож покриття PHP тут неможливо було прочитати, поки поруч чекав парсер Cobertura на вивід, який майже ніхто не створює. Репортер clover в Istanbul пише той самий документ, тож проєкт на Jest із такою конфігурацією теж охоплено. OpenCover — відповідник для .NET: C# і VB.NET уже надходили як Cobertura, яка згортає рішення в рядок condition-coverage="50% (1/2)", тож те, яка гілка виконалася, зникало ще до парсера. OpenCover зберігає лічильник відвідувань для кожної гілки — різниця між «половина розгалуження покрита» і знанням, яка саме половина.
- JSON від coverage.py і JSON від gcov/gcovr. Експорти coverage.py у Cobertura та lcov змушені називати рядок із
# pragma: no cover або покритим, або пропущеним, бо не мають слова для «навмисно виключено», — а це розширення таке слово має, той самий прапорець, який ставлять його маркери LCOV_EXCL. Тож прагми проєкту на Python тепер означають тут те саме, що й у власному звіті coverage.py. Покриття GCC, своєю чергою, надходило лише після проходу через lcov або gcovr -x — запуск другого інструмента, щоб перетворити дані, які GCC уже створив. gcov --json-format --stdout і gcovr --json видають майже однакові документи, і один парсер тепер читає обидва.
Виправлено
- Коментарі читаються мовою, якою написано файл. Сканер некодових рядків було написано для C і застосовано до кожного файлу, що було правильно, доки кожен формат, який читало це розширення, описував мову родини C. Більше ні: сканер C, натрапивши на
# don't, бачить, що апостроф відкриває рядок, ніколи не бачить його закриття — і рахує рядок коментаря як код. Число тихо трохи хибне, і ніщо про це не повідомляє. Тепер це # для Python, Ruby, shell, Perl, R, Elixir і Julia; усі три форми для PHP, який приймає всі три; і // з /* */ для решти, що залишається типовим для невідомого розширення — #define є кодом, і виключати його було б хибно у зворотний бік.
0.2025.29 · збірка 4 — Кожен параметр із поясненням
2024-10-15
Додано
- Тепер у цій панелі є місце для кожного параметра
fuciniCoverage.*, а не лише для тринадцяти параметрів відповідності. Усі п'ятдесят п'ять згруповані в ті самі розділи й у тому самому порядку, що й опублікований довідник параметрів, тож сторінка, з якої ви налаштовуєте, і сторінка, яку ви читаєте, однаково визначають, де живе параметр. Поле пошуку фільтрує за назвою, ключем або описом; список переходів переміщує між розділами. Форма будується з власного маніфесту розширення під час роботи — типи, типові значення, межі, переліки й кожне слово тексту — тож нічого про параметр не записано двічі, і панель не може розійтися з розширенням, яке вона редагує.
- Описи дотримуються мови, яку ви закріпили. VS Code визначає локалізацію маніфесту з мови інтерфейсу редактора під час завантаження розширення й не дає змоги перевизначити це для окремого розширення — тому
fuciniCoverage.language зі значенням «німецька» в англійському редакторі перекладав усе, окрім параметрів. Оскільки панель читає й розв'язує ці файли сама, вона є єдиним місцем, яке може шанувати це закріплення.
- Елементи керування, яких схема JSON попросити не може. Ніщо у схемі параметрів не позначає рядок як шлях, тож рідний інтерфейс не може запропонувати вибір теки; три параметри, що містять каталог, тепер мають кнопку Огляд….
coverageFile.paths і pathRemap отримали справжні редактори списків замість необробленого поля JSON, а кожен колір colorScale — зразок кольору поруч із шістнадцятковим значенням.
Змінено
- Збереження записує те, що ви змінили, і нічого більше. За тринадцяти параметрів навряд чи мало значення, що «Зберегти» записувало всі тринадцять; за п'ятдесяти п'яти це означало б, що одна правка вписує весь простір імен у
settings.json, у якому було два рядки. Записуються лише параметри, значення яких справді змінилося, а значення, що дорівнює типовому, прибирає перевизначення, а не повторює те, що розширення й так постачає.
- Ключ ліцензії завжди потрапляє до ваших параметрів користувача, і рядок про це каже.
license.key оголошено з областю застосунку, тобто VS Code читає його лише звідти — запис у робочу область виглядає як успішне збереження й не змінює нічого. Скинути тепер очищає всі п'ятдесят п'ять ключів у вибраній області, а не тринадцять, тож спершу запитує підтвердження. І правка ззовні більше не коштує вам місця: сторінка порівнює перед перемальовуванням, тож натискання «Зберегти» більше не прокручує п'ятдесят п'ять рядків до початку.
0.2025.28 · збірка 3 — Тринадцять рядків, одне рішення
2024-10-12
Додано
- Режим відповідності, сім критеріїв за пороговими значеннями та шість ваг складеної оцінки тепер мають один редактор. В інтерфейсі параметрів це тринадцять не пов'язаних між собою рядків, а на практиці — одне рішення: порогове значення нічого не робить, поки чинний режим його не враховує, а вага нічого не робить, поки вирішує не зважений критерій. Fucini Coverage: Configure Coverage Compliance & Thresholds... — кнопка з шестірнею на панелі заголовка подання Coverage — об'єднує ці три речі, пояснює кожен режим там, де режим і обирають, і називає способи налаштувати критерій так, щоб він нічого не перевіряв — строгий режим без жодного порогового значення за метриками, зважений режим із пороговим значенням
0, ваги, що всі дорівнюють 0 — як попередження, просто перед вашими очима.
- Він показує вердикт наперед і записує через VS Code. COMPLIANT / NON-COMPLIANT, який дала б незбережена форма для завантаженого виконання, обчислює власний механізм відповідності розширення, а не друга копія правил: попередній перегляд, який може суперечити критерію, гірший за його відсутність. Зміни йдуть через звичайний API конфігурації у
settings.json — користувача або робочої області, на ваш вибір, — тож VS Code форматує файл і зберігає його коментарі; зміна, зроблена вручну або в іншому вікні, повертається до відкритої форми, незалежно від того, чи завантажено виконання. Ліцензія не потрібна: Community отримує той самий редактор, що й Pro.
Виправлено
- Кнопка сповіщення про оновлення показувала
Download && Install. Подвоєний амперсанд — це екранування мнемоніки, доречне в заголовках package.json та в модальних діалогах, але кнопки дій у сповіщенні беруть свій підпис як звичайний текст, тож обидва символи виводилися саме так, як були написані, у всіх 17 локалях, для кожного, кому пропонували оновлення.
0.2025.27 · збірка 7 — Обмін, на який ви погоджуєтеся самі
2024-09-30
Змінено
- Телеметрію вимкнено за замовчуванням. Вона постачалася увімкненою, виходячи з міркування, що оцінювальний період потребує цих даних. Це міркування перестало діяти, щойно рівень Community зробив увімкнення телеметрії тим, що безкоштовно розблоковує всі можливості Pro: обмін щось означає лише тоді, коли людина його робить сама, а обмін, на який ніхто не погоджувався, — не обмін. Нічого не надсилається, доки ви її не ввімкнете, і Community у будь-якому разі працює далі зі своїм стандартним набором можливостей.
- Параметр телеметрії каже, для чого він, а решту дає за посиланням. Його опис раніше перелічував кожне поле, яке несе пінг, тобто існували дві копії цього переліку — одна в параметрі, одна в політиці конфіденційності, — які мали залишатися однаковими назавжди і не залишалися. Тепер він каже, що дає ввімкнення, і посилається на політику конфіденційності по перелік полів: один перелік, який треба тримати правдивим, замість двох.
- Встановлення цього випуску одноразово поновлює ваш період оцінювання. Кожен, чий пробний період уже вичерпався, отримує нові 14 днів, бо цей випуск змінює умови, за яких відбувалося оцінювання: пробний період, проведений з увімкненою за замовчуванням телеметрією, не був пробним періодом продукту, який пропонують тепер. Це навмисно прив'язано до одноразового токена, а не до версії — скидання на кожному випуску означало б, що пробний період ніколи не завершується для тих, хто оновлюється, а це не пробний період, а безкоштовна ліцензія з зайвими кроками. Токен витрачається під час першої активації, після чого повертаються звичайні правила. Платної ліцензії це не торкається, бо перевірка ключа завершується ще до того, як узагалі береться до уваги пробний період, а Community не зачеплено, бо в цій редакції немає пробного періоду, який можна було б поновити.
- Ліцензійний ключ більше не коштує анкети. Підказки активації, параметр ліцензійного ключа та діалог після завершення пробного періоду — усі подавали ключ як щось, що видається в обмін на відповіді на запитання. Це не так: ключ видається автоматично на запит, а анкета зворотного зв'язку є добровільною і цілком окремою.
Виправлено
- Три місця досі обіцяли пробний період «до 2026-12-31». Такої дати ніколи не було в продукті — пробний період триває 14 днів, відлічуваних для кожної інсталяції від першого використання. Два попередні випуски виловили це твердження в описах параметрів і в README; воно вціліло у виносці про оцінювання на цій самій сторінці, у Посібнику користувача та в README ліцензійного інструментарію. Посібник користувача був найгіршим із трьох: там ішлося, що вікно діє «для кожної інсталяції, у всьому світі, одночасно (а не як відлік для кожної інсталяції)», що є точною протилежністю, і що відображення покриття призупиняється після завершення пробного періоду, тоді як насправді розширення переходить на безкоштовний рівень Community.
- Листи-сповіщення телеметрії надсилалися з хибного домену. Заголовок
From: був поштовою скринькою на fucini.consulting, тоді як сервер, який їх надсилає, — fucini.software: саме та відповідність, про яку попереджає власний коментар до параметра, і надійний спосіб отримати листи у спамі або відхиленими одразу.
0.2025.26 · збірка 2 — Сірим, а не зникло
2024-08-27
Змінено
- Файл, який звіт називає, але якого немає на диску, показується там, де йому належить — сірим і з поясненням. Версія 0.2025.25 перестала вигадувати місця для таких файлів, і слушно, але лишала їм відносний шлях, який узагалі не є місцем — тож дерево й далі робило проєкт із його першого сегмента, а три видалені джерела підмодуля сиділи в примарному
app поруч із підмодулем, з якого насправді походили. Невідповідність було видно, у цьому й був сенс, але видно було не там, де треба, і вона нічого не казала про те, що саме не так.
- Тепер він з'являється в проєкті, з якого його виміряно, у теці, куди його ставить звіт — намальований середньо-сірим кольором теми та курсивом замість звичайного кольору тексту. При наведенні показується шлях, який він мав би, і пояснення, що там нічого немає — найімовірніше, перейменовано або видалено після створення звіту — і що його числа й далі враховуються. Нічого не відкидається й жоден підсумок не зсувається: рядок — це власне свідчення звіту, а сірий колір — те, що не дає йому читатися як рядок, який відкривається.
- Здогад лишається всередині подання. Записаний шлях файлу — і далі точно те, що сказав звіт, бо все інше індексується за ним: збагачення зовнішнього звіту звіряється з ним, телеметрія робить його відносним, анотоване подання його відкриває — і дати їм припущене місце означало б проміняти відоме на вигадане. Лише дерево поєднує одне з одним, і лише для шляху, який не називає власного місця: абсолютний шлях, якого просто немає, зберігає те, що сказав звіт, і сіріє там, де стоїть.
0.2025.25 · збірка 4 — Де це виміряно
2024-08-07
Виправлено
- Покриття підмодуля потрапляє туди, де підмодуль справді є, і його рядки відкриваються. Git-підмодуль будує власний звіт поруч із власним деревом, а gcovr пише в ньому
<source>.</source> — «каталог, у якому лежить цей файл» — з іменами на кшталт app/Application.cpp нижче. Ніщо не прив'язувало цю . ні до чого: шляхи розв'язувалися один раз, після злиття, коли запуск уже не знав, з якого входу походить кожен файл, тож єдиною базою лишався корінь робочої області. Спроба <workspace>/app/Application.cpp нічого не знаходила, кожен шлях лишався відносним, а подання покриття малювало їх як проєкт із назвою app — за першим сегментом шляху, який ніколи не був місцем — де кожен рядок копіював і відкривав туди, де файлу не було.
- Шляхи тепер розв'язуються для кожного файлу трасування, до злиття. Відносний
sourceRoot прив'язується до каталогу, у якому лежить його файл трасування, тож . поруч із coverage.xml підмодуля означає саме цей підмодуль. Якщо це не знаходить джерел, пошук іде вгору від файлу трасування — звичайне компонування CMake пише покриття на кілька рівнів углиб build/, а який із двох варіантів використовує проєкт, у звіті не записано ніде, тож відповідає файлова система, а не конфігурація. Підйом зупиняється на корені робочої області: далі голий src/main.c міг би розв'язатися в сусідньому checkout із таким самим компонуванням — хибна відповідь, що має вигляд правильної. Шлях, уже абсолютний і наявний, лишається як був, тож звичайні запуски lcov не змінюються.
- Підмодуль лишається власним проєктом у поданні покриття. Файли, що тепер розв'язуються всередині робочої області, інакше потрапили б у її дерево — теки підмодуля перепліталися б із батьківськими, а його числа додалися б до батьківського підсумку, наче одну кодову базу виміряли двічі. Кожен файл запам'ятовує корінь, з якого його виміряно, і подання групує за ним, тож підмодуль зберігає власний заголовок і власні підсумки, хоч і лежить у відкритій теці. Запуск із уже абсолютними шляхами такого кореня не має і групується точно як раніше.
- Файл, який звіт називає, але якого вже немає, і далі повідомляється як відсутній. Йому не дають правдоподібного шляху, за яким його немає: звіт, що називає вже видалені файли, — застарілий звіт, а малювання їх у вигаданих місцях це приховало б. Кожен названо в каналі виводу під
FUCINI_REMAP_001, разом зі шляхом, який він мав би.
0.2025.24 · збірка 3 — Чому ваше місце зникло
2024-07-27
Змінено
- Місце, що зникає, тепер повідомляє чому. Кожне відкликання показувало той самий рядок — ваше місце в цьому плані більше не активне — і це читається як звинувачення, адресоване не тій людині. Командна підписка, зменшена нижче кількості використовуваних місць, тепер вивільняє надлишок після пільгового періоду, і той, хто втрачає місце, не зробив нічого, крім того, що найдовше ним не користувався. Там, де сервер ліцензування має що сказати корисного, розширення це говорить: місце, вивільнене задля зменшеної підписки, пояснює саме це й вказує на того, хто керує підпискою, і кнопка Запросити новий ключ залишається — бо шлях назад справжній: у пулі з'явиться місце, щойно ця людина його звільнить.
- Завершена підписка не пропонує кнопки. З простроченої підписки новий ключ видати неможливо, тож єдина дія в тому сповіщенні могла лише зазнати невдачі — і це читається як зламане розширення, а не як завершена підписка. Тепер воно повідомляє, що сталося, і на цьому спиняється. Будь-яка причина, невідома цій збірці, зберігає загальне формулювання: сервер ліцензування розгортається безперервно, а встановлене розширення — ні, тож зустріти незнайому причину є звичайною річчю, а не винятком; ідентифікатор у сирому вигляді ніколи не показується, і мовчання ніколи не настає. Обидва нові повідомлення перекладено всіма сімнадцятьма мовами.
0.2025.23 · збірка 5 — За межі розширення
2024-07-17
Додано
- Запуск нарешті може вийти назовні — ще в шести форматах. Досі виходів було два: Fucini JSON, який не читає нічого, крім самого розширення, і HTML-звіт, який машинно не читає ніщо. Export Coverage Report... відкриває вибір формату й записує активний запуск як CSV за файлами (покрито/усього/відсоток для рядків, гілок, функцій, MC/DC, регіонів та інстанціювань, найгірші спершу, з рядком
TOTAL), як CSV за функціями (кількість викликів, чи виконувалася, непокриті гілки всередині, пари MC/DC), як зведення у Markdown для вставлення в пул-реквест, як файл трасування LCOV, XML Cobertura, SARIF або як автономний значок SVG для README. Він є в палітрі команд, у заголовку подання Covered Files поруч із Generate Full HTML Report і у швидкому меню рядка стану, щойно ввімкнено quickActions.exportReport.
- Тепер це конвертер, а не лише переглядач. Розширення вже читає lcov, llvm-cov JSON, Cobertura, JaCoCo, Istanbul/nyc і SimpleCov; із записом LCOV та Cobertura воно вміє й зворотний шлях. Завантажте звіт JaCoCo або кілька звітів, злитих в один запуск, і видайте той єдиний файл трасування, який приймають genhtml, Codecov, Coveralls і SonarQube — або XML, який Jenkins, GitLab та Azure DevOps зчитують напряму. Обидва проходять назад через власні парсери розширення, а діапазони рядків розгортаються порядково, щоб записані
LF/LH збігалися з відсотком на екрані, а не наближали його.
- Кожен запис каже, що він відкидає. Усе, крім CSV, втрачає дані, і мовчки: MC/DC, регіони коду та інстанціювання C++ не мають подання в LCOV, Cobertura чи SARIF, а Cobertura фіксує, скільки умов рядка покрито, а не яку гілку. Fucini JSON і два CSV лишаються форматами, що несуть усе виміряне. У CSV метрика, якої запуск не має, лишає свої комірки порожніми, а не нульовими — порожня комірка каже «цей інструмент не повідомив даних про гілки», а
0 сказала б «жодної гілки не пройдено», і згодом електронна таблиця їх уже не розрізнить. Усе, що таблиця інакше виконала б як формулу — поле, що починається з =, +, - чи @, тобто будь-який npm-шлях із областю — береться в лапки й знешкоджується перед записом.
- SARIF анотує дифф; значок не потребує мережі. Непокриті діапазони повідомляються на рівні
note, а не warning: непокритий код каже щось про набір тестів, а сканування коду трактує попередження як те, що має блокувати — брамою, що блокує, лишається Check Coverage Thresholds. Значок малюється тут, а не завантажується з shields.io, тож працює й у відрізаному чи локальному репозиторії, а колір бере з тієї самої colorScale, що й поля та рядок стану. У безкоштовному виданні Community вибір відкривається й обидва CSV працюють, з обмеженням 20 експортів на день, як Export Fucini JSON; формати обміну — платні, за тією самою межею, яку це видання завжди проводило: читати власні числа безкоштовно, живити конвеєр CI — ні.
0.2025.22 · збірка 3 — Нічого вимірювати
2024-06-24
Виправлено
- Файл, у якому нема чого інструментувати, більше не показується як покритий на 100 %. Заголовок з самими оголошеннями — прототипи, макрос, захист від повторного включення — не має тіл функцій, тож компілятор не видає для нього даних покриття, а все, що ділить нуль на нуль, відповідає «100 %». Він стояв у дереві зеленим, поряд із кодом, який справді тестували. Обидва читачі тепер беруть власні підсумки інструмента як звіт файлу про себе —
LF/FNF/BRF у lcov, блок summary у JSON llvm-cov — і файл, усі підсумки якого дорівнюють нулю, лишається поза прогоном, а не отримує оцінку. Порядкові записи під цими підсумками навмисно не враховуються: розгортання макроса приписується рядку, що його визначає, тоді як лічильник належить рядку, що його використовує, в іншому файлі, і саме цей позичений рядок був єдиною причиною, чому такий заголовок виглядав виміряним. Підсумки прогону також його втрачають, тож головна цифра стала трохи нижчою і значно чеснішою. Кожен вилучений шлях названо в каналі виводу, а звіт, де всі файли — самі оголошення, зберігає їх усі.
Змінено
- Вибір файлу покриття додається до вже завантаженого, а не замінює його. Збірка, що пише по звіту на модуль, не має єдиного файлу для закріплення, а вибір звіту другого модуля мовчки вивантажував перший. Діалог тепер приймає кілька файлів одразу, кожен вибір додається до набору, і все вибране об’єднується в один прогон — у панелі він малюється під власною назвою кожного проєкту. Спостереження охоплює всі файли, і перезібраний звіт більше не прибирає решту з екрана. Show Loaded Coverage Files завершується пунктом Вивантажити вибрані файли, який повертає до звичайного пошуку.
- Підтримка має адресу у власному домені продукту:
support@fucini.software. Там, де активація не може завершитися сама, панель ліцензії та повідомлення з кодом запиту давали адресу fucini.consulting — домен, відмінний від усіх інших посилань розширення, що читається як інша компанія. license@fucini.software не змінюється: звідти надходять ключі, це не скринька для листів.
0.2025.21 — Чий це src
2024-06-21
Додано
- Кожне дерево в поданні Coverage тепер каже, до якого проєкту воно належить. У 0.2025.19 об'єднаний запуск отримав по іменованому блоку на проєкт, але звичайний запуск і далі малював голе дерево — тож робоча область, обрізана до власної теки, відкривалася на
src, і ніщо над ним не казало, який саме це src. Тепер кожне дерево несе свій корінь: теки, що ведуть до проєкту, — приглушеним кольором, а власна тека проєкту після них — на повну. Дерево, обрізане до теки робочої області, все одно каже, до чого саме його обрізано, а дві бази коду, об'єднані в один запуск, ніколи не читаються як одне дерево. Це заголовок, а не рядок — розгортати там нічого, і теки під ним згортаються рівно так, як і раніше. У вузькій панелі першими скорочуються провідні каталоги, тож тека, яка власне називає проєкт, зникає останньою, а наведення показує весь шлях.
0.2025.20 · збірка 7 — Меню, на яке ви очікували
2024-06-08
Додано
- Рядки подання Coverage мають те саме контекстне меню, що й провідник. Клацання правою кнопкою по файлу чи теці раніше відкривало «Вирізати/Копіювати/Вставити» самого вебпанелі — три пункти, яким не було над чим працювати. Тепер відкривається справжнє меню VS Code: Відкрити, Open to the Side, Відкрити за допомогою…, Reveal in Explorer View, Reveal in File Explorer, Open in Integrated Terminal, Знайти в папці… для теки, а також Copy Path / Copy Relative Path — із варіантами з прямими скісними рисками поруч у Windows, де ці дві форми різняться. Кнопка
⋯ та її меню не змінилися й лишаються останнім пунктом нового меню.
Змінено
- Метрика, даних для якої немає у вашому файлі покриття, більше не оцінюється. Поріг для MC/DC за відсутності MC/DC у збірці зараховувався як невдача — тож файл зі 100% за кожною метрикою, яку збірка справді виміряла, отримував картку «виконано 3 з 5» проти планки, яку ніщо в цьому файлі покриття не могло подолати. Метрики без даних тепер пропускаються всюди, де формується вердикт: у рядку стану для файлу, у загальній картці запуску, у банері анотованого коду та у HTML-звіті. Check Coverage Thresholds й далі прямо називає відсутню метрику — саме там цьому місце.
- Файли, у яких нема чого вимірювати, більше не показуються в поданні Coverage. Заголовок з оголошеннями, файл із самими реекспортами, модуль лише з типами: жоден написаний вами тест не змінить їхнє число, а після відкриття не буде показано жодної метрики. У 0.2025.19 вони мали риску; тепер їх просто немає в списку, а разом із ними зникають і теки, що залишилися порожніми. Запуск, у якому нічого не можна виміряти, показує все як і раніше.
Виправлено
- Літера диска все ще могла очолювати дерево. Для покриття, шляхи якого не належать відкритій робочій теці — об’єднаний файл покриття з іншого проєкту або вікно без відкритої теки — дерево починалося з
W:, а в Linux і macOS — із рядка взагалі без назви: один рядок з єдиним нащадком, який нема сенсу розгортати. Тепер корінь файлової системи не малюється ніколи, хай яким буде шлях, а кожен рядок і далі несе свій справжній абсолютний шлях для меню та редактора.
0.2025.19 · збірка 6 — Шляхи, а не преамбула
2024-05-16
Додано
- Меню рядка для кожного файлу та теки в поданні Coverage. Кнопка в кінці рядка копіює цей шлях у будь-якій із чотирьох форм, які можуть знадобитися редактору, оболонці чи запиту до ШІ — абсолютний або відносний до робочої області, з рідними роздільниками чи прямими скісними рисками — і пропонує Reveal in File Explorer та Open in Integrated Terminal, причому для файлу термінал відкривається в його власній теці. Варіанти з прямими скісними рисками показуються лише там, де вони відрізняються від рідної форми, тож у Linux і macOS меню на два пункти коротше. Раніше скопіювати шлях означало вдруге знайти той самий файл у Провіднику.
- Кнопки «згорнути все» та «розгорнути все» над деревом. Згорнути все, а потім відкрити єдину потрібну теку — найшвидший шлях крізь велике дерево, а раніше це коштувало по одному кліку на теку. Згорнуте в такий спосіб запам’ятовується так само, як тека, закрита вручну, тож перезавантаження цього не скасує.
- Об’єднаний запуск, що охоплює кілька проєктів, тепер малює кожен проєкт окремо, під його власною назвою. Раніше об’єднання трейсфайлу з другої кодової бази вішало його теки на те саме дерево, що й теки робочої області, тож
src з’являвся двічі без жодного пояснення, а каталоги двох проєктів перемішувалися за абеткою. Тепер кожен проєкт отримує власний іменований блок, відокремлений рискою, і першим іде проєкт робочої області. Запуск, що охоплює лише один проєкт, не змінився й не має заголовка — його не було б із чим порівнювати.
Виправлено
- Файл, у якому немає нічого виконуваного, показувався як покритий на 0%. Модуль, що складається лише з реекспортів
export * або тільки з оголошень типів, компілюється в те, що інструмент покриття виміряти не може, — тож у трейсфайлі для нього немає жодної інструкції. Подання Coverage оцінювало це в 0% і ставило файл у червоне поруч із кодом, який справді не протестований, хоча написати для нього тест ніхто не може; водночас Провідник позначав той самий файл зеленими 100%, бо нульовий загальний підсумок читається як «покрито все з нічого». Жодне з цих чисел не було правдивим, і жодне більше не показується: рядок панелі отримує риску й пунктирний контур із підказкою, чому саме, а значок у Провіднику не ставиться взагалі. Тека, у якій лише такі файли, теж лишається без оцінки. Файл, у якому 0% чогось справді виміряного, як і раніше показує 0% — риска означає «немає чого вимірювати», а не «виміряно й не покрито». - Рядки з об’єднаного проєкту вказували не туди. Їхні шляхи будувалися від кореня робочої області, а не від власного, тож для файлу за межами робочої області меню рядка копіювало — а «Reveal in File Explorer» відкривало — шлях, за яким файлу ніколи не було. Тепер вони несуть той корінь, з якого справді походять.
Змінено
- Подання Coverage більше не малює корінь робочої області. Дерево починалося від кореня файлової системи й спускалося крізь усі теки над проєктом — диск, потім теку з вашими проєктами, потім сам проєкт — і лише тоді доходило до першої теки, яка справді була вашою. Це кілька рівнів відступу в кожному рядку, що повторювали те, що вже написано в заголовку вікна. Тепер шляхи починаються з теки робочої області. Повний абсолютний шлях, як і раніше, копіює меню рядка, і саме його відкриває редактор.
0.2025.18 · збірка 4 — Залишається там, де ви його лишили
2024-04-30
Виправлено
- Теки, які ви згорнули в поданні Coverage, знову розгорталися після кожного перезавантаження. Відстеження ввімкнене типово, тож збірка, яка заново генерує покриття, перемальовує панель — а оскільки кожна тека малювалася розгорнутою, згорнута тека лишалася такою лише до наступної збірки. На великому дереві це означало робити ту саму роботу кілька разів на годину. Тепер панель пам’ятає, які теки ви закрили, і залишає їх закритими. Каталог, що вперше з’являється в пізнішому запуску, як і раніше показується розгорнутим, як будь-який інший: запам’ятовується саме свідома дія закриття, а не типовий стан.
- Вимкнення телеметрії не зупиняло пінг про видалення. Цей пінг надсилає невеликий окремий скрипт, який VS Code запускає, коли ви видаляєте розширення. Він не має доступу до API VS Code і не може прочитати ваші налаштування, тож єдине, що вказує йому нічого не надсилати, — це відсутність файлу, який розширення записує, поки телеметрію ввімкнено, а цей файл ніколи не видалявся, коли ви вимикали телеметрію. Будь-хто, хто її вмикав, а потім вимкнув, під час видалення все одно надіслав би своє ім’я користувача ОС, ім’я хоста й домашній каталог. Тепер файл видаляється щойно телеметрію вимкнено.
- Поновлення Pro могло повідомити про успіх для ключа, який ви щойно замінили. Тихе поновлення читало налаштований ключ двічі: спершу щоб вирішити, чи поновлювати, а потім ще раз — щоб вирішити, чи щось повідомляти. Якщо під час поновлення вставити новий ключ, друге читання бачило інший ключ, і повідомлення «вашу підписку Pro поновлено» описувало вже замінений. Тепер ключ читається один раз.
Змінено
- Кожен модуль розширення тепер покрито власними тестами. Для інструмента, чия вся робота — показувати, до чого насправді дістаються ваші тести, це здавалося вартим того, щоб зробити як слід: 53 з 54 вихідних файлів мають 100% за інструкціями, гілками, функціями та рядками, а останній — шар зв’язку з VS Code — 95% за функціями. Написання тестів виявило описані вище вади, а також два з лишком десятки перевірок, які ніколи не могли спрацювати: запасні шляхи за умовами, що вже їх виключили, — вони виглядали як страхувальні сітки, але нічого не ловили. Їх прибрано, а не прикрито тестом, який не міг би впасти.
0.2025.17 — Запитано в момент, коли варто відповісти
2024-04-27
Змінено
- Необовʼязкове опитування тепер чекає, доки ви справді скористаєтеся розширенням, і питає у слушніший момент. Раніше воно рахувало календарні дні від встановлення, тобто вимірювало, як давно ви це встановили, а не чи бачили ви його в роботі — тож установку, до якої місяць не торкалися, просили оцінити продукт, який їй нічого не показав. Тепер потрібні реальні завантаження покриття, а не лише час, і воно більше не зʼявляється під час запуску редактора: чекає на успішне завантаження покриття. Через рік буде третє й останнє запрошення, бо два в межах одного кварталу назавжди виключали кожного, хто саме тоді був зайнятий.
- Нідерландський переклад більше не формальний. Він усюди звертався на «u», що для інструменту розробника звучить сухо й не відповідало решті голосу продукту. Тепер усі нідерландські рядки використовують «je» — переписані речення за реченням, бо зміна тягне за собою й дієслівні форми.
0.2025.16 — Код, а не компанія
2024-04-23
Змінено
- Форма активації просила «company code» у розробників-одинаків. Купуючи Pro чи Pro Plus самостійно, ви отримуєте код зі своєї ж підписки — жодної компанії за ним немає, а запит про неї наштовхує на думку, що ви не на тій формі. Тепер це поле називається Subscription code для Pro і Pro Plus та лишається Company code для Business та Enterprise, де команда справді має спільний код. Підказки під ним уже були написані для кожного плану окремо; загальною лишалася тільки назва поля.
0.2025.15 · збірка 3 — Оцінка за тим, що ви задали
2024-03-25
Виправлено
- Згенерований HTML-звіт оцінював ваш код за 100%, хоч би які пороги ви задали. Стовпець «Статус» перевіряв кожну метрику за прихованими 100, тож проєкт, який виставив межі на 80 і досяг їх, бачив зелений банер COMPLIANT прямо над стовпцем червоних хрестиків — для того самого запуску, на тій самій сторінці. Легенда метрик робила те саме. Тепер обидва використовують ваші налаштовані пороги, а там, де поріг не задано, показують приглушене тире замість вигаданого висновку.
- Банер відповідності стверджував більше, ніж перевіряв. Він завжди писав «усі налаштовані пороги досягнуто», зокрема й у типовому режимі, який перевіряє лише зважену оцінку — тож запуск міг стверджувати, що всі пороги досягнуто, тоді як один із них явно не пройдено в таблиці нижче. Тепер кожен режим повідомляє, яке правило справді застосовано.
- README стверджував, що розширення «працює безкоштовно до 2026-12-31». Такої дати в продукті немає. Попередній випуск виправив це твердження в описах налаштувань, але пропустив README — перше, що читають у Marketplace. Тепер там написано, що відбувається насправді: 14-денний пробний період від першого використання, потім безкоштовний рівень Community, і жодної дати, після якої щось припиняє працювати.
0.2025.14 — Щоб їх розрізняти
2024-03-15
Змінено
- Дві редакції більше не виглядають однаково в Marketplace. Pro і Community збираються з одного дерева коду, і досі це стосувалося й піктограми — тож обидві картки були однаковою картинкою з різними підписами, поруч у тих самих результатах пошуку. Тепер кожна редакція має власну: те саме зображення зі кольоровою смугою внизу, бірюзовою для Pro і сірувато-синьою для Community. Слово розрізняє їх, коли піктограма велика; у рядку результатів пошуку слово надто дрібне, тож цю роль бере на себе колір.
0.2025.13 — Доступно там, де ви стоїте
2024-02-26
Виправлено
- Відкриття анотованого перегляду більше не заважає відкрити його знову. Панель анотованого коду — це вебпанель, а не текстовий редактор, тож поки вона у фокусі, розширення не бачило «поточного файлу», і команда Open Annotated Source відповідала «спершу відкрийте файл із завантаженим покриттям» тому, хто саме дивився на анотований перегляд файлу з покриттям. Тепер вона бере файл із панелі, на яку ви дивитеся. Той самий блок тихо пропускав і повторну перевірку, заради якої існує другий запуск: коли налаштовано HTML-звіт llvm-cov, саме повторний виклик перемикає панель на сторінку того звіту — тож якщо збірка покриття завершилася після відкриття панелі, скористатися нею з самої панелі було неможливо.
0.2025.12 · збірка 2 — Говорити правду
2024-02-15
Додано
- Платна підписка Pro тепер поновлюється сама. Кожен ключ активації діє рівно стільки, скільки оплачено. Командні плани отримують поновлений період під час наступної перевірки, але індивідуальний Pro ніколи не звертається до сервера — він працює повністю офлайн, — тож ніщо не приносило йому поновлення, і ключ місячного передплатника закінчувався б щомісяця, хоч би як справно він платив. Тепер розширення тихо запитує новий ключ лише в дні біля власного закінчення і лише коли має код, що підтверджує оплачену підписку. Бути офлайн у цей час нічого не коштує: ключ працює до справжнього закінчення, а наступна спроба після цього його відновлює.
- Активація з листа про покупку — в один клік. Посилання передає розширенню ваш план і код напряму, замість того щоб відкривати VS Code, шукати команду та вставляти код вручну. Перед використанням місця завжди буде запит. Ввести код самотужки й далі можна так само — посилання лише швидший шлях, а не єдиний, — і воно працює також у збірці Community.
Виправлено
- Опис налаштування стверджував, що розширення «безкоштовне до 2026-12-31». Такої дати в продукті немає. Насправді діє 14-денний пробний період від першого використання, після чого розширення переходить на безкоштовний рівень Community. Тепер опис так і каже — усіма мовами.
- Налаштування порогів більше не згадують випуск, у якому змінилися їхні типові значення — номер версії посеред речення відповідає на питання, якого ніхто, читаючи опис налаштування, не ставить.
- Кілька перекладених описів називали команду, якої не показує жоден перекладений VS Code. Вони посилалися на команду активації її англійською назвою, тож усіх, хто працює не англійською, відправляли шукати в палітрі команд рядок, якого там немає.
0.2025.11 · збірка 3 — Рахуємо те, що важливо
2023-12-26
Виправлено
- Проєкт без рішень MC/DC міг показувати 0 % загального покриття. Деякі інструменти повідомляють про розділ MC/DC навіть тоді, коли вимірювати в ньому нічого, і це читалося як «0 % покрито» замість «нема чого покривати». Оскільки загальна оцінка падає до нуля, щойно будь-який показник дорівнює нулю, повністю покритий проєкт міг показувати 0 %. Показник, у якому нема чого вимірювати, більше не входить до оцінки, а його рядок зникає замість того, щоб відображатися як «0 / 0 умов покрито».
- Стан ліцензії тепер перекладено всіма 17 мовами. Він залишався англійською, а оскільки він вбудовується у вже перекладені речення, виходив наполовину перекладений рядок у рядку стану, у сповіщеннях і на панелі покритих файлів.
- Подання «Анотований вихідний код» і спливаючі відомості про покриття теж перекладено — таблиця деталізації відповідності, кнопки навігації з підказками, а також відомості про гілки та MC/DC.
Змінено
- Платну підписку Pro тепер можна активувати власним кодом. У списку планів у запиті ключа з’явився пункт Pro, тож код, який надходить із підпискою Pro, нарешті має куди бути введеним. Індивідуальні ключі Pro так само працюють повністю офлайн і після активації ніколи не звертаються до сервера.
- Піктограма на панелі дій стала більшою та помітнішою поруч із вбудованими піктограмами.
- Перехід на випуск Community тепер встановлює його з fucini.software. Раніше використовувався Marketplace, де випуск Community не опубліковано, тож після перемикання ви могли залишитися зовсім без розширення.
0.2025.10 · збірка 5 — М’якша посадка
2023-12-08
Змінено
- Прострочена підписка тепер переходить на безкоштовний рівень — коли індивідуальний ключ активації вичерпувався, розширення нескінченно просило вас поновити його. Відмова від поновлення — це нормальне завершення підписки, а не помилка, тому тепер воно натомість переходить на постійний безкоштовний рівень Community. Командні плани навмисно не зачіпаються: прострочений ключ Pro Plus, Business або Enterprise, як і раніше, повідомляється як прострочений, адже там поновити його має адміністратор, і тихе переведення всієї компанії на безкоштовний рівень приховало б це.
Виправлено
- Вимкнення телеметрії тепер враховується в усіх випадках. Один шлях у коді міг пропустити цю перевірку, коли був увімкнений внутрішній режим докладної діагностики розширення. Цей режим вимкнений в усіх опублікованих збірках, тож жоден випуск ніколи так не поводився, але тепер перевірка виконується безумовно.
- Налаштування застосовуються негайно, а не після перезавантаження. Зміна переспрямування шляхів, виключення коментарів, фільтрації за git-diff чи підсумків для виключених файлів тепер одразу перезавантажує покриття — особливо переспрямування шляхів, адже саме до цього налаштування ви звертаєтеся тоді, коли шляхи не збігаються.
- «Unlock Full Features» та «Switch to Community» могли зупинитися на півдорозі, не повідомивши про це. Тепер обидві дії виконуються до кінця.
- Ваш ключ активації залишається прив’язаним до того самого ідентифікатора машини. Раніше на деяких конфігураціях цей ідентифікатор міг створюватися заново між сеансами, що робило вже виданий ключ недійсним.
0.2025.9 — Повні переклади
2023-12-02
Додано
- Повні переклади для всіх 17 мов, що постачаються — близько сотні новіших рядків інтерфейсу, зокрема діалоги активації та ліцензування, необов'язкове опитування щодо відгуків, процес розблокування Community та сповіщення про самооновлення, у всіх неанглійських наборах усе ще відкочувалися до англійської. Тепер усі 17 мов охоплюють повний інтерфейс розширення під час роботи.
Змінено
- Наведення ладу в коментарях вихідного коду, документації скриптів збирання та списку файлів для пакування. Набір файлів, що постачаються в розширенні, не змінився; функціональних чи поведінкових змін немає.
0.2025.8 — Редакції більше не конфліктують
2023-11-20
Виправлено
- Встановлення редакцій Pro і Community одночасно могло призводити до збою однієї з них під час запуску — вони реєструють ті самі команди та те саме подання файлів покриття. Тепер це визначається заздалегідь: якщо друга редакція теж встановлена, активація коректно припиняється з повідомленням про потребу видалити одну з них, замість непояснюваного збою активації.
0.2025.7 — Наведення ладу
2023-10-30
Технічний реліз; функціональних змін немає.
0.2024.6 — Рівень Community та плани для команд
2023-10-17
Постійний безкоштовний рівень, плани для команд зі спільним пулом місць і окрема редакція розширення Community.
Додано
- Постійний безкоштовний рівень Community — замість повної зупинки після завершення 14-денного пробного періоду розширення тепер переходить на Community: усі функції, крім MC/DC, обмежена щомісячна проба Full HTML Report і постійних подань Annotated Source, щедрі денні ліміти на кілька автоматизовуваних дій, а все інше — без обмежень.
- Розблокуйте всі функції безкоштовно — нова команда «Unlock Full Features» обмінює докладну телеметрію використання на повний необмежений доступ, оборотно будь-коли. Необов'язкове вбудоване опитування щодо відгуків натомість дає 30-денний ключ з усіма функціями, без жодних умов.
- Плани для команд: Pro Plus, Business та Enterprise — вони використовують спільний пул місць (код компанії плюс кількість місць) замість одного ключа на машину, з фоновою звіркою, яка підтримує права місця в актуальному стані й автоматично позначає відкликане чи скорочене місце.
- Fucini Coverage Studio Community — окрема виділена публікація, зібрана з того самого вихідного коду, у якій код пробного періоду, активації та командних планів справді відсутній, а не просто прихований. Див. сторінку завантаження.
Змінено
- Генерація Full HTML Report і постійні подання Annotated Source (звичайне та поруч) тепер є функціями платних рівнів у базовій версії Community — залишається лише перемикане подання на місці, з попереднім щомісячним лімітом. Розблокування, як і раніше, надає все це.
- Попередження про ліміт використання на рівні Community тепер пропонує обидва шляхи в одному вікні: переглянути платні плани або розблокувати через телеметрію.
Виправлено
- Докладна, потенційно ідентифікаційна телеметрія (ім'я користувача ОС, домашній каталог, характеристики CPU/RAM, мережеві інтерфейси та повний вміст звіту/вихідного коду) тепер може надсилатися лише з рівня Community або за безкоштовного доступу, наданого в обмін на телеметрію, — але ніколи з платною ліцензією Pro/Pro Plus/Business/Enterprise, незалежно від локальних налаштувань телеметрії.
- Встановлення, яке вже працювало на попередній збірці, більше не отримує новий пробний період лише через те, що його оновили, — тепер воно коректно переходить на рівень Community, якщо його попередній пробний період уже вичерпався.
- Сповіщення про оновлення, перебіг завантаження та повідомлення про помилки тепер показують звичайну версію
Major.Year.Minor (ту саму, що показує подання Extensions у VS Code) замість внутрішнього номера збірки, наприклад 0.2024.6 замість 0.2024.6.2.
0.2024.5 — Точно налаштовані ліцензійні ключі
2023-09-03
Ключі активації тепер можуть обмежувати окремі функції незалежно одна від одної, а адміністратори ліцензій можуть вручну видати точно налаштований ключ із панелі керування.
Додано
- Ліміти використання для кожної функції — ключі активації тепер можуть обмежувати кожну функцію/дію незалежно (наприклад, експорт HTML-звітів — 1 на місяць) замість одного спільного ліміту на завантаження покриття. Наявні ключі продовжують працювати без змін.
- Ручна видача ключів — адміністратори ліцензій тепер можуть вручну видати ключ за кодом запиту, отриманим поза анкетою в редакторі, точно обравши, які функції надати, термін дії та ліміти для кожної функції; ключ автоматично надсилається електронною поштою, якщо вказано адресу.
0.2024.4 — Надійність стрічки оновлень
2023-07-24
Виправляє помилку кешування, через яку нові релізи могли не показуватися користувачам за певними корпоративними проксі.
Виправлено
- Надійність стрічки самооновлення — маніфест оновлень тепер віддається зі строгим заголовком no-cache, тож кешувальний проксі між fucini.software і читачем більше не може віддати застарілу копію, яка приховує нові релізи.
0.2024.3 — Незначні виправлення та продуктивність
2023-07-13
Невеликий технічний реліз: кілька незначних виправлень помилок і покращення продуктивності.
Виправлено
- Виправлення помилок — незначні виправлення помилок і покращення стабільності.
- Продуктивність — невеликі покращення продуктивності завантаження та відображення покриття.
0.2024.2 — Автоматична активація
2023-06-20
Ключі активації тепер видаються та застосовуються автоматично — більше не потрібно чекати на електронний лист.
Оцінювальний випуск. Кожне встановлення отримує безкоштовний 14-денний пробний період з усіма розблокованими можливостями, від першого використання; після цього воно переходить на безкоштовний рівень Community, а не припиняє роботу. Ліцензійний ключ видається автоматично на запит. Докладніше →
Змінено
- Автоматична активація — запит ключа тепер надсилає коротку анкету та автоматично застосовує отриманий ключ до ваших налаштувань, без листування електронною поштою.
- Швидше поновлення — запит на поновлення вимагає лише відповідей про використання та побажання; ваші контактні дані з попереднього запиту використовуються повторно, їх більше не запитують.
- Фіксоване вікно оцінювання — пробний період тепер триває до 31.12.2026 для всіх, замінюючи попередній відлік 14 днів від встановлення.
- Локалізований процес активації — опитувальник для поновлення та підтвердження активації тепер перекладені на всі 18 підтримуваних мов, як і решта розширення.
0.2024.1 · збірка 3 — Розумніша перевірка оновлень
2023-06-02
Розширення тепер перевіряє оновлення як на fucini.software, так і в VS Code Marketplace, завжди пропонуючи новішу версію.
Виправлено
- Перевірка з двох джерел — тепер запитує як fucini.software, так і VS Code Marketplace, і пропонує новішу версію.
0.2024.0 — Початковий реліз
2023-04-26
Перший публічний реліз Fucini Coverage Studio — нативне покриття для VS Code, яке приймає трасувальні файли галузевих стандартів, нормалізує їх в одну канонічну модель, детерміновано об'єднує прогони та звітує через вбудований Test Coverage API VS Code.
Додано
- Прийом кількох форматів — LCOV, llvm-cov JSON, Cobertura XML, JaCoCo XML, Istanbul/nyc і SimpleCov JSON, з автоматичним визначенням.
- Детермінований злиття — кілька трасувальних файлів об'єднуються в один прогін із записаним походженням, стабільно незалежно від порядку завантаження.
- Нативний інтерфейс покриття — гутери для рядків/гілок/функцій, оглядова лінійка та вбудована панель Test Coverage.
- Покриття MC/DC — розбивка за кожним рішенням при наведенні та опціональний кольоровий гутер полів.
- Комплексна оцінка — зважене за SIL гармонійне середнє за рядками, гілками, функціями, регіонами, MC/DC та C++ інстанціаціями.
- Вердикт відповідності — контроль COMPLIANT / NON-COMPLIANT із режимами
strict, whm, both і either.
- Перевідображення шляхів, диференційне покриття, значки Explorer і загальний рядок стану.
- Аналіз у редакторі — функціональний CodeLens, наведення на гілки, попередження про мертвий код, попередження про застаріле покриття та Next/Previous Uncovered.
- Перегляд покритих файлів, HTML-звіти, історія та тренди, режим спостереження та експорт Fucini JSON.