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, список исключений, значок или JSON Fucini; многостраничный 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. - Команда, работа которой не удалась, говорит об этом. Сбой в команде или таймере проглатывался; теперь это строка в окне «Вывод».
- Меньше работы в потоке пользовательского интерфейса. Наблюдатели за файлами создаются в фоне, записи окна «Список ошибок» вычисляются один раз за загрузку, а журнал пишется порциями, а не строка за строкой.
- Два окна 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, ** для любой глубины — смотрит ровно туда, куда указывает, как и прежде.
- Наблюдение там, где появится отчёт. Наблюдение охватывает папки, которые называют настройки, есть там отчёт уже или нет: папку файла с корнем, папки перед подстановочным знаком — со всем, что ниже них, когда шаблон уходит в подпапки, — и базовую папку для относительного подстановочного знака. Отчёт, который сборка туда записывает, загружается сам; запись в любой другой файл в этих папках игнорируется.
Исправлено
- JSON-отчёт llvm-cov отклонялся как неподдерживаемый формат. Формат распознаётся по первым 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 всегда и читала такую запись. Раньше абсолютная запись искалась как записана, так что запись со звёздочкой не находила ничего — и, будучи подстановочной, о том, что ничего не найдено, тоже никогда не сообщала. Отчёт, который появляется там позже, загружается наблюдателем или опросом, как и буквальная запись; подстановочный знак, которому ничего не соответствует, не сообщается, так как может ждать сборки.
Исправлено
- JSON-отчёт llvm-cov отклонялся как неподдерживаемый формат. Формат распознаётся по первым 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 — Hotspots, фильтры и .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 недельная норма: по пять в неделю на каждое учитываемое действие вместо двадцати в день, а на пределе предлагается подписка или семидневный пропуск. Установка, уже находящаяся в работе, сохраняет прежние лимиты 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
Исправлено
- Идентификатор установки теперь сохраняется до того, как его что-либо использует. Сборка 2 версии 0.2026.72 перестала заново вычислять идентификатор при каждом вызове, но при запуске по-прежнему никто не ждал, пока он будет записан, поэтому окно, закрытое сразу после открытия, всё ещё могло его потерять — а вместе с ним и отпечаток машины, к которому привязан ключ активации. Теперь запуск ждёт.
- Переход с 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., когда файл был принят каким-то анализатором. Если не принял ни один, ничего не добавляется: «не в том формате, который читает это расширение» уже говорит всё.
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)://. Артефакт скачивается в хранилище расширения при каждой загрузке и загружается оттуда; представление «Покрытие» называет URL, а не путь в кэше. Каждое скачивание условное (ETag / Last-Modified), так что повторное скачивание неизменившегося артефакта ничего не передаёт, а когда скачивание не удаётся, вместо него загружается последняя скачанная копия, и причина есть в выводе. fuciniCoverage.remote.headers добавляет заголовки Name: value с раскрытием переменных — Authorization: Bearer ${env:CI_TOKEN} держит токен вне settings.json, — а fuciniCoverage.remote.refreshMinutes скачивает заново по таймеру. Добавьте #lcov.info (или другое имя файла) как фрагмент URL, когда сам URL не заканчивается именем файла, чтобы формат был известен. - Загрузка и Generate Full HTML Report показывают ход выполнения, и их можно отменить. Загрузка десяти и более файлов трассировки — или 8 МБ и более — идёт под уведомлением о ходе выполнения с кнопкой «Отмена», которое называет читаемый файл и фазу (чтение, затем проверка исходников); меньшая по-прежнему лишь крутит индикатор в строке состояния. Отмена оставляет предыдущий прогон загруженным и сообщает об этом. 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} означает папку самой записи; файлы трассировки, найденные во всех папках, сливаются в один прогон, а представление «Покрытие» группирует файлы по папкам. ${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/**) отбрасываются из прогона при загрузке, так что представление «Покрытие», строка состояния, пороги, значки, 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 добавляет в представление «Покрытие» группу Unmeasured с каждым файлом рабочей области того вида, который прогон измерял, но которого в прогоне нет, считает их в результате загрузки, помечает ? в Проводнике при включённых значках и позволяет 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] называет оба файла покрытия и сколько файлов у них общих.
- «Показать, что изменилось с последнего прогона» в меню
… строки файла, как только есть предыдущий прогон для сравнения, — та же дельта по файлу, которую уже вычисляет Compare with Last Run, но для одного файла, о котором вы спросили, а не для всего дерева. Файл, в котором ничего не сдвинулось, прямо говорит об этом, а не предлагает пустоту.
- Команда Tune Colour Scale: подберите цвета и пороги
colorScale.* прямо на живом представлении «Покрытие», прежде чем их закрепить. Каждая правка сразу пишется в параметр — представление и так перерисовывается при любом изменении colorScale/threshold, так что запись значения и есть предпросмотр, — а завершающее «Оставить» или «Вернуть исходные значения» замыкает круг.
- Пробелы покрытия по файлам на панели Problems: по одной записи на каждый загруженный исходный файл ниже
threshold.statement, за новым параметром fuciniCoverage.problems.enabled (по умолчанию выключен — порог операторов по умолчанию равен 100). Каждая запись кратко описывает непокрытое («покрыто 62% строк — 14 непокрытых строк, 2 непокрытые функции») и несёт быстрое исправление, которое открывает установленное расширение чата (Copilot, Claude Code, …) с запросом написать тест для этого пробела, — диагностика на каждую строку затопила бы Problems в реальной кодовой базе, поэтому всё остаётся на уровне файла, на котором читатель действительно может действовать.
Исправлено
- Причину отсутствующего/несоответствующего/проверенного файла в представлении «Покрытие» теперь можно выделить и скопировать. Раньше она жила только в родной подсказке
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 (или функций/вызовов функций/мутаций) по файлу, измеренной двумя прогонами, знаменатель суммировался вместе с числителем, занижая настоящий процент. Подсказка значка происхождения теперь говорит «заменяя то, что говорил о нём _», а не «сложены вместе».
Исправлено
- Длинное имя файла в представлении «Покрытие» теперь обрезается многоточием, а не вылезает за пределы. У span имени в строке не было
min-width: 0 — единственного объявления, при котором overflow/text-overflow: ellipsis flex-элемента действительно срабатывают; без него длинное имя сохраняло полную ширину, стоило панели достаточно сузиться, и уходило под значок происхождения, процент и полосу, следующие за ним.
0.2026.64 — Сортировка представления «Покрытие» по оценке
2026-08-01
Добавлено
- Сортируйте представление «Покрытие» по оценке, а не только по имени. Каждая строка и так несёт оценку WHM и разбивку по метрикам; чтобы найти худший файл в большом дереве, приходилось выискивать его в алфавитном списке. Выпадающий список рядом с Свернуть всё / Развернуть всё теперь предлагает Имя файла, Сводная оценка, Строки, Ветви и MC/DC — все режимы, кроме Имя файла, перемешивают папки и файлы вместе, худшие первыми по собственному проценту этой метрики, так что плохо протестированная папка стоит ровно там же, где плохо протестированный файл, а не отгруппирована от него. Файл без данных для выбранной метрики (скажем, формат, который никогда не сообщает ветви) уходит в конец, а не читается как 0%. Выбор записывается в новый параметр
fuciniCoverage.coverageView.sortBy в момент выбора, так что он переживает перезагрузку окна, а не начинается каждый раз с Имя файла.
Исправлено
- Многострочная сигнатура функции больше не помечается ложно как «перемещённая».
fnMap в Istanbul даёт функции две ссылки на строку — где стоит её имя и где начинается тело, — и парсер предпочитал строку тела для проверки несоответствия, которая затем ищет имя в исходном тексте. Для любой функции, чей список параметров занимает больше двух строк (обычное дело в кодовой базе с переносом на 100 колонках), настоящая строка имени оказывалась слишком далеко от записанной, и файл тускнел в представлении «Покрытие» с ложным предупреждением «больше не соответствует своему покрытию». Теперь парсер предпочитает строку самого имени — то, что проверка несоответствия всегда и искала.
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 и от 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%, какие бы пороги вы ни задали. Столбец «Статус» сверял каждую метрику со скрытой сотней, поэтому проект, выставивший пороги в 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.