명령줄의 Coverage Studio 2.2026.4 — 두 엔진이 측정한 파일은 어디서 명령을 실행하든 한 번만 계산됩니다
2026-10-04
수정됨
- 명령을 실행한 폴더가 보고서의 의미를 정하지 않습니다. 2.2026.3은 보고서의 상대 경로를 그 보고서가 작성된 디렉터리에 묶습니다 — 다만 다른 곳에서 실행된 명령에만 그랬습니다. 측정 대상 트리의 루트에서, 즉 커버리지 명령을 보통 실행하는 바로 그 자리에서 실행하면 상대 경로는 여전히 그 폴더를 기준으로 해석되었고, llvm-cov가 이미 전체 경로로 지목한 파일이 두 번째로 계산되었습니다. 5,258줄짜리 트리가 5,836줄로 읽힌 것입니다. 이제는
--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은 자신의 종료 코드와 같은 말을 합니다. 임계값이 하나도 설정되지 않았을 때 종료 코드 0 옆에 "passed": false를 적었고, 종료 코드 대신 JSON을 읽는 파이프라인은 명령이 통과시킨 실행을 실패로 처리했습니다. passed는 종료 코드를 한 단어로 옮긴 것이고, 게이트가 아예 없었다고 말하는 것은 configured입니다. 빈 --lines ""는 그 게이트를 조용히 끄는 대신 거부됩니다. - 비교는 기준선을 실행 결과와 같은 자리에 놓습니다.
pathRemap과 보고서가 선언한 루트는 실행 결과에만 적용되고 기준선에는 적용되지 않았습니다. 그래서 빌드 서버에서 작성된 기준선은 어떤 파일과도 짝지어지지 않았고, 총계는 분명히 움직였는데도 비교는 아무것도 바뀌지 않았다고 알렸습니다.
명령줄의 Coverage Studio 2.2026.3 — 두 엔진이 측정한 파일이 다시 하나의 파일로
2026-10-04
수정됨
- 보고서의 상대 경로는 그 보고서가 작성된 위치를 기준으로 합니다. llvm-cov는 파일의 전체 경로를 쓰고, gcovr는 보고서가 놓인 빌드 폴더를 기준으로 한 상대 경로를 씁니다. 한 트리의 두 보고서를 함께 주면
summary는 둘이 공통으로 가진 모든 파일을 두 번씩 — 각 엔진의 수치로 한 번씩 — 나열하고 둘 다 합계에 더했습니다. 상대 경로에는 기준이 될 루트가 없어서, 셸이 그때 머물던 폴더를 기준으로 해석되었기 때문입니다. 5,258줄의 트리가 5,836줄로 보고되었고, 초과분은 그런 파일을 하나도 담고 있지 않은 경로 아래의 파일에 속했습니다. 이제 각 보고서는 두 에디션이 이미 그렇게 하듯, 명령이 실행되는 폴더까지 자신의 디렉터리와 그 위의 디렉터리를 기준으로 삼습니다 — 그래서 빌드 디렉터리마다 pathRemap 규칙을 두지 않고도 둘이 하나의 파일 집합으로 만납니다. - 바이트 순서 표시로 시작하는 설정 파일도 거부되었습니다. Windows의 편집기가 텍스트 앞에 그것을 쓸 수 있습니다. 더 이상 JSON의 일부로 간주되지 않습니다.
- 먼저 멈추는 읽는 쪽으로 보낸 출력은 조용히 끝납니다.
summary를 head나 PowerShell의 Select-Object -First로 파이프하면 처리되지 않은 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, 게이트. 줄, 분기, 함수, MC/DC, 조건, 리전, 뮤테이션 또는 가중 점수가 설정이나 명령줄의 임계값에 못 미치면 종료 코드 1. --new-code 80 --base-ref origin/main은 도구가 실행한 git diff를 바탕으로 브랜치가 바꾼 줄을 판정하고, --require-reasons는 이유 없는 제외 마커를 실패로 칩니다.
summary, export, report, badge, compare. 합계와 모든 파일. 실행을 파일별 또는 함수별 CSV, Markdown, LCOV, Cobertura, SARIF, 제외 목록, 배지 또는 Fucini의 JSON으로. 여러 페이지로 된 HTML 보고서. 설정의 척도에 따라 색을 입힌 배지. 이 실행을 기준선과 비교하되 회귀부터, 풀 리퀘스트 검사를 위한 --fail-on-regression과 함께.
mcp, AI 에이전트용. 에디션의 여섯 가지 도구를, 실행을 바탕으로 127.0.0.1에서 토큰 뒤에서 제공하며, 클라이언트의 mcp.json에 넣을 항목을 출력합니다.
- Visual Studio 에디션의 설정 파일. 코드 옆의
fucini-coverage.json에 VS Code 설정의 fuciniCoverage.* 키를 담고, 그 아래로 .vscode/settings.json. 보고서는 파일, 폴더 또는 패턴으로 지정하고, .gz는 풀어서 읽으며, 모든 명령은 스스로를 설명합니다: fucini-coverage help <command>.
Coverage Studio for VS Code 2.2026.2 — 평가판은 라이선스 서버의 응답과 함께 시작됩니다
2026-10-04
변경됨
- 새 설치본의 평가판은 라이선스 서버의 첫 응답과 함께 시작됩니다. 확장이 fucini.software에 한 번 연결되기 전까지는 Community 등급으로 실행되며 그 이유를 알려 줍니다. 이미 평가판 중이거나 라이선스가 있는 설치본은 아무 변화도 느끼지 못합니다.
- 개발 컨테이너나 Codespace에서는 평가판이 없습니다. 그곳에서 확장은 Community 등급으로 시작하며, 구독 코드, 키 또는 7일 패스로 모든 기능을 사용할 수 있습니다.
- 사용량 원장은 두 번째 해시로도 머신을 식별합니다. 운영 체제 자체 식별자의 해시이며, 전송되는 것은 해시뿐입니다. 개인정보 처리방침을 참고하세요.
Coverage Studio for Visual Studio 2.2026.1 — 소소한 수정
2026-10-04
수정됨
- 소소한 수정. 유지 보수 릴리스입니다. 내부의 작은 수정뿐이며, 보이는 내용이나 사용 방법은 달라지지 않습니다.
Coverage Studio for VS Code 2.2026.1 — 소소한 수정
2026-10-04
수정됨
- 소소한 수정. 유지 보수 릴리스입니다. 내부의 작은 수정뿐이며, 보이는 내용이나 사용 방법은 달라지지 않습니다.
Coverage Studio for Visual Studio 2.2026.0 — 화면의 커버리지를 AI 에이전트에게
2026-10-04
추가됨
- 화면의 커버리지를 AI 에이전트에게. 테스트를 작성하는 에이전트는 테스트를 실행하고 퍼센트를 읽을 수는 있었지만, Visual Studio가 아는 것을 물을 수는 없었습니다. 여섯 개의 도구가 에이전트가 행동으로 옮길 수 있는 말로 그에 답합니다:
coverage_summary, coverage_gaps, tests_for_line, patch_coverage, coverage_delta, test_run_command. MCP를 쓰는 에이전트는 fuciniCoverage.mcp.enabled가 켜져 있을 때 Visual Studio가 실행하는 서버를 통해 이 도구에 접근합니다 — 기본적으로 꺼져 있고, 127.0.0.1에서만 열리며, 사용자 고유의 토큰으로 보호되고, 웹 페이지에는 닫혀 있습니다. Copy MCP Server Configuration은 클라이언트용 항목을 클립보드에 넣어 줍니다. - 화면과 같은 수치. 도구는 로드된 실행을 바탕으로 답합니다 — 같은 제외, 같은 재매핑 — 그래서 어떤 함수의 빈틈을 커버하라는 지시를 받은 에이전트와 여백을 보는 검토자가 같은 줄을 두고 이야기하게 됩니다.
변경됨
- 키의 플랜은 VS Code에서 결정하는 것을 Visual Studio에서도 결정합니다. 어떤 기능 — MC/DC, HTML 보고서, 줄을 실행한 테스트의 이름 — 을 뺀 플랜은 VS Code에서는 그 기능을 뺐지만 여기서는 빼지 않았습니다. 이제 두 에디션이 같은 표를 읽습니다: 플랜에 포함되지 않은 기능은 제공되지 않고, 해당 명령이 그 사실을 알려 줍니다.
- 라이선스 서버가 요구하는 최소 버전이 여기서도 적용됩니다. 2.2026.0부터 두 에디션이 같은 버전을 쓰므로, 그 최소 버전보다 오래된 빌드는 VS Code 에디션처럼 업데이트를 요청합니다.
Coverage Studio for VS Code 2.2026.0 — 화면의 커버리지를 AI 에이전트에게
2026-10-04
추가됨
- 화면의 커버리지를 AI 에이전트에게. 테스트를 작성하는 에이전트는 테스트를 실행하고 퍼센트를 읽을 수는 있었지만, 편집기가 아는 것을 물을 수는 없었습니다. 여섯 개의 도구가 에이전트가 행동으로 옮길 수 있는 말로 그에 답합니다:
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은 클라이언트용 항목을 클립보드에 넣어 줍니다. - 화면과 같은 수치. 도구는 로드된 실행을 바탕으로 답합니다 — 같은 제외, 같은 재매핑 — 그래서 어떤 함수의 빈틈을 커버하라는 지시를 받은 에이전트와 여백을 보는 검토자가 같은 줄을 두고 이야기하게 됩니다.
Visual Studio용 Coverage Studio 1.2026.22 — 두 엔진이 측정한 파일은 하나의 파일입니다
2026-10-04
수정됨
- 두 엔진이 측정한 파일은 하나의 파일입니다. llvm-cov는 파일의 전체 경로를 쓰고, gcovr는 보고서가 놓인 빌드 폴더를 기준으로 한 상대 경로를 씁니다. 상대 경로는 보고서 자신의 디렉터리와 그 위의 폴더들에 묶이지만, 그 전에 해석기가 “이 경로가 적힌 그대로 존재하는가”를 물었고, 그 물음에 답하는 것은 Visual Studio 자신이 시작된 폴더였습니다. 그 폴더에 파일이 있으면 경로는 상대인 채로 남았습니다. 파일은 이름이 둘이 되어 Coverage 창에 두 번 나오고 합계에도 두 번 들어갔습니다. 5,258줄짜리 트리가 5,836줄로 읽혔습니다. 자기 위치를 가리키지 않는 경로는 이제 아예 묻지 않습니다. 보고서가 작성된 자리에 묶이고, 행이 그렇게 말합니다.
VS Code용 Coverage Studio 1.2026.23 — 두 엔진이 측정한 파일은 하나의 파일이고, 선택한 여백 모드는 설정 파일에 들어가지 않습니다
2026-10-04
수정됨
- 두 엔진이 측정한 파일은 하나의 파일입니다. llvm-cov는 파일의 전체 경로를 쓰고, gcovr는 보고서가 놓인 빌드 폴더를 기준으로 한 상대 경로를 씁니다. 상대 경로는 보고서 자신의 디렉터리와 그 위의 폴더들에 묶이지만, 그 전에 해석기가 “이 경로가 적힌 그대로 존재하는가”를 물었고, 그 물음에 답하는 것은 확장 호스트가 시작된 폴더, 곧
code . 뒤에는 여러분의 프로젝트 루트였습니다. 그러면 경로는 상대인 채로 남았습니다. 파일은 이름이 둘이 되어 Coverage 뷰에 두 번 나오고 합계에도 두 번 들어갔습니다. 5,258줄짜리 트리가 5,836줄로 읽혔습니다. 자기 위치를 가리키지 않는 경로는 이제 아예 묻지 않습니다. 보고서가 작성된 자리에 묶이고, 행이 그렇게 말합니다. - 선택한 여백 모드는 세션 동안 유지되고, 설정은 여러분이 쓴 그대로 남습니다. 상태 표시줄이나 선택기, Toggle Coverage Painting으로 모드를 고르면 그것이
settings.json에 기록되었습니다. 많은 프로젝트에서 버전 관리를 받는 파일을, 1분에 두 번은 눌리라고 만든 단추가 고쳐 쓴 셈입니다. 이제 선택은 세션 동안만 살아 있고, 설정에 직접 적어 둔 모드는 창이 열릴 때 여전히 우선합니다.
Coverage Studio for Visual Studio 1.2026.21 — 테스트가 알아챌까요? 캐럿 위치에서 뮤테이션 실행
2026-10-03
추가됨
- Run Mutation Tests Here. 커버리지는 줄이 실행되었다고 말하고, 뮤테이션 도구는 그 줄이 틀렸을 때 테스트가 알아챌지를 말합니다. 캐럿이 있는 함수 — 또는 선택한 줄이나 파일 — 가 폴더의 러너가 변이시킬 대상으로 전달되고, 그 보고서는 화면의 커버리지 옆에 로드됩니다: C#에는 Stryker.NET, JavaScript와 TypeScript에는 StrykerJS, Java에는 Maven과 함께 PIT. 프로젝트 전체의 뮤테이션 실행은 한 시간이 걸리고, 함수 하나는 일 분이 걸립니다.
Coverage Studio for VS Code 1.2026.22 — 테스트가 알아챌까요? 캐럿 위치에서 뮤테이션 실행
2026-10-03
추가됨
- Run Mutation Tests Here. 커버리지는 줄이 실행되었다고 말하고, 뮤테이션 도구는 그 줄이 틀렸을 때 테스트가 알아챌지를 말합니다. 캐럿이 있는 함수 — 또는 선택한 줄이나 파일 — 가 폴더의 러너가 변이시킬 대상으로 전달되고, 그 보고서는 화면의 커버리지 옆에 로드됩니다: C#에는 Stryker.NET, JavaScript와 TypeScript에는 StrykerJS, Java에는 Maven과 함께 PIT. 프로젝트 전체의 뮤테이션 실행은 한 시간이 걸리고, 함수 하나는 일 분이 걸립니다.
Coverage Studio for Visual Studio 1.2026.20 — 앱 자체를 커버리지와 함께
2026-10-03
추가됨
- Run App with Coverage…는 테스트가 하는 일뿐 아니라 사람이 닿는 곳까지 측정합니다. 폴더의 .NET 앱이 Microsoft의
dotnet-coverage 아래에서 자체 콘솔로 시작되어 닫힐 때까지 실행됩니다. 그동안 둘러본 부분은 여느 실행처럼 로드되고, 커버리지 세션에서는 테스트가 실행한 것에 더해집니다. dotnet tool install --global dotnet-coverage가 필요합니다.
Coverage Studio for VS Code 1.2026.21 — 앱 자체를 커버리지와 함께
2026-10-03
추가됨
- Run App with Coverage…는 테스트가 하는 일뿐 아니라 사람이 닿는 곳까지 측정합니다. 폴더의 .NET 앱이 Microsoft의
dotnet-coverage 아래에서 자체 콘솔로 시작되어 닫힐 때까지 실행됩니다. 그동안 둘러본 부분은 여느 실행처럼 로드되고, 커버리지 세션에서는 테스트가 실행한 것에 더해집니다. dotnet tool install --global dotnet-coverage가 필요합니다.
Coverage Studio for Visual Studio 1.2026.19 — GitHub와 GitLab의 zip 아티팩트
2026-10-03
추가됨
- zip 아티팩트에서 가져오는 CI 기준선. GitHub와 GitLab은 아티팩트를 아카이브로 게시합니다.
baseline.report가 그런 아카이브를 지정하면 — URL이든 디스크의 zip이든 — 그것을 열어 안의 보고서를 사용합니다: # 뒤에 지정된 멤버(ci/artifact.zip#coverage/lcov.info), 없으면 아카이브의 유일한 파일, 그것도 아니면 보고서처럼 보이는 유일한 파일입니다.
Coverage Studio for VS Code 1.2026.20 — GitHub와 GitLab의 zip 아티팩트
2026-10-03
추가됨
- GitHub와 GitLab의 zip 아티팩트. CI는 아티팩트를 게시하고, 아티팩트는 아카이브입니다. 이제 가져온 zip을 열어 그 안의 보고서를 사용합니다 — URL의
# 뒤에 지정된 멤버(…/zip#coverage/lcov.info), 없으면 아카이브의 유일한 파일, 그것도 아니면 보고서처럼 보이는 유일한 파일입니다. coverageFile.paths의 URL, baseline.report, 그리고 디스크의 zip인 기준선에 적용됩니다.
수정됨
- Cobertura 기준선의 파일을 보고서 자체의
<source> 아래에서 찾지 못했습니다. 합계는 움직였는데 비교는 그 옆에 0 file(s) moved라고 표시했습니다. 이제 로드되는 보고서와 마찬가지로 보고서가 지정한 루트를 사용합니다.
Coverage Studio for Visual Studio 1.2026.18 — 작성자별, 날짜별 새 코드
2026-10-03
추가됨
- 작성자별, 날짜별 새 코드. 새 코드는 git ref 대비 변경된 줄이었습니다. 두 설정이 ref로는 답할 수 없는 것을 묻습니다:
fuciniCoverage.gitDiff.author — 한 사람이 쓴 줄 — 와 fuciniCoverage.gitDiff.since — 특정 날짜 이후에 쓰인 줄. 둘 다 git blame에서 읽어 오며, 차이 커버리지와 새 코드 게이트에 적용됩니다.
Coverage Studio for VS Code 1.2026.19 — 작성자별, 날짜별 새 코드
2026-10-03
추가됨
- 작성자별, 날짜별 새 코드. 새 코드는 git ref 대비 변경된 줄이었습니다. 두 설정이 ref로는 답할 수 없는 것을 묻습니다:
fuciniCoverage.gitDiff.author — 한 사람이 쓴 줄 — 와 fuciniCoverage.gitDiff.since — 특정 날짜 이후에 쓰인 줄. 둘 다 git blame에서 읽어 오며, 차이 커버리지와 새 코드 게이트에 적용됩니다.
Coverage Studio for 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 for 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 for Visual Studio 1.2026.16 — GCC 14 조건 커버리지, 줄 단위로
2026-10-02
추가됨
- GCC 14의 조건 커버리지, 줄 단위로.
-fcondition-coverage는 파일당 두 개의 카운트로 읽혔습니다. 이제 각 조건이 해당 줄에 표시되고 호버에 명시됩니다 — 조건 1은 한 번도 참이 된 적 없음, 조건 0은 어느 쪽으로도 평가된 적 없음 — gcov의 JSON과 그 텍스트 목록 모두에서 읽습니다. threshold.conditions가 그 게이트가 되고, Copy Coverage Summary에 Conditions 열이 있으며, badge.metric은 conditions를 받고, 검색은 conditions < 80을 받습니다.
수정됨
- 함수의 분기 수치가 조건의 결과까지 세었습니다. 도구는 6개 중 4개라고 했는데
branches 8/12로 나왔습니다. 파일과 실행의 수치에서처럼 그곳에서도 조건은 제외됩니다.
Coverage Studio for VS Code 1.2026.17 — GCC 14 조건 커버리지, 줄 단위로
2026-10-02
추가됨
- GCC 14의 조건 커버리지, 줄 단위로.
-fcondition-coverage는 파일당 두 개의 카운트로 읽혔습니다. 이제 각 조건이 해당 줄에 표시되고 호버에 명시됩니다 — 조건 1은 한 번도 참이 된 적 없음, 조건 0은 어느 쪽으로도 평가된 적 없음 — gcov의 JSON과 그 텍스트 목록 모두에서 읽습니다. threshold.conditions가 그 게이트가 되고, Copy Coverage Summary에 Conditions 열이 있으며, badge.metric은 conditions를 받고, 검색은 conditions < 80을 받습니다.
수정됨
- 함수의 분기 수치가 조건의 결과까지 세었습니다. 도구는 6개 중 4개라고 했는데
branches 8/12로 나왔습니다. 파일과 실행의 수치에서처럼 그곳에서도 조건은 제외됩니다.
Coverage Studio for Visual Studio 1.2026.15 — Coverage 보기가 편집기를 따라갑니다
2026-10-02
추가됨
- Coverage 보기가 편집기를 따라갑니다. 보고 있는 파일이 트리에서 강조 표시되고, 그 위의 폴더가 펼쳐지며, 그 행이 보이도록 스크롤됩니다.
fuciniCoverage.coverageView.followActiveEditor로 끌 수 있습니다.
Coverage Studio for VS Code 1.2026.16 — Coverage 보기가 편집기를 따라갑니다
2026-10-02
추가됨
- Coverage 보기가 편집기를 따라갑니다. 보고 있는 파일이 트리에서 강조 표시되고, 그 위의 폴더가 펼쳐지며, 그 행이 보이도록 스크롤됩니다.
fuciniCoverage.coverageView.followActiveEditor로 끌 수 있습니다.
Coverage Studio for 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는 Cobertura 줄의 branch 특성을 True로 쓰는데, 소문자 true만 읽었습니다 — 그래서 그런 보고서의 모든 결정이 버려졌습니다. 이제 두 표기를 모두 읽습니다. 수치가 달라집니다: .NET 프로젝트의 분기 커버리지가 없던 곳에 나타나고, 점수도 함께 바뀝니다. - 여러 트리에서 병합된 Cobertura 보고서가 첫 트리의 파일만 찾았습니다. 이런 보고서는 트리마다
<source>를 하나씩 적습니다. 이제 보고서에 적힌 순서대로 각각을 시도합니다.
Coverage Studio for 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는 Cobertura 줄의 branch 특성을 True로 쓰는데, 소문자 true만 읽었습니다 — 그래서 그런 보고서의 모든 결정이 버려졌습니다. 이제 두 표기를 모두 읽습니다. 수치가 달라집니다: .NET 프로젝트의 분기 커버리지가 없던 곳에 나타나고, 점수도 함께 바뀝니다. - 여러 트리에서 병합된 Cobertura 보고서가 첫 트리의 파일만 찾았습니다. 이런 보고서는 트리마다
<source>를 하나씩 적습니다. 이제 보고서에 적힌 순서대로 각각을 시도합니다.
Coverage Studio for Visual Studio 1.2026.13 — 모든 줄을 여전히 실행하는 최소한의 테스트
2026-10-01
추가됨
- Show Minimal Test Set…는 스위트가 실행하는 모든 줄을 여전히 실행하는 최소한의 테스트를 찾고, 그 아래에 고유한 줄을 하나도 더하지 않는 테스트를 나열합니다. 커밋 전의 빠른 실행을 위한 것이며, 스위트를 정리하는 사람을 위한 것입니다 — 다만 줄 기준으로 중복이라고 해서 테스트가 검사하는 내용 기준으로도 중복인 것은 아니라는 점을 함께 알려 줍니다.
Coverage Studio for VS Code 1.2026.14 — 모든 줄을 여전히 실행하는 최소한의 테스트
2026-10-01
추가됨
- Show Minimal Test Set…는 스위트가 실행하는 모든 줄을 여전히 실행하는 최소한의 테스트를 찾고, 그 아래에 고유한 줄을 하나도 더하지 않는 테스트를 나열합니다. 커밋 전의 빠른 실행을 위한 것이며, 스위트를 정리하는 사람을 위한 것입니다 — 다만 줄 기준으로 중복이라고 해서 테스트가 검사하는 내용 기준으로도 중복인 것은 아니라는 점을 함께 알려 줍니다.
Coverage Studio for 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 for 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 for 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…는 아무도 편집하지 않았는데 커버리지가 움직인 줄을 나열합니다 — 테스트가 없어졌거나 앞쪽의 분기가 이제 일찍 반환해서 더 이상 실행되지 않는 코드입니다.
baseline.report가 CI 기준선을 지정하면 그것과, 아니면 이전 실행과 비교합니다.
Coverage Studio for 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…는 아무도 편집하지 않았는데 커버리지가 움직인 줄을 나열합니다 — 테스트가 없어졌거나 앞쪽의 분기가 이제 일찍 반환해서 더 이상 실행되지 않는 코드입니다.
baseline.report가 CI 기준선을 지정하면 그것과, 아니면 이전 실행과 비교합니다.
Coverage Studio for 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 for 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 for 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 자체 코드 커버리지를 불러옵니다. Visual Studio의 Analyze Code Coverage가 쓰는
.coverage 파일은 dotnet-coverage로 변환되어 저절로 로드됩니다. Coverage Studio는 기본 제공 수집기와 경쟁하는 대신 그것을 토대로 삼습니다.
Coverage Studio for 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 for Visual Studio 1.2026.8 — 다시 불러와도 검색, 세션, 마지막 실행은 그대로
2026-09-30
수정됨
- 커버리지를 다시 불러와도 검색 상자의 검색어와 포커스가 유지됩니다. 다시 불러올 때마다 검색 상자가 비워졌고, 검색어를 입력하는 도중인 경우도 많았습니다.
< 80% 같은 검색어는 그에 맞는 위험 핫스팟도 유지합니다. - 커버리지 세션이 같은 실행을 더 이상 두 번 세지 않습니다. 바뀌지 않은 보고서를 다시 불러올 때마다 그것이 다시 더해져 모든 실행 횟수가 두 배가 되었습니다. 이제 세션은 각 보고서 집합을 한 번만 유지합니다.
- CI 기준선이 더 이상 불러오기를 지연시키지 않습니다. 불러온 결과를 먼저 화면에 그린 다음 비교가 뒤따릅니다. 기준선은 한 번만 준비되어 그 보고서와 설정이 그대로인 동안 유지되며, URL에 연결할 수 없으면 이전에 가져온 사본을 사용합니다.
- 바뀌지 않은 보고서를 다시 불러와도 “마지막 실행 이후”가 유지됩니다. 설정을 바꾸거나 새로 고치면 화면의 실행이 자기 자신의 마지막 실행이 되어, 그 이전 실행 이후의 모든 변화가 사라졌습니다. 이런 다시 읽기는 이제 기록에도 남지 않습니다.
- 불러오기는 한 번에 하나씩. 함께 요청된 두 번의 다시 불러오기가 나란히 실행되어 더 느린 쪽이 이겼습니다. 이제 불러오는 동안 요청된 다시 불러오기는 그 뒤의 한 번의 불러오기로 합쳐집니다.
- HTTP를 통한 CI 기준선은 VS Code에서처럼 가져옵니다. 클라이언트는 하나이고, 서버에 연결할 수 없을 때를 위해 마지막 사본을 보관하며,
remote.headers는 그것이 작성된 대상 주소로만 보냅니다 — 일반 HTTP로는 절대 보내지 않습니다. - 작업에 실패한 명령은 실패했다고 알립니다. 명령이나 타이머의 실패가 삼켜졌는데, 이제는 출력 창에 한 줄로 나옵니다.
- UI 스레드의 작업이 줄었습니다. 파일 감시자는 백그라운드에서 만들어지고, 오류 목록 항목은 불러올 때마다 한 번만 계산되며, 로그는 한 줄씩이 아니라 묶음으로 기록됩니다.
- Visual Studio 창이 두 개여도 실행 기록이 더 이상 손상되지 않습니다. 기록의 인덱스는 두 창이 공유하는 잠금 아래에서 한 번에 교체되고, 사라지면 실행들로부터 다시 만들어집니다.
- Run Native Project with Coverage는 프로젝트 자체의 플랫폼으로 빌드하고,
llvm-cov와 llvm-profdata를 컴파일러의 LLVM에서 한 쌍으로 가져옵니다. - Coverage 창의 경고, 오류, 통과 색이 밝은 테마도 따릅니다 — 어두운 테마와 마찬가지로.
- 저장하지 않은 변경 사항이 있는 채로 열려 있는 설정 파일은 덮어쓰지 않습니다. 설정 페이지가 먼저 저장하라고 알려 줍니다.
변경됨
- 직접 고른 커버리지 파일과 테스트 실행이 쓰는 보고서는 대신 기억해 둡니다 —
.vscode/settings.json에 기록하지 않습니다. 그 파일은 커밋되는 경우가 많아, 테스트 실행이 아무도 요청하지 않은 변경을 저장소에 남겼습니다. 이미 coverageFile.paths에 있는 경로는 계속 동작합니다.
Coverage Studio for VS Code 1.2026.9 — 다시 불러와도 검색, 세션, 마지막 실행은 그대로
2026-09-30
수정됨
- 커버리지를 다시 불러와도 검색 상자의 검색어와 포커스가 유지됩니다. 다시 불러올 때마다 검색 상자가 비워졌고, 검색어를 입력하는 도중인 경우도 많았습니다.
< 80% 같은 검색어는 그에 맞는 위험 핫스팟도 유지합니다. - 커버리지 세션이 같은 실행을 더 이상 두 번 세지 않습니다. 바뀌지 않은 보고서를 다시 불러올 때마다 그것이 다시 더해져 모든 실행 횟수가 두 배가 되었습니다. 이제 세션은 각 보고서 집합을 한 번만 유지합니다.
- CI 기준선이 더 이상 불러오기를 지연시키지 않습니다. 불러온 결과를 먼저 화면에 그린 다음 비교가 뒤따릅니다. 기준선은 한 번만 준비되어 그 보고서와 설정이 그대로인 동안 유지되며, URL에 연결할 수 없으면 이전에 가져온 사본을 사용합니다.
- 보고서 파일 변경 확인은 한 번에 한 차례씩만 실행됩니다. 느린 네트워크 드라이브에서는 두 차례의 확인이 같은 변경을 보아 커버리지가 두 번 로드되었습니다.
- 바뀌지 않은 보고서를 다시 불러와도 “마지막 실행 이후”가 유지됩니다. 설정을 바꾸거나 새로 고치면 화면의 실행이 자기 자신의 마지막 실행이 되어, 그 이전 실행 이후의 모든 변화가 사라졌습니다. 이런 다시 읽기는 이제 기록에도 남지 않습니다.
변경됨
- 직접 고른 커버리지 파일과 테스트 실행이 쓰는 보고서는 대신 기억해 둡니다 —
.vscode/settings.json에 기록하지 않습니다. 그 파일은 커밋되는 경우가 많아, 테스트 실행이 아무도 요청하지 않은 변경을 저장소에 남겼습니다. 이미 coverageFile.paths에 있는 경로는 계속 동작합니다.
Coverage Studio for 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# 테스트 파일을 읽습니다.
Public Sub 위의 <Fact>와 let이나 member 위의 [<Fact>]는 전혀 인식되지 않았습니다. - 테스트 실행을 취소하면 그 실행이 시작한 모든 프로세스가 끝납니다. 셸만 끝나고
dotnet test는 그 뒤에서 계속 실행되었습니다. Visual Studio를 닫아도 실행이 취소됩니다. - 저장 후 실행되는 동안 입력해도 표시가 더 이상 밀리지 않습니다. 표시는 실행이 측정한 텍스트에 고정됩니다.
- 네트워크 공유에 있는 솔루션은 그곳에서 테스트를 실행합니다. 명령 셸이
\\server\share 경로를 폴더로 받지 않아 실행이 C:\Windows에서 시작되었습니다.
Coverage Studio for 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# 테스트 파일을 읽습니다.
Public Sub 위의 <Fact>와 let이나 member 위의 [<Fact>]는 전혀 인식되지 않았습니다. - 프로세스를 시작하지 않고 끝나는 테스트 작업 때문에 Run Tests with Coverage가 끝없이 기다리는 일이 더 이상 없습니다. 명령은 끝나고, 실행이 아무것도 쓰지 않았다고 알려 줍니다.
Coverage Studio for Visual Studio 1.2026.6 — 줄을 실행한 테스트, 저장할 때마다 커버리지, CI 기준선
2026-09-29
추가됨
- 이 줄을 실행한 테스트. 보고서가 이를 기록하는 경우 —
--show-contexts를 쓴 coverage.py, 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 노드 ID — 기록된 결과를 불러옵니다. 테스트는 텍스트에서 읽으므로 언어 서비스 없이 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나 async 상태 머신 같은 컴파일러 생성 형식은 그것이 생성된 클래스에 합쳐집니다.
- 커버리지 트리 위의 검색 상자. 단어를 입력하면 이름이나 경로에 그 단어가 모두 들어 있는 행만 남고, 비교식 —
< 80%, lines >= 90, branches = 0 — 을 입력하면 수치가 조건을 만족하는 행만 남습니다. 둘을 함께 쓰면 둘 다 만족해야 합니다. 메서드 행과 위험 핫스팟도 검색되며, Escape로 지웁니다.
- Run Native Project with Coverage. Tools 메뉴에서 시작 C++ 프로젝트를 대상으로 실행합니다. ClangCL 프로젝트는 clang의 커버리지 계측과 함께
coverage/native/에 다시 빌드되어 실행되고 보고서가 로드됩니다. 다른 도구 집합은 OpenCppCoverage가 설치되어 있으면 그 아래에서 실행되며, 둘 다 불가능하면 무엇을 설치해야 하는지 한 문장으로 알려 줍니다.
- 커버리지 세션과 추세. Start Coverage Session을 실행하면 그 뒤로 불러오는 모든 실행이 이전 실행에 더해집니다 — 줄, 분기, 함수 모두, 어느 실행이든 실행한 것은 커버된 것으로 칩니다. 그래서 단위 테스트, 통합 테스트, 애플리케이션을 직접 둘러본 결과가 함께 어디까지 닿았는지 보여 줍니다. 도구 모음 아래에는 저장된 기록의 줄 커버리지가 실행마다 점 하나씩 추세로 그려집니다.
- Compare Two History Runs — VS Code에서처럼, 보관된 두 실행을 고르면 그 사이에 바뀐 파일이 어느 쪽을 먼저 골랐든 오래된 것에서 새것 순으로 나열됩니다.
- Compare with CI Baseline.
baseline.report에 메인 브랜치 빌드가 게시하는 보고서를 지정합니다 — remote.headers로 가져오는 URL 또는 내려받은 파일. 이후 모든 불러오기가 이와 비교되어, 상태 표시줄 카드가 이번 실행의 위치를 알려 주고 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, OpenCover의 MissingPdb)을 VS Code처럼 로그에 기록합니다.
- 매크로만 있는 헤더가 더 이상 트리에 100%로 표시되지 않습니다. llvm-cov와 gcov는 매크로 사용을 그것을 정의하는 줄에 계산합니다. 제외된 줄 위의 분기와 함수는 이제 그 줄과 함께 빠지며, 측정할 것이 남지 않은 파일은 실행에서 빠지고 출력에 이름이 표시됩니다(
FUCINI_EXCLUDE_001).
- 지원하지 않는 형식으로 거부되던 다섯 가지 보고서를 인식합니다. Kover의 JaCoCo XML, Stryker.NET 보고서, NCover 보고서, 예전 SimpleCov resultset, 빈 파일이 많은 SonarQube 보고서를 이제 맨 앞에 담긴 내용으로 알아봅니다. 경로에
cobertura라는 단어가 들어 있는 Clover나 SonarQube 보고서는 더 이상 Cobertura로 읽히지 않습니다.
- 그것을 쓴 도구와 일치하는 수치. MC/DC 빌드의 분기 수치가
llvm-cov report와 일치하고, LCOV 2 예외 분기(BRDA:12,e0,1,3)가 집계되며, llvm-cov 함수는 그것을 정의한 파일에서만 선언됩니다. 두 테스트 바이너리가 나열한 Go 블록은 카운트를 더하고, 두 클래스가 보고한 Cobertura 결정과 두 번 나열된 JaCoCo 줄은 모든 분기를 한 번씩 유지합니다.
- 작은 수정들. 쓰다가 끊긴 트레이스 파일에서 더 이상 파일이 빠지지 않습니다. 여러
.gcda 파일에 대한 gcov -t는 각각 별도 파일이 되고, 템플릿 인스턴스는 한 번만 읽히며, gcov -H의 1.20k 같은 카운트도 유지됩니다. GNATcoverage 파일이 모두 커버리지 이후 변경된 것으로 보고되지 않으며, 보류 중인 Stryker 뮤턴트나 중단된 PIT 실행이 더 이상 점수를 깎지 않습니다.
- 설정 파일을 직접 편집하면 저장할 때 적용됩니다 — VS Code가 설정 변경을 적용하는 것과 같습니다.
Coverage Studio for VS Code 1.2026.7 — 줄을 실행한 테스트, 저장할 때마다 커버리지, CI 기준선
2026-09-29
추가됨
- 이 줄을 실행한 테스트. 보고서가 이를 기록하는 경우 —
--show-contexts를 쓴 coverage.py, 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 노드 ID — 기록된 결과를 불러옵니다. 테스트는 텍스트에서 읽으므로 언어 서비스 없이 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나 async 상태 머신 같은 컴파일러 생성 형식은 그것이 생성된 클래스에 합쳐집니다.
- 커버리지 트리 위의 검색 상자. 단어를 입력하면 이름이나 경로에 그 단어가 모두 들어 있는 행만 남고, 비교식 —
< 80%, lines >= 90, branches = 0 — 을 입력하면 수치가 조건을 만족하는 행만 남습니다. 둘을 함께 쓰면 둘 다 만족해야 합니다. 메서드 행과 위험 핫스팟도 검색되며, Escape로 지웁니다.
- 커버리지 세션과 추세. Start Coverage Session을 실행하면 그 뒤로 불러오는 모든 실행이 이전 실행에 더해집니다 — 줄, 분기, 함수 모두, 어느 실행이든 실행한 것은 커버된 것으로 칩니다. 그래서 단위 테스트, 통합 테스트, 애플리케이션을 직접 둘러본 결과가 함께 어디까지 닿았는지 보여 줍니다. 도구 모음 아래에는 저장된 기록의 줄 커버리지가 실행마다 점 하나씩 추세로 그려집니다.
- Compare with CI Baseline.
baseline.report에 메인 브랜치 빌드가 게시하는 보고서를 지정합니다 — remote.headers로 가져오는 URL 또는 내려받은 파일. 이후 모든 불러오기가 이와 비교되어, 상태 표시줄 카드가 이번 실행의 위치를 알려 주고 Compare with CI Baseline이 바뀐 파일을 나열합니다. 기준선은 실행과 같은 제외 목록을 거치므로 합계가 같은 조건에서 비교됩니다.
수정됨
- 테스트 실행 보고서에 사용자 이름과 컴퓨터 이름이 더 이상 들어가지 않습니다. Microsoft의 Code Coverage 수집기는 보고서 이름을
<user>_<machine>_<stamp>.cobertura.xml로 짓고, 그 이름이 트리와 모든 스크린샷에 나타났습니다. 이제 보고서는 로드되기 전에 coverage.cobertura.xml로 이름이 바뀝니다.
- 터미널이 PowerShell일 때 Windows에서 테스트 실행이 실패했습니다.
Code Coverage;Format=cobertura를 감싼 따옴표가 pwsh로 가는 도중 사라져 ;가 명령의 끝으로 읽혔습니다. 이제 레시피는 단어 단위로 터미널에 전달되고, 터미널이 시작하는 셸에 맞게 인용됩니다.
- 생성된 파일이
fuciniCoverage.ignore 때문에 제외되었다고 표시되었습니다. 이제 제외된 파일은 제외한 설정 — ignore, ignore.generated, ignore.namespaces — 별로 집계되므로, 표시된 이름이 바꿔야 할 설정입니다.
- 매크로만 있는 헤더가 더 이상 트리에 100%로 표시되지 않습니다. llvm-cov와 gcov는 매크로 사용을 그것을 정의하는 줄에 계산합니다. 제외된 줄 위의 분기와 함수는 이제 그 줄과 함께 빠지며, 측정할 것이 남지 않은 파일은 실행에서 빠지고 출력에 이름이 표시됩니다(
FUCINI_EXCLUDE_001).
- 지원하지 않는 형식으로 거부되던 다섯 가지 보고서를 인식합니다. Kover의 JaCoCo XML, Stryker.NET 보고서, NCover 보고서, 예전 SimpleCov resultset, 빈 파일이 많은 SonarQube 보고서를 이제 맨 앞에 담긴 내용으로 알아봅니다. 경로에
cobertura라는 단어가 들어 있는 Clover나 SonarQube 보고서는 더 이상 Cobertura로 읽히지 않습니다.
- 그것을 쓴 도구와 일치하는 수치. MC/DC 빌드의 분기 수치가
llvm-cov report와 일치하고, LCOV 2 예외 분기(BRDA:12,e0,1,3)가 집계되며, llvm-cov 함수는 그것을 정의한 파일에서만 선언됩니다. 두 테스트 바이너리가 나열한 Go 블록은 카운트를 더하고, 두 클래스가 보고한 Cobertura 결정과 두 번 나열된 JaCoCo 줄은 모든 분기를 한 번씩 유지합니다.
- 작은 수정들. 쓰다가 끊긴 트레이스 파일에서 더 이상 파일이 빠지지 않습니다. 여러
.gcda 파일에 대한 gcov -t는 각각 별도 파일이 되고, 템플릿 인스턴스는 한 번만 읽히며, gcov -H의 1.20k 같은 카운트도 유지됩니다. GNATcoverage 파일이 모두 커버리지 이후 변경된 것으로 보고되지 않으며, 보류 중인 Stryker 뮤턴트나 중단된 PIT 실행이 더 이상 점수를 깎지 않습니다.
변경됨
- 불러올 때마다 나오던
FUCINI_ENCODING_001이 없어졌습니다. 바이트 순서 표시가 없는 보고서는 모든 도구가 그렇게 쓰듯 UTF-8로 읽으며, 이를 알리는 메모는 나오지 않습니다.
Coverage Studio for Visual Studio 1.2026.5 — 보고서가 나타날 곳을 감시
2026-09-28
추가됨
- 와일드카드가 있는 상대 항목은 어느 깊이에서든 검색됩니다.
coverageFile.paths의 *.lcov.info는 VS Code가 늘 읽어 온 대로 기본 폴더 아래 어디에 있든 그 파일을 찾고, 절대 항목 — ${workspaceFolder}/build/coverage-merged/*.lcov.info, 어느 깊이든 뜻하는 ** — 은 이전처럼 적힌 곳만 정확히 봅니다.
- 보고서가 나타날 곳을 감시합니다. 감시는 설정이 지정한 폴더를 아직 보고서가 있든 없든 포함합니다: 절대 파일의 폴더, 와일드카드 앞의 폴더들 — 패턴이 하위 폴더까지 이르면 그 아래 전부와 함께 — 그리고 상대 와일드카드의 기본 폴더입니다. 빌드가 그곳에 쓰는 보고서는 저절로 로드되고, 그 폴더의 다른 파일에 대한 쓰기는 무시됩니다.
수정됨
- llvm-cov JSON 보고서가 지원되지 않는 형식으로 거부되었습니다. 형식은 처음 4096자에서 인식되는데, llvm-cov는
"type": "llvm.coverage.json.export" 표식을 맨 끝에 쓰고, 첫 파일 레코드에 많은 분기와 중첩된 매크로 확장이 담긴 내보내기에는 그 앞부분에 달리 인식할 만한 것이 없었습니다. 이런 보고서는 이제 다른 어떤 형식에도 없는 시작 부분 {"data":[{"files":[로 식별됩니다.
gcov --json-format도 마찬가지입니다. gcov는 파일의 함수를 줄보다 먼저 쓰므로, 함수가 열두 개쯤 되는 파일 역시 검사하는 앞부분에 줄 항목이 없습니다. 이제 문서 자체의 gcc_version 키가 그것을 식별합니다.
Coverage Studio for VS Code 1.2026.6 — 전체 경로의 와일드카드, 보고서가 나타날 곳을 감시
2026-09-28
추가됨
- 절대
coverageFile.paths 항목의 와일드카드. ${workspaceFolder}/build/coverage-merged/*.lcov.info는 그 폴더의 그런 파일을 모두 로드하고, **는 어느 깊이든 뜻합니다: 첫 와일드카드 앞의 폴더들이 검색되고 나머지는 그 아래의 패턴이 됩니다. Visual Studio 에디션이 늘 그런 항목을 읽어 온 방식입니다. 이전에는 절대 항목을 적힌 그대로 찾았으므로 별표가 있는 항목은 아무것도 맞지 않았고 — 와일드카드이므로 아무것도 맞지 않는다고 보고되지도 않았습니다. 나중에 그곳에 나타나는 보고서는 리터럴 항목처럼 감시자나 폴링이 로드하며, 아무것도 맞지 않는 와일드카드는 빌드를 기다리는 중일 수 있으므로 보고하지 않습니다.
수정됨
- llvm-cov JSON 보고서가 지원되지 않는 형식으로 거부되었습니다. 형식은 처음 4096자에서 인식되는데, llvm-cov는
"type": "llvm.coverage.json.export" 표식을 맨 끝에 쓰고, 첫 파일 레코드에 많은 분기와 중첩된 매크로 확장이 담긴 내보내기에는 그 앞부분에 달리 인식할 만한 것이 없었습니다. 이런 보고서는 이제 다른 어떤 형식에도 없는 시작 부분 {"data":[{"files":[로 식별됩니다.
gcov --json-format도 마찬가지입니다. gcov는 파일의 함수를 줄보다 먼저 쓰므로, 함수가 열두 개쯤 되는 파일 역시 검사하는 앞부분에 줄 항목이 없습니다. 이제 문서 자체의 gcc_version 키가 그것을 식별합니다.
Coverage Studio for 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 for VS Code 1.2026.5 — 두 보고서, 하나의 답, 그리고 커버된 곳은 초록색
2026-09-26
추가됨
- 파일의 보고서를 선택하거나 결합합니다.
coverageFile.sources는 파일별로, 로드된 여러 보고서 중 어느 것이 그 파일을 대표할지 결정하거나 — 보고서를 결합합니다. agree는 모든 보고서가 실행한 줄만 커버된 것으로 계산하고 일치하지 않는 줄을 청록색으로 표시하며, union은 어느 보고서든 실행한 줄을 커버된 것으로 계산합니다. Coverage 보기의 행에서 또는 열린 파일에 대해 Choose Coverage Source...를 실행하면 규칙을 대신 작성해 줍니다. 유료 플랜에 포함되며, Community에서는 가장 최신 보고서가 결정합니다.
- 빨강, 호박색, 초록, 그리고 원클릭 거터 모드.
coverage 모드는 커버된 줄을 초록색으로 칠합니다. 히트맵의 색조는 설정 패널에서 실시간으로 미리 볼 수 있는 설정이며, 상태 표시줄 단추와 Alt+G로 거터를 끄기, 미커버, 커버리지, 히트맵 순으로 전환합니다.
수정됨
- 상태 표시줄의 파일 수치가 그 카드의 수치와 같습니다. 내용이 없는 메트릭 — 결정이 없는 파일의 MC/DC — 이 항목에서는 100%로 계산되고, 그 항목이 여는 카드에서는 전혀 계산되지 않았습니다.
- 상수만 있는 헤더가 더 이상 0%나 100%로 표시되지 않습니다.
excludeComments가 켜져 있으면 전처리기 지시문은 주석처럼 코드가 없는 것으로 계산됩니다.
Coverage Studio for Visual Studio 1.2026.3 — 코드 말고는 고를 것이 없습니다
2026-09-24
변경됨
- Licence 대화 상자는 코드만 묻습니다. 네 개의 플랜 버튼이 사라졌습니다: 구독 코드나 초대 코드는 풀을 가리키고 풀은 자기 플랜을 알고 있으므로, 사람이 코드 자체보다 더 나은 답을 할 수 있는 것이 없었습니다 — 그리고 Pro가 여전히 선택된 채 붙여 넣은 Business 초대는 잘못된 플랜이라며 거부되었습니다. 코드를 붙여 넣고 Activate를 누르세요.
Coverage Studio for VS Code 1.2026.4 — 코드 말고는 고를 것이 없습니다
2026-09-24
변경됨
- Enter Subscription Code는 코드만 묻습니다. 플랜 질문이 사라졌습니다: 코드는 풀을 가리키고 풀은 자기 플랜을 알고 있으므로, 그다음은 서버가 이어받고 더 이상 코드를 잘못된 플랜용이라며 거부하지 않습니다. 이메일의 원클릭 링크는 그대로입니다; 활성화 이메일에는 더 이상 "플랜 선택" 단계가 없으며, 같은 코드로 VS Code 없이 Coverage Studio for Visual Studio를 활성화합니다.
Coverage Studio for Visual Studio 1.2026.2 — 모든 테스트 실행, 모든 보고서, 그리고 무엇이 바뀌었는지
2026-09-24
추가됨
- 모든 테스트 실행 뒤의 커버리지. Collect Coverage in Test Explorer…는 Microsoft의 Cobertura 수집기를 담은
.runsettings 하나를 솔루션 옆에 둡니다 — 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와 행 필터가 VS Code에서처럼 Coverage 창에 있습니다: 복잡한 코드가 적은 커버리지와 만나는 함수를 가장 나쁜 것부터, 그리고 정렬 옆에 전체 파일, 공백이 있는 파일, 테스트되지 않은 파일, 또는 마지막 실행 이후 변경된 파일을 고르는 드롭다운.
- 솔루션 루트의 설정 파일. 솔루션 옆의
fucini-coverage.json은 .vscode/settings.json 다음에 읽히고, 그 파일이 존재하는 파일일 때 설정 창이 거기에 씁니다 — .vscode 폴더를 두고 싶지 않은 팀을 위해. 두 에디션 모두 이 파일을 읽습니다.
- 번거로움 없는 .NET.
ignore.generated는 디자이너 파일, 생성된 파일, obj\와 마이그레이션 파일을 모든 합계에서 제외하고, testRun.skipWhenTestsFail은 실행이 실패로 끝났을 때 마지막 정상 커버리지를 화면에 유지합니다.
이 에디션에 아직 없는 것
- Test Coverage 패널은 VS Code API이고, 솔루션 탐색기는 배지를 표시할 수 없습니다. 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>/ 폴더가 포함되고, Coverlet의 파일 옆에 Microsoft 수집기의 <user>_<machine>_<date>.cobertura.xml도 포함됩니다. Visual Studio에서 테스트를 실행한 .NET 솔루션은 처음 열 때부터 커버리지를 보여 주고, 모든 실행 폴더가 로드되며, 병합은 각 파일에 대해 가장 최근 실행의 결과를 유지합니다.
Visual Studio용 Coverage 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에 쓰고 편집하는 파일의 주석을 유지합니다. - 라이선스: 모든 유료 플랜에 포함. VS Code용 Coverage Studio가 활성화된 컴퓨터는 더 필요한 게 없습니다 — 키를 저절로 찾습니다. 그 외에는 Tools → Coverage Studio → Licence…가 활성화 이메일의 구독 코드를 받습니다. 구독 없이는 커버리지를 읽지 않습니다. Visual Studio에는 무료 등급이 없습니다.
이 에디션에 아직 없는 것
- Run Tests with Coverage와 Test Coverage 패널은 VS Code API이고, 솔루션 탐색기는 배지를 표시할 수 없습니다. Annotated Source 보기, 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에 있고 설치 후 저절로 열립니다 — 는 새 사용자를 커버리지 보고서에서 아무도 테스트하지 않는 줄까지 여섯 단계로 안내하며, 각 단계에는 해당 명령의 버튼이 있습니다. 18개 언어 모두에서.
- 설치 ID를 Visual Studio용 Coverage Studio가 읽는 곳에 남깁니다. Visual Studio 에디션은
license.key의 키를 같은 지문으로 검증하지만 이 확장의 상태 저장소는 읽을 수 없습니다. 이제 활성화할 때마다 ID를 확장의 전역 저장소 옆에도 쓰므로, 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번 줄에 나타났습니다. lcov 2.2의 FNL:/FNA: 쌍도 함께 읽습니다.
- C++ 템플릿은 인스턴스화 하나가 실행되지 않았다는 이유로 전혀 실행되지 않은 것처럼 칠해지지 않습니다. 매크로로 가득한 함수도 매크로마다 하나가 아니라 다시 하나의 함수입니다.
- 동의 문구는 설치본이 실제로 보내는 것을 말합니다. 소스의 월간 페이지는 없으며, 사용 요약에는 키가 발급된 요청 코드가 담깁니다.
추가됨
- 조건 커버리지가 독립된 지표가 되었습니다.
a && b는 하나의 판정이자 두 개의 조건이며, 두 분기를 모두 지나면서도 b가 거짓인 경우를 한 번도 보지 않을 수 있습니다. 이제 고유의 행, 열, 내보내기, 배지, 점수에서의 가중치(3, 분기와 MC/DC 사이), 게이트를 가집니다. BullseyeCoverage, TRACE32의 cond 내보내기, GCC 14의 -fcondition-coverage에서 읽습니다.
- 뮤턴트를, 있는 자리에. PIT와 Stryker 보고서를 뮤턴트 단위로 읽어, 살아남은 뮤턴트를 편집기의 해당 줄에 표시합니다. 툴팁에는 무엇이 바뀌었고 어떤 테스트가 그 줄을 실행했는지가 나오며, HTML 보고서와 주석 소스에도 나열됩니다.
- 이 줄을 실행한 테스트.
--show-contexts로 기록한 coverage.py와 -coverbytest로 수집한 OpenCover는 어떤 테스트가 줄에 닿았는지 말해 줍니다. 실행 횟수 툴팁이 그 이름을 알려 줍니다.
- 실행된 줄에서 한 번도 실행되지 않은 부분이 편집기에서 음영으로 표시되고, C와 C++ 함수는 llvm-cov가 이미 담고 있는 분기 데이터로 계산한 복잡도와 CRAP 점수를 갖습니다.
- JaCoCo, Cobertura, Coverlet 프로젝트가 처음 열 때 바로 로드됩니다. 설정은 필요 없으며, Maven과 Gradle,
dotnet test가 기본으로 쓰는 위치도 찾습니다.
- 어떤 너비에서도 모든 파일 옆에 모든 지표가, 점수에서의 가중치 순으로 놓이고 들어가지 않는 것은 사라지는 대신 옆으로 스크롤됩니다. 다른 곳을 보는 동안 트레이스 파일이 다시 읽히면 Coverage 아이콘에 숫자가 붙습니다.
- 자원해서 참여할 수 있는 사전 릴리스 채널과, 커버리지 표시를 한 번에 끄고 있던 그대로 되돌리는 편집기 제목 표시줄의 버튼.
변경됨
- Bullseye와 TRACE32: 분기 커버리지에 더 이상 조건이 포함되지 않습니다. 판정은 분기 커버리지로, 조건은 조건 커버리지로 갑니다. 따라서 이런 프로젝트의 분기 수치가 달라지고 종합 점수도 함께 달라집니다. 이전 점수로 돌아가려면
whmWeights.conditions를 0으로 두십시오.
- 무료 Community 등급에 주간 허용량이 생겼습니다. 계측되는 각 동작이 하루 20회에서 주 5회로 바뀌었고, 한도에 이르면 구독 또는 7일 이용권을 제안합니다. 이미 사용 중인 설치는 30일 동안 기존 한도를 유지하며, 날짜와 함께 한 번 안내받습니다.
- 체험판과 무료 등급은 라이선스 서버에 사용 원장을 남깁니다. VS Code 머신 ID의 해시, 에디션, 평가를 시작한 날, 계측 동작의 횟수 — 그 밖에는 없습니다. 유료 라이선스에서는 남기지 않으며, 원장을 기다리지도 않습니다. 텔레메트리 교환은 이제 일회성 30일입니다.
- 월간 소스 코드 페이지는 사라졌습니다. 누구에게도 수집·보관·전송하지 않으며, 이전 빌드가 남긴 페이지는 이 빌드의 첫 실행 때 삭제됩니다.
0.2026.82 — 프로젝트에 맞는 임계값, 그리고 보고서에 담긴 모든 정보
2026-09-17
수정됨
- 어두운 테마에서 히트맵이 올바른 방향으로 읽힙니다. 기존 색상 단계는 옅은 노란색에서 짙은 갈색으로 이어졌기 때문에 가장 많이 실행된 루프의 막대가 가장 어둡게 보였습니다. 이제 어두운 테마에는 흐린 올리브색에서 선명한 주황색으로 이어지는 전용 색상 단계가 있습니다.
- MC/DC 호버에 세부 정보가 다시 표시되며, llvm-cov 결정의 조건 수도 올바르게 계산됩니다. 최신 VS Code는 호버를 한 줄로 접어 버렸고,
(a && b) || c는 제목이 3개 쌍 중 2개라고 올바르게 표시하는데도 100%인 조건 하나만 나열되었습니다. - C++ 함수는 작성한 그대로의 이름으로 표시됩니다.
clamp_to<int> 및 gearbox::next_gear처럼 표시되며, 링커의 ??$clamp_to@H@@YAHHHH@Z로 표시되지 않습니다. llvm-cov, lcov, gcov에 적용됩니다. - Istanbul의 줄 수가 nyc와 일치하고,
dotnet-coverage XML을 읽을 수 있으며, SimpleCov의 :nocov: 줄은 오류 없이 제외되고, 요약만 담긴 보고서는 보고서를 어떤 순서로 읽든 그 수치를 유지합니다. - 다중 루트 작업 영역: HTML 보고서가 더 이상 폴더 이름을 두 번 표시하지 않고, Coverage 뷰는 작업 영역 폴더를 그 이름으로 표시하며,
pathRemap 규칙에는 ${workspaceFolder}도 ${workspaceRoot}와 마찬가지로 쓸 수 있습니다.
추가됨
- 보고서에 담긴 모든 정보가 표시됩니다. 함수 호출, 오브젝트 코드, 뮤테이션 점수는 Coverage 뷰, HTML 보고서, CSV 및 Markdown 내보내기에서 열로, 상태 표시줄 카드에서 행으로, 주석이 달린 소스에서 배지로 표시됩니다. 보고서에 없는 메트릭은 0으로 표시되는 대신 생략됩니다.
- 복잡도와 CRAP. 보고서에 순환 복잡도가 담겨 있는 경우(OpenCover, JaCoCo, Clover, Cobertura), 모든 함수의 CodeLens에 CRAP 점수가 표시되고, 파일에는 해당 메서드로 연결되는 Max CRAP이 표시되며, HTML 보고서에는 Riskiest Methods 목록이 나옵니다.
- 모든 형식에서 더 많은 정보를: 이름이 있는 분기 갈래, 제외된 줄, 줄 안의 열 범위, 보고서를 만든 도구와 그 버전 및 날짜, 그리고 도구가 보고서에 기록한 경고.
- 선택적 가중치를 종합 점수에서 오브젝트 코드와 뮤테이션 점수에 지정할 수 있으며, 직접 설정하지 않는 한 둘 다
0입니다.
변경됨
- 기본 임계값은 더 이상 100%가 아닙니다. 설정하지 않은 임계값은 이제 줄 80, 함수 80, 영역 75, 분기 70, 종합 점수 75이며, MC/DC, 인스턴스화, 함수 호출, 오브젝트 코드에는 게이트가 없습니다. 일반적인 프로젝트에 요구할 수 있는 수준입니다.
fuciniCoverage.threshold.profile: "safety"는 이전과 똑같이 모든 게이트를 100으로 되돌리며, 직접 설정한 임계값은 어느 프로필보다도 우선합니다. 이전 기본값에 의존해 왔다면 safety를 선택할 때까지 더 관대한 기준으로 판정됩니다. 이전부터 사용해 온 설치에는 이 사실을 한 번 알려 주며, 이를 설정하는 버튼도 함께 제공됩니다. - 게이트가 없는 메트릭은 카드에서 체크 표시나 X 표시 대신 중립적인 대시로 표시되며, 설정 패널은 실제로 적용 중인 게이트에 따른 판정을 미리 보여 줍니다.
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 집계 보고서를 읽을 수 있으며, 경로 매핑은 ..을 해석하고 세그먼트 전체로 비교합니다. - 편집기에서: 기록은 작업 영역별로 보관되고, 표시는 diff 편집기의 HEAD 창이 아닌 실제 파일에 남으며, 파일 끝을 넘어선 줄은 그리지 않고, Windows의 탐색기 배지가
C:\… 경로에서 동작하며, 큰 실행의 조회가 더 빨라졌습니다.
추가됨
- 진단 보고서 보내기. 실패한 로드, 원격 가져오기, 병합, 기록 비교 또는 채팅 알림에서 제공됩니다. 전송될 JSON을 그대로 미리 보여 주며, 선택적으로 4 KB 파일 샘플, 의견, 회신 주소를 덧붙일 수 있고, 보내기를 클릭하기 전까지 아무것도 보내지 않습니다.
- 오류 보고서. VS Code의 원격 분석 수준이
all 또는 error일 때 FUCINI_* 오류는 파일 내용, 경로, 이름 없이 보고됩니다. 세 로그 줄에 고유 코드가 생겼습니다: 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 — 하루 한 번의 ping
2026-09-14
변경됨
- 작은 ping은 이제 하루에 최대 한 번, 한꺼번에 전송됩니다. 업데이트, 라이선스 변경, 새 커버리지 형식, 읽을 수 없었던 파일은 지금까지 각각 별도의 ping으로, 감지되는 즉시 전송되었습니다. 일부 설치에서는 세션마다 다시 감지되기도 했습니다. 취소된 시트는 시작할 때마다 취소 사실을 보고했고, 서로 다른 형식을 쓰는 워크스페이스를 오갈 때마다 “새로운” 형식 집합이 보고되었습니다. 이제는 이를 모아 하나의 ping으로, 하루에 최대 한 번 전송합니다. 보고할 내용이 없는 날에는 아무것도 전송하지 않습니다.
- 실제로 바뀐 것만 보고합니다. 하루 안에 바뀌었다가 원래대로 돌아온 라이선스는 아무것도 보고하지 않으며, 형식은 마지막 워크스페이스의 형식이 아니라 해당 설치가 지금까지 불러온 모든 형식입니다. 설치 ping과 제거 알림은 여전히 즉시 전송되며, 새로 수집하는 정보는 없습니다.
- VS Code 자체의 텔레메트리 스위치가 이제 작은 ping에도 적용됩니다.
telemetry.telemetryLevel이 off이면 일일 ping을 위해 아무것도 수집하지 않고 아무것도 전송하지 않습니다. 지금까지는 월간 요약과 제거 알림만 이 설정을 따랐습니다. 한 번만 보내는 설치 ping은 바뀌지 않았습니다.
- 편집기를 쓰지 않는 동안 끝난 달도 보고됩니다. 월간 요약은 커버리지를 불러온 뒤에만 확인했기 때문에, 더 이상 쓰지 않는 설치는 마지막 달을 끝내 보내지 않았습니다. 이제 VS Code가 열려 있는 동안 매시간 확인하기도 합니다. 여전히 텔레메트리가 켜져 있을 때만, 여전히 30일에 최대 한 번입니다.
수정
- 서버가 거부한 ping은 더 이상 전송된 것으로 치지 않습니다. 오류를 포함한 서버의 모든 응답을 전달 완료로 간주했기 때문에, 거부된 일일 ping은 수집한 내용을 잃었고 거부된 설치 ping은 다시 시도되지 않았습니다. 이제는 성공한 응답만 인정합니다. 거부된 일일 ping이나 월간 요약은 보관되었다가 하루 뒤에 다시 시도됩니다.
0.2026.78 — 새로운 14일
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
추가됨
- VS Code 자체 Test Coverage 뷰에서 테스트별로 커버리지를 필터링합니다. 트레이스 파일이 테스트 이름을 담고 있으면(lcov의
TN: 섹션) 각 테스트가 Test Explorer의 Fucini Coverage 아래 항목이 되고, Test Coverage 뷰의 각 파일에는 그 안에서 무언가를 실행한 테스트가 나열되며, 하나를 고르면 그 테스트가 도달한 줄이 표시됩니다. - 경로 설정의
${command:…}. ${command:cmake.buildDirectory}/coverage.info는 선택한 CMake 키트를 따라갑니다. 명령은 매번 탐색 전에, 최대 5초 동안, 신뢰할 수 있는 작업 영역에서만 실행됩니다. 실패한 명령은 변수를 쓴 그대로 두고, 출력에 이유를 남깁니다. - 30초 빠른 시작과 다른 도구와의 비교가 이제 Marketplace 페이지와 홈 페이지 맨 앞에 있습니다.
수정됨
- 파일을 테스트마다 따로 기록한 트레이스 파일은 그 파일을 테스트 수만큼 셌습니다. 이제 genhtml이 읽는 방식대로 트레이스 파일마다 기록을 합산합니다. 합계에서 파일은 한 번만 세고, 트레이스 파일을 여러 개 불러와도 어느 테스트의 줄도 사라지지 않습니다.
0.2026.73 — 서명된 업데이트, 그리고 에디션을 바꿔도 유지되는 키
2026-09-11
수정됨
- 설치 ID가 이제 무엇이든 사용하기 전에 저장됩니다. 0.2026.72 빌드 2에서 ID를 호출할 때마다 새로 계산하는 문제는 사라졌지만, 시작할 때는 여전히 쓰기가 끝나기를 기다리지 않았습니다. 그래서 열자마자 닫힌 창이 ID를 잃을 수 있었고, 그와 함께 활성화 키가 연결된 머신 지문도 잃을 수 있었습니다. 이제 시작할 때 기다립니다.
- Pro에서 Community로 전환해도 활성화 키가 무효가 되지 않습니다. 에디션마다 확장 저장소가 따로 있기 때문에 Community는 새 설치 ID와 새 지문으로 시작했지만, 설정에 있는 키(전환 과정에서 무료 잠금 해제를 위해 방금 요청한 키 포함)는 이전 ID에 연결되어 있었습니다. 이제 전환할 때 ID를 넘겨줍니다.
보안
- fucini.software의 업데이트는 서명되며 설치 전에 검증됩니다. 업데이트 피드의 모든
.vsix에는 웹 서버에는 절대 두지 않는 키로 만든 SHA-256 해시와 Ed25519 서명이 들어 있습니다. 내장 업데이터와 Community 전환은 다운로드한 파일로 둘 다 검증하고 그 밖의 모든 것, 즉 프록시의 오류 페이지, 중간에 끊긴 다운로드, 캐시된 이전 빌드, 저희 것이 아닌 파일을 거부합니다. HTTPS만으로는 이를 막을 수 없습니다. TLS를 검사하는 기업 프록시는 거치는 모든 연결에 다시 서명하기 때문입니다. - 릴리스마다 고유한 파일 이름을 가집니다. 업데이트 피드는 이제 릴리스마다 덮어쓰던 파일 대신 버전 번호가 붙은
.vsix를 가리킵니다. 따라서 Cache-Control을 무시하는 캐시가 지난달 빌드를 이번 달 빌드로 제공할 수 없습니다. 다운로드 페이지의 링크는 그대로입니다.
0.2026.72 — 한쪽으로만 테스트된 분기
2026-09-10
추가됨
- 한쪽으로만 테스트된 분기로 이동합니다. Next Partly-Tested Decision와 그 짝인 이전 명령은 일부 갈래는 실행되고 일부는 한 번도 실행되지 않은 분기를 따라갑니다. 미커버 줄 이동으로는 보여 줄 수 없는 빈틈입니다. 문이 실행된 줄은 커버된 것으로 간주되며, 갈래가 아무리 많이 실행되지 않았어도 커버된 상태로 남습니다.
a가 거짓인 채로 한 번만 도달한 if (a && b)는 줄 기준 100% 커버이면서 절반만 테스트된 것입니다. 갈래 단위가 아니라 분기 단위로 한 번 멈춥니다. if/else의 갈래는 여러 쪽 떨어져 있을 수 있고, switch의 다섯 번째 갈래로 뛰는 것은 switch 자체로 뛰는 것보다 알려 주는 바가 적기 때문입니다. 어떤 갈래에도 도달하지 못한 분기는 이미 그곳에서 멈추는 미커버 줄 명령에 맡깁니다. 보고서에 분기가 전혀 기록되지 않은 파일은 모든 분기가 양방향으로 테스트되었다고 주장하는 대신 그 사실을 알려 줍니다.
Reload Coverage는 이미 불러온 것을 그 자리에서 다시 읽습니다. 감시가 꺼져 있으면 테스트를 다시 실행한 뒤 최신 수치로 돌아가는 유일한 방법은 Load Coverage였고, 이는 탐색을 다시 수행하므로 화면에 있는 것과 다른 집합을 가져올 수 있습니다. 이 명령은 지금 불러와 있는 것을 정확히 다시 읽으며, 탐색으로는 다시 찾을 수 없는 수동 선택 추적 파일도 포함합니다.
Copy Coverage Summary는 실행 결과를 Markdown 표로 만듭니다. 커버리지가 가장 낮은 파일이 먼저, 합계 행과 함께, 풀 리퀘스트에 바로 붙여 넣을 수 있습니다. 분기와 MC/DC 열은 실행 중 이를 측정한 것이 있을 때만 나타납니다. 대시로만 채워진 열은 "측정하지 않음"이 아니라 커버리지 0으로 읽히며, 이는 사실과 정반대입니다.
수정됨
- 설치 ID가 세션마다 바뀔 수 있었습니다. 라이선스 지문은 바로 이 ID에서 만들어집니다. 호출할 때마다 새로 계산되었고 쓰기를 기다리는 것 없이 저장되었기 때문에, 두 번째 호출이나 시작 직후 닫힌 편집기 창이 새 ID를 만들 수 있었습니다. ID가 바뀐다는 것은 활성화 키가 더 이상 일치하지 않는다는 뜻이며, 설치 단위로 세는 모든 수치도 부풀렸습니다. 이제 세션마다 한 번만 확정되고, 무엇이든 사용하기 전에 저장됩니다. 빌드 2.
0.2026.71 — 이 줄을 커버한 추적 파일은 무엇인가
2026-09-08
추가됨
- 줄 단위 출처 표시. 추적 파일이 둘 이상 로드되어 있으면 실행 횟수 호버가 이제 커버한 항목: 과 그 줄에서 실행을 기록한 보고서로 끝납니다. 그리고 Coverage 뷰에서 추적 파일 행을 클릭하면, 이제 그 파일이 기여한 줄이 열려 있는 모든 편집기에서 강조됩니다. 지금까지는 그 파일이 측정한 파일만 강조했습니다. 이는 병합된 실행만 답할 수 있고 단일 보고서는 답할 수 없는 유일한 질문입니다. 같은 파일을 측정한 두 추적 파일은 그 줄에 대해 서로 다르게 말하는데, 지금까지 병합은 그 차이를 눌러 없애고 한 번도 보여주지 않았습니다. 병합은 여전히 파일 단위이며 가장 새로운 보고서가 공유 파일을 통째로 가져갑니다. 그래서 줄별 출처는 병합 이전에 색인됩니다. 커버된 줄만 셉니다. 어떤 줄을
0으로 기록한 보고서는 그 줄을 커버하지 않은 것입니다.
- lcov의
TN: 레코드를 드디어 읽습니다. 테스트 스위트를 적어 둔 추적 파일(TN:integration)은 출처가 표시되는 모든 곳에서 coverage.info (integration)로 보이며, 그 이름은 lcov로 다시 내보낼 때 비어 있는 대신 그대로 유지됩니다. 대부분의 도구는 TN:을 비워 두므로 달라지는 것이 없습니다. 이를 채우는 도구가 바로 추적 파일이 병합되는 쪽이고, 그때 어느 것이 어느 것인지 말해 주는 것은 이름뿐입니다.
fuciniCoverage.lineHighlight는 줄 자체를 칠합니다. off | uncovered | heatmap, 기본값은 꺼짐: 커버되지 않은 줄과 부분적으로만 커버된 줄 뒤에 반투명한 색을 깔고, heatmap에서는 실행된 줄 뒤에도 실행 횟수가 많을수록 진하게 깝니다. editorGutter.mode의 네 번째 값이 아니라 별도 설정인 이유는 사람들이 서로 다른 조합을 원하기 때문입니다. 여백은 깨끗하게 두고 빈틈만 칠하거나, 코드 뒤에는 색 없이 막대만 두는 식입니다. 텍스트 아래에 깔리므로 반투명이고, 여백과 같은 이유로 커버된 줄이 아니라 빈틈을 칠합니다.
fuciniCoverage.overviewRuler는 스크롤 막대의 줄무늬를 스스로 정합니다. follow(기본값)는 예전 그대로, 여백이 미커버·부분 커버 막대를 그리는 곳에 줄무늬를 그리고 히트맵에는 그리지 않습니다. uncovered는 editorGutter.mode가 꺼져 있어도 그리므로, 코드 옆에는 아무것도 없이 스크롤 막대에 파일의 빈틈 지도만 남습니다. off는 막대는 두고 줄무늬만 없앱니다. 이전에는 눈금자가 여백에 고정되어 있어 이 두 조합이 불가능했습니다.
수정됨
- 구문 분석에 실패한 추적 파일이 이제 무엇으로 읽혔는지 말합니다. "…형식이 올바르지 않습니다"만으로는 그 파일이 생각하는 형식으로 인식되기는 했는지 알 수 없었습니다. VectorCAST 파서가 거부한 Cobertura 문서와 실제로 잘린 Cobertura 문서는 전혀 다른 문제입니다. 어떤 파서가 파일을 맡았을 때 알림은 이제 이 파일은 cobertura(으)로 읽혔습니다.로 끝납니다. 아무도 맡지 않았다면 아무것도 덧붙이지 않습니다. "이 확장이 읽는 형식이 아닙니다"가 이미 전부를 말하고 있습니다.
0.2026.70 — 오래된 데이터 알림이 아이콘을 다시 표시
2026-09-08
수정됨
- 상태 표시줄 호버의 오래된 데이터 알림이
$(history)라는 문자열 대신 시계 아이콘을 다시 표시합니다. 아래의 수치가 파일의 이전 버전을 설명한다고 알리는 이 알림에는 상태 표시줄 자체와 같은 $(history) 표시가 붙어 있습니다. 상태 표시줄에서는 StatusBarItem.text가 아이콘을 스스로 치환하므로 시계 아이콘으로 그려지지만, 호버는 MarkdownString이라 supportThemeIcons로 직접 활성화해야 하는데 그렇게 하지 않았습니다. 그래서 커버리지를 믿을 수 없는 이유를 설명하는 유일한 줄이 원시 구문으로 시작했습니다. 이제 호버도 이를 활성화합니다.
0.2026.69 — 거터 모드, 원격 추적 파일, 다중 루트 작업 영역과 측정되지 않은 파일
2026-09-08
추가됨
- 에디터 자체 거터가 이제 커버되지 않은 줄이나 실행 횟수 히트맵을 보여 줄 수 있습니다. 기본적으로는 여전히 발견 사항만 보여 주고 — MC/DC 막대, 이전 실행 이후 삼각형, 편집된 줄의 점 — 파일 전체를 색상으로 구분해 보는 것은 여전히 Annotated Source의 몫입니다.
fuciniCoverage.editorGutter.mode로 더 많은 것을 켤 수 있습니다: uncovered는 한 번도 실행되지 않은 모든 줄에 막대를, 분기 갈래가 한 번도 타지 않은 모든 줄에 호박색 막대를 두고 커버된 줄에는 아무것도 두지 않으므로, 초록 벽이 빨간 세 줄을 가리지 않습니다. heatmap은 실행된 모든 줄에 따뜻한 색조를 더하며, 자주 실행될수록 더 뜨겁습니다. Choose Editor Gutter Mode...가 팔레트나 상태 표시줄 메뉴에서 셋 사이를 전환합니다. README는 “네이티브 거터”를 그대로 내세웠는데, 이제 실제로 있는 것을 말합니다. - 인라인 실행 횟수.
fuciniCoverage.hitCounts.inline은 문장이 시작하는 각 줄 뒤에 ×12를 적으며, ×0도 포함합니다 — 늘 호버에 있던 그 숫자를 호버 없이. Toggle Inline Hit Counts가 이를 뒤집고, 상태 표시줄 메뉴는 상황에 맞게 Show 또는 Hide로 제공합니다. - 모든 경로 설정에서
${env:NAME}, ${config:section.key}, ${userHome}, ${workspaceFolderBasename}을 이미 있던 ${workspaceFolder}와 나란히 쓸 수 있습니다. 확장이 모르는 변수는 적힌 그대로 남으므로, 오타는 사라지는 대신 찾아본 경로로 검색 로그에 드러납니다. coverageFile.paths 항목이 http(s):// URL일 수 있습니다. 아티팩트는 로드할 때마다 확장의 저장소로 가져와 그곳에서 로드되며, Coverage 보기는 캐시 경로가 아니라 URL을 표시합니다. 각 가져오기는 조건부(ETag / Last-Modified)여서 바뀌지 않은 아티팩트를 다시 가져와도 아무것도 내려받지 않고, 가져오기가 실패하면 마지막으로 내려받은 사본이 대신 로드되며 이유는 출력에 기록됩니다. fuciniCoverage.remote.headers는 변수가 확장된 Name: value 헤더를 더하고 — Authorization: Bearer ${env:CI_TOKEN}은 토큰을 settings.json 밖에 둡니다 — fuciniCoverage.remote.refreshMinutes는 타이머에 따라 다시 가져옵니다. URL 자체가 파일 이름으로 끝나지 않으면 형식을 알 수 있도록 #lcov.info(또는 다른 파일 이름)를 URL 조각으로 붙이세요. - 로딩과 Generate Full HTML Report가 진행률을 보여 주고, 취소할 수 있습니다. 추적 파일이 열 개 이상이거나 8 MB 이상인 로드는 읽고 있는 파일과 단계(읽기, 그다음 소스 확인)를 알리는 Cancel 버튼이 있는 진행률 알림 아래에서 실행되고, 그보다 작은 로드는 전처럼 상태 표시줄만 돌립니다. 취소하면 이전 실행이 로드된 채로 남고 그렇다고 알립니다. HTML 보고서도 렌더링되어 기록되는 페이지마다 같은 일을 합니다.
- 다시 로드하는 이유가 둘 더 늘었습니다. 작업 영역 밖의 절대
coverageFile.paths 항목 — 체크아웃 옆의 빌드 트리, Bazel 출력 루트 — 도 이제 폴링되므로, 창을 연 뒤 그곳에 나타난 파일이 다시는 들여다보지 않는 대신 로드됩니다. 감시자는 작업 영역만 보았습니다. 그리고 fuciniCoverage.watch.reloadAfterTasks는 watch.enabled가 켜져 있든 아니든 끝나면 커버리지를 다시 로드할 작업의 이름(tasks.json의 label, 또는 Run Task 목록에 보이는 대로 source: name, 예: npm: test)을 지정합니다 — 감시자가 따라갈 수 없는 빌드를 위해서입니다: 심볼릭 링크된 출력 트리를 교체하는 실행, 네트워크 공유의 보고서, 자기 파일을 후처리하는 커버리지 단계. - 다중 루트 작업 영역. 작업 영역의 모든 폴더가 이제 각자의 조건으로 검색됩니다:
coverageFile.defaultLocation, coverageFile.paths, pathRemap, ignore, watch.*, remote.*, badge.*, 보고서 디렉터리, gitDiff.*, problems.perLine, editorGutter.mode, hitCounts.inline이 폴더별로 읽히므로 폴더 자체의 .vscode/settings.json이나 .code-workspace 항목이 적용되고, ${workspaceFolder}는 그 항목이 속한 폴더를 뜻하며, 모든 폴더에서 찾은 추적 파일은 하나의 실행으로 병합되고, Coverage 보기는 파일을 폴더별로 묶습니다. pathRemap 규칙의 ${workspaceRoot}는 추적 파일이 있는 폴더를 먼저 시도한 뒤 나머지를 시도합니다. 폴더 하나가 필요한 것 — 파일 대화 상자, 보고서와 배지 출력, git 메타데이터, Run Tests with Coverage — 은 활성 에디터의 폴더를 쓰고, 폴더가 여럿인데 에디터가 없으면 테스트 실행이 어느 폴더인지 묻습니다. 작업 영역에 폴더가 추가되거나 제거되면 커버리지가 저절로 다시 로드됩니다. 이전에는 열두 곳이 첫 번째 폴더를 썼고, 두 번째 루트는 모든 것의 기준이 어긋났습니다. - 실행이 VS Code 자체의 Test Coverage 보기에 게시됩니다.
fuciniCoverage.testCoverage.publish(기본값 켜짐)로 로드된 모든 실행이 네이티브 Test Coverage 패널, Explorer의 파일별 백분율, 에디터 자체의 “Show Inline Coverage” 토글에도 전달됩니다 — 줄, 분기 갈래, 함수로, 세부 정보는 요청 시 로드됩니다. Show in Test Coverage View는 설정과 무관하게 활성 실행을 게시하고 패널을 열며, 상태 표시줄 메뉴는 quickActions.showTestCoverage 뒤에서 이를 제공합니다. - 파일이 맞지 않으면 경로 재매핑 규칙을 제안합니다. 가장 흔한 “로드는 됐는데 아무것도 켜지지 않는” 경우는 작업 영역에는
src/a.c가 있는데 추적 파일의 경로가 컨테이너나 CI 체크아웃에서 온(/build/src/a.c, /home/runner/work/repo/repo/src/a.c, C:\agent\_work\1\s\src\a.c) 경우입니다. 로드 후 맞지 않는 파일이 남으면 확장은 작업 영역에서 파일 이름을 찾아보고, 그중 가장 많은 것을 설명하는 접두사 규칙을 추론해 [FUCINI_REMAP_002]로 기록하며, 로드 결과가 Apply Suggested Remap을 제공합니다 — 한 번 클릭하면 규칙이 fuciniCoverage.pathRemap에 추가되고 다시 로드됩니다. Suggest Path Remap Rule은 같은 분석을 요청 시 실행합니다. 클릭 없이는 아무것도 기록되지 않습니다. fuciniCoverage.ignore: 결코 세지 않는 파일. 벤더, 생성, 서드파티 파일(vendor/**, **/*.generated.ts, build/**)은 로드될 때 실행에서 빠지므로 Coverage 보기, 상태 표시줄, 임계값, 배지, CodeLens, 기록, 내보내기가 모두 그것들 없이 셉니다. 로드 결과는 몇 개가 빠졌는지 알리고 출력은 그 이름을 밝힙니다. 패턴은 작업 영역 상대 경로와 절대 경로에 맞춰지며, /가 없는 패턴은 .gitignore처럼 어느 깊이에서든 폴더나 파일 이름에 맞습니다. 파일 전체용입니다 — 파일 안의 줄은 계속 도구 자체의 제외 마커를 씁니다. - 줄 단위 Problems 항목, 옵트인.
fuciniCoverage.problems.perLine(off, uncovered 또는 uncoveredAndPartial; 기본값 꺼짐)은 한 번도 실행되지 않은 연속된 줄 블록마다 Information 진단을 하나 둡니다 — 마흔 줄짜리 죽은 함수는 마흔 개가 아니라 한 항목입니다 — 그리고 두 번째 모드에서는 분기 갈래가 한 번도 타지 않은 모든 줄에도 둡니다. 열린 문서에만 적용되므로 파일 이천 개짜리 실행이 패널을 넘치게 할 수 없고, 항목은 버퍼가 편집되면 자기 줄을 따라가며 문서가 닫히면 사라집니다. problems.enabled 뒤의 파일별 항목은 그대로입니다. - README용 커버리지 배지. Generate Coverage Badge는 활성 실행에 대한 shields 스타일 SVG를 작업 영역에 기록하며(
fuciniCoverage.badge.outputPath, 기본값 coverage-badge.svg), README는 호스팅 서비스 없이 로 이를 넣을 수 있습니다. badge.metric이 줄, 분기, MC/DC 또는 가중 점수를 고르고, 색상은 colorScale 단계를 따르며, badge.autoUpdate는 로드할 때마다 다시 기록합니다. Export Coverage Report가 이미 제공하던 SVG 배지도 이제 같은 렌더러를 씁니다. - 측정되지 않음 대 커버되지 않음. 어떤 테스트도 로드하지 않은 파일은 추적 파일에 아예 없으므로, 확장은 그것을 항상 실행 횟수 0인 측정된 파일과 구분해 두었고 — 숫자에서도 빼 두었는데, 모듈 절반에 테스트가 없는 프로젝트가 “92%”로 읽히는 것이 바로 그 방식입니다. 이제 그 구분이 드러납니다: 그런 파일을 열면 상태 표시줄에
not measured가 표시되고, fuciniCoverage.unmeasured.mode가 그 밖에 무엇이 일어날지 정합니다. list는 실행이 측정한 종류의 작업 영역 파일 중 실행에 없는 모든 파일을 담은 Unmeasured 그룹을 Coverage 보기에 더하고, 로드 결과에 그 수를 세고, 배지가 켜져 있으면 Explorer에서 ?로 표시하며, 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 사용자에게 이제 회사 코드가 아니라 초대 코드를 요청합니다. 9월 2일부터 라이선스 서버는 Business 또는 Enterprise 시트에 공유 회사 코드를 받지 않습니다. 그 코드로 확보한 시트는 누구의 것도 아니었기 때문에, 이제 모든 팀 시트는 초대를 받은 주소에 묶이며, 시트를 활성화하는 코드는 그 메일에 담긴
FCI1… 초대 코드입니다. 그런데 설문에서는 필드에 여전히 “회사 코드”라는 레이블이 붙어 있었고, 관리자에게 물어보라는 힌트와 FCB1… 자리 표시자를 보여 주었습니다. 더 이상 통하지 않는 바로 그 코드를 붙여 넣도록 안내하고, 비워 두면 회사 코드를 입력하라고 했던 것입니다. 팀 플랜에서는 이제 필드가 “초대 코드”로 표시되고, 힌트는 코드의 출처와 공유 회사 코드로는 시트가 활성화되지 않는다는 점을 알려 주며, 자리 표시자는 FCI1… 형태를 보여 주고, 검증 메시지는 초대 코드를 요청합니다. Pro는 구독 코드를 그 이름으로 요청합니다. Pro Plus는 변함없습니다. 의도적으로 공유 코드를 유지합니다. 17개 표시 언어 모두에 새 문구가 반영되었습니다.
0.2026.67 — ${workspaceFolder}가 두 경로 설정 모두에서 동작
2026-09-05
수정됨
${workspaceFolder}가 이제 coverageFile.paths에서도 동작합니다. coverageFile.defaultLocation에서는 원래부터 동작했습니다. 두 설정은 나란히 있는데 변수를 설명한 쪽은 하나뿐이어서 사람들은 양쪽에 모두 적었고, ${로 시작하는 항목은 절대 경로가 아니므로 기본 폴더 아래의 리터럴로 검색 glob에 들어가 아무것도 찾지 못했으며 확장은 커버리지가 없다고 알렸습니다. 이제 그런 항목은 먼저 확장되어 절대 경로가 되고, 그대로 존재 여부만 확인합니다. 설정에는 적힌 그대로 남고, 같은 파일을 선택해도 다른 형태로 두 번 기록되지 않으며, Coverage 보기에서 언로드하면 설정에서도 저절로 빠집니다.- 설정되어 있지만 존재하지 않는 트레이스 파일을 이제 출력에서 알립니다. 잘못된 경로를 가리키는 항목은 아무것도 보고하지 않는 유일한 방식으로 실패했습니다. “커버리지를 찾을 수 없음”은 실제로 커버리지가 없는 프로젝트와 구별되지 않습니다.
[FUCINI_DISCOVERY]가 이제 파일을 찾지 못한 각 항목과 찾아본 경로를, 다시 로드할 때마다가 아니라 항목당 한 번씩 알립니다. 와일드카드 항목은 빌드가 무언가를 쓰기를 기다리는 중일 수 있으므로 보고하지 않습니다.
0.2026.66 — 함수 CodeLens에 분기, MC/DC, 점수
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 해상도가 1초보다 거친 파일 시스템은 둘 다 측정한 파일에 동일한 타임스탬프를 보고할 수 있습니다 — 이전에는 승자가
coverageFile.paths 순서로 정해졌고 화면에는 그것을 설명하는 것이 아무것도 없었습니다. 이제 출력 채널이 그렇게 알립니다. [FUCINI_MERGE_TIE]가 두 추적 파일과 공유하는 파일 수를 밝힙니다.
- “Show What Changed Since Last Run”이 파일 행의
… 메뉴에 들어갔습니다. 비교할 이전 실행이 있을 때 쓸 수 있습니다 — Compare with Last Run이 이미 계산하는 것과 같은 파일별 차이를, 트리 전체가 아니라 물어본 그 파일 하나에 맞춘 것입니다. 아무것도 움직이지 않은 파일은 아무것도 내놓지 않는 대신 그렇다고 분명히 말합니다.
- Tune Colour Scale 명령:
colorScale.* 색상과 임계값을 확정하기 전에 실제 Coverage 보기에서 시험해 볼 수 있습니다. 편집할 때마다 설정에 바로 기록됩니다 — 보기는 colorScale/threshold가 바뀌면 이미 다시 그려지므로, 값을 쓰는 것이 곧 미리 보기입니다 — 마지막에 “유지” 또는 “원래 값으로 되돌리기”로 마무리합니다.
- Problems 패널의 파일별 커버리지 공백.
threshold.statement 아래인 로드된 소스 파일마다 한 항목씩, 새 fuciniCoverage.problems.enabled 뒤에 있습니다(기본값은 꺼짐 — 기본 문장 임계값이 100이기 때문입니다). 각 항목은 무엇이 커버되지 않았는지 요약하고(“줄 62% 커버됨 — 커버되지 않은 줄 14개, 커버되지 않은 함수 2개”), 설치된 채팅 확장(Copilot, Claude Code, …)을 그 공백에 대한 테스트를 작성하라는 프롬프트와 함께 여는 빠른 수정을 갖습니다 — 줄 단위 진단은 실제 코드베이스에서 Problems를 넘치게 하므로, 읽는 사람이 실제로 손댈 수 있는 수준인 파일 단위에 머뭅니다.
수정됨
- Coverage 보기에서 누락/불일치/검증된 파일의 이유를 이제 선택하고 복사할 수 있습니다. 이전에는 행의 기본
title 도구 설명에만 있었는데, 브라우저 자체의 것이라 선택할 수 없었습니다. 정확한 이유를 버그 보고서에 붙여 넣으려는 사람은 손으로 다시 입력해야 했습니다. 이제 마우스를 올리면 같은 텍스트가 진짜 스타일이 적용된 패널에 표시되고, 다른 페이지 내용처럼 드래그해 선택할 수 있습니다. 보통 파일의 도구 설명(경로만)은 영향을 받지 않습니다.
- 매개변수 목록이 여러 줄에 걸친 함수가 더는 옮겨졌다고 잘못 보고되지 않습니다.
detectMismatch는 선언의 기록된 줄과 이름이 실제로 발견되는 위치가 최대 두 줄까지 어긋나는 것을 허용했습니다 — 시그니처 줄, 반환 형식 줄, 여는 중괄호 사이의 흔한 어긋남에는 충분하지만, 둘을 얼마든지 멀리 떨어뜨릴 수 있는 여러 줄짜리 매개변수 목록에는 부족했습니다. void LOG_Emit(...) — 매개변수 일곱 개, 한 줄에 하나씩 — 는 여는 중괄호인 163번째 줄에 기록되어 있었는데 "LOG_Emit" is at line 3로 보고되었습니다. 가장 가까운 텍스트 일치가 공교롭게도 파일 머리말 주석에 언급된 함수 자신의 이름이었고, 163번째 줄이나 156번째 줄의 실제 선언과는 전혀 가깝지 않았습니다. 이제 검사는 이름과 기록된 줄 사이의 모든 줄이 끊기지 않은 하나의 선언으로 읽힐 때 — 빈 줄도 없고, 이전 문장이나 블록을 끝내는 줄도 없을 때 — 더 앞에서 발견된 이름도 받아들입니다. 매개변수 목록은 항상 그렇고, 실제로 옮겨진 함수는 거의 그렇지 않습니다. 불일치가 여전히 진짜인 경우, 보고되는 줄은 이제 파일에서 처음 발견된 것이 아니라 기록된 줄에 가장 가까운 일치입니다.
- 출처 배지가 더는 “+N”을 표시하지 않습니다. 더 넓은 실행 위에 모듈 자체 보고서를 불러오면 파일의 배지에 모듈 이름과 함께 그 파일을 측정한 다른 추적 파일 수가 붙었습니다 — “이만큼이 밀려났다”는 뜻이었지만 “이 보고서들이 일치한다”로 읽혔고, 트리에서는 n개 가운데 실제로 어느 것을 뜻하는지 알 길이 없었습니다. 이제 배지는 화면에 있는 숫자의 출처인 추적 파일만 밝힙니다. 도구 설명은 여전히 무엇이 언제 밀려났는지 풀어 씁니다.
- 출처 배지가 더는 옆에 있는 파일 이름을 패널 가장자리 밖으로 밀어내지 않습니다. 배지의 너비가 고정되어 있어서(
flex: none) 행에 자리가 모자라면 파일 이름이 부족분을 모두 떠안고 먼저 잘렸습니다. 둘 중 덜 중요한 쪽이 배지인데도 말입니다. 이제 배지가 파일 이름이 한 글자라도 잃기 전에 자기 너비를 먼저 내줍니다. 파일 이름보다 이미 우선하는 백분율과 막대는 영향을 받지 않습니다.
0.2026.65 — 모듈의 재실행이 더 넓은 실행의 결과를 대체합니다
2026-08-15
변경됨
- 모듈 자체의 재실행이 더 넓은 실행이 그 모듈에 대해 말한 것에 더해지는 대신 그것을 대체합니다. 프로젝트 전체 보고서를 불러온 뒤 그 위에 모듈 하나의 보고서를 불러오면, 이전에는 둘이 공유하는 모든 파일의 실행 횟수가 합산되었습니다 — 그 모듈의 테스트만 다시 돌리면, 더 넓고 이제는 낡은 실행이 이미 보고한 숫자를 새로 고치는 대신 부풀렸던 것입니다. 이제 디스크에서 mtime이 가장 새로운 추적 파일이 자신이 측정한 모든 파일에 대해 완전히 이깁니다. 문장, 분기, 선언, 파일별 집계(분기, MC/DC, 함수, 함수 호출, 객체, 변이 요약)가 모두 그 보고서 하나에서만 옵니다. 두 경로가
coverageFile.paths의 어디에 있든 상관없습니다 — 모듈 재실행이 이기는 것은 우연히 마지막에 로드되어서가 아니라 실제로 더 새롭기 때문입니다. 어떤 파일에 대해 문장을 전혀 보고하지 않는 추적 파일 — TRACE32 목적 코드 내보내기, 실제 보고서 옆에 불러온 Stryker 변이 보고서 — 은 여전히 실제로 담고 있는 요약만 기여하고, 앞선 보고서의 줄/분기 세부 사항은 건드리지 않습니다. 그 경우는 영향을 받지 않습니다. 이로써 두 실행이 측정한 파일별 MC/DC(또는 함수/함수 호출/변이) 집계에서 분자와 함께 분모까지 합산되어 실제 백분율이 낮게 나오던 오래된 결함도 사라집니다. 출처 배지의 도구 설명은 이제 “합산됨” 대신 “_이(가) 이 파일에 대해 말한 것을 대체”라고 말합니다.
수정됨
- Coverage 보기의 긴 파일 이름이 이제 넘치는 대신 줄임표로 잘립니다. 행의 이름 span에
min-width: 0이 빠져 있었습니다. flex 항목의 overflow/text-overflow: ellipsis가 실제로 작동하게 하는 유일한 선언인데, 이것이 없으면 패널이 충분히 좁아졌을 때 긴 이름이 전체 너비를 유지한 채 뒤따르는 출처 배지, 백분율, 막대 아래로 파고들었습니다.
0.2026.64 — Coverage 보기를 점수로 정렬
2026-08-01
추가됨
- Coverage 보기를 이름만이 아니라 점수로도 정렬할 수 있습니다. 모든 행에는 이미 WHM 점수와 지표별 내역이 있지만, 큰 트리에서 가장 나쁜 파일을 찾으려면 알파벳순 목록을 위에서부터 읽어 내려가야 했습니다. 이제 Collapse all / Expand all 옆의 드롭다운에서 파일 이름, 종합 점수, 줄, 분기, MC/DC를 고를 수 있습니다 — 파일 이름을 뺀 모든 모드는 폴더와 파일을 함께 섞어 그 지표 자체의 백분율로 가장 나쁜 것부터 놓으므로, 테스트가 부실한 폴더는 테스트가 부실한 파일과 따로 묶이지 않고 정확히 같은 순위에 놓입니다. 보고 있는 지표에 데이터가 없는 파일(이를테면 분기를 아예 보고하지 않는 형식)은 0%로 읽히는 대신 맨 아래로 갑니다. 선택은 하는 즉시 새
fuciniCoverage.coverageView.sortBy 설정에 기록되므로 창을 다시 로드해도 유지되고, 매번 파일 이름으로 되돌아가지 않습니다.
수정됨
- 여러 줄에 걸친 함수 시그니처가 더는 “옮겨짐”으로 잘못 표시되지 않습니다. Istanbul의
fnMap은 함수에 줄 참조를 두 개 줍니다 — 이름이 있는 줄과 본문이 시작하는 줄 — 그리고 파서는 나중에 소스 텍스트에서 이름을 찾는 불일치 검사에 본문 줄을 골랐습니다. 매개변수 목록이 두 줄을 넘는 함수(100열에서 줄바꿈하는 코드베이스에서는 흔한 일)는 이름의 실제 줄이 기록된 줄에서 너무 멀어, 파일이 Coverage 보기에서 흐려지고 “더 이상 커버리지와 맞지 않음”이라는 잘못된 경고가 붙었습니다. 이제 파서는 이름 자신의 줄을 고르며, 불일치 검사가 처음부터 찾던 것이 바로 그것입니다.
0.2026.63 — 모든 행이 자신의 추적 파일을 밝힙니다
2026-07-20
추가됨
- 각 행이 자신을 측정한 추적 파일을 밝힙니다. 프로젝트 전체 실행 위에 한 모듈의 보고서를 불러오는 것은 같은 파일을 두 번 측정하는 일인데, 트리는 어떤 행이 어느 보고서를 읽고 있는지 아무 말도 하지 않았습니다. 추적 파일이 둘 이상 로드되어 있으면 이제 각 파일 행에 그것을 측정한 보고서 이름 — 여럿이라면 가장 최근에 로드된 것 — 이 붙고, 나머지마다
+1과 그것들을 나열하는 도구 설명이 함께 표시됩니다. 병합은 어느 하나를 이기게 하는 대신 실행 횟수를 더하며, 도구 설명이 그렇게 말합니다. 추적 파일이 하나뿐이면 구분할 것이 없으므로 아무것도 그리지 않습니다.
변경됨
- 확장 자체 페이지가 모든 설정을 실제 기본값과 함께 밝힙니다. 스무 개의 설정에는 아예 항목이 없었고 — 언어, 임계값 셋, 가중치 하나, 빠른 작업 스위치 열다섯 — 원격 분석 항목은 한동안 꺼져 있었는데도 기본값이 켜짐이라고 주장했습니다. 이제 테스트가 기본값까지 포함해 페이지를 매니페스트와 대조합니다.
수정됨
- 이전 릴리스에서 추가된
files.watcherExclude 아래 소스의 재확인이, 자체 설정 이름 대신 그 검사의 나머지와 같이 staleWarning.enabled를 따릅니다.
0.2026.62 — 탐색기는 그대로 두고, 감시되지 않는 소스도 다시 확인
2026-07-06
변경됨
- 탐색기는 그대로 둡니다. 탐색기에서 파일 옆에 붙던 커버리지 배지가 기본적으로 꺼졌습니다. 그 열은 그것을 쓰는 사람의 것이고 — VS Code가 git의 M과 U를 거기에 두며, 배지는 하나만 들어갑니다 — 커버리지 뷰가 같은 파일을 같은 숫자로, 그것을 위해 있는 자리에 보여 줍니다.
explorerBadges.enabled로 그대로 되돌릴 수 있습니다.
수정됨
files.watcherExclude 아래의 소스도 다시 확인합니다. 파일과 커버리지가 여전히 맞는지는 저장과 파일 시스템 감시자가 이끄는데, 그 감시자는 제외된 것에 대해서는 아무 말도 하지 않습니다 — 무엇보다 build/ 아래 생성된 소스가 그렇고, 낡은 표시를 알아채기 가장 어려운 곳입니다. 이제 그런 파일들은 추적 파일과 같은 2초 주기로 점검되고, 실제로 바뀌었을 때만 다시 읽힙니다. 200개를 넘으면 그 주기를 쓰는 대신 출력이 그렇게 알립니다.
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 하나가 다스리며, 커버리지 뷰의 그 추적 파일 행이 어느 쪽이든 다시 내려놓는 자리입니다.
수정됨
- 백그라운드 타이머가 확장과 함께 멈춥니다. 추적 파일 감시자는 창과 함께 정리되었지만, 그 뒤의 2초 폴링과 대기 중인 소스 재확인은 평범한 타이머여서 아무것도 정리해 주지 않았습니다. 확장을 사용 중지하거나, 사용 중지된 상태로 창을 다시 불러오면 그것들이 계속 돌면서 확장이 더는 읽을 이유가 없는 작업 영역을 읽고 있었습니다.
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는 251줄짜리 파일의 "252번째 줄"에 실행 기록을 씁니다 — 불일치 검사는 끝에 줄 바꿈이 있는 모든 PHP 파일에서 이를 모순이라고 불렀습니다. 이제 마지막 줄 바꿈 다음 한 줄은 허용됩니다. 그 이상, 또는 마지막 줄 바꿈이 없는 파일의 끝을 넘어선 참조는 여전히 모순입니다.
0.2026.54 · 빌드 2 — What Community Includes의 평가판 행
2026-03-24
추가됨
- Community 에디션의 What Community Includes에 평가판 행. 그 빌드에는 평가판이 없었으므로 이제 목록이 Pro 목록을 여는 14일 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, 포매터, 생성기 — 은 잠시 후 디스크에서 다시 확인합니다. 실행 결과와 모순되게 된 파일에는 표시가 붙고, 측정된 버전을 되돌리는 체크아웃은 표시를 지웁니다.
- 정확한 차이를 호버에서. 파일이 더 이상 커버리지와 일치하지 않는 곳에서 커버리지 보기와 탐색기 도구 설명은 무엇이 그것을 증명했는지 정확히 알려 줍니다: 추적 파일이 텍스트를 보관했다면 지금의 줄과 보고서가 기록한 줄, 다이제스트를 보관했다면 해당 줄과 실패한 체크섬, 파일 끝을 넘어선 커버리지, 보고서가 가리키는 위치에 더 이상 없는 함수. 같은 세부 정보가 출력 채널에 파일당 한 줄씩 기록되며, 로드 결과의 어떤 파일인지 표시가 그곳으로 안내합니다.
- 탐색기 배지 스위치.
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은 커버리지를 다시 찾아 불러옵니다(macOS에서는 Ctrl+Alt+A / Ctrl+Alt+R). 0.2026.45에서 추가한 두 키처럼 다시 지정할 수 있습니다.
변경됨
- 작업 영역의 어떤 것과도 일치하지 않는 경로가 화면에서 집계됩니다. 어떤 작업 영역 파일로도 해석되지 않는 트레이스 파일 경로는 불러와지지만 결코 표시되지 않습니다 — 가장 흔한 "동작했는데 아무것도 보이지 않는다"입니다 — 그리고 지금까지 유일한 흔적은 출력 채널의
FUCINI_REMAP_001 한 줄과, 이를 고칠 pathRemap 규칙이었으며 아무도 읽지 않았습니다. 불러오기 결과가 이제 이를 집계하며, 어떤 파일?으로 이름과 제안 규칙을, pathRemap 설정 열기로 규칙을 넣을 위치를 보여줍니다. - 상태 표시줄 메뉴의 파일 선택기가 읽는 형식을 명시합니다. 설명에는 여전히 첫 릴리스의 다섯 가지 형식만 있었지만, 이제 lcov, Cobertura, JaCoCo부터 gcov, llvm-cov, TRACE32, 변이 보고서까지 25가지라고 말합니다.
0.2026.46 — 에디션 충돌의 해결책, 그리고 더 조용해진 한도
2025-08-06
변경됨
- 두 에디션이 모두 설치된 경우: 안내문 대신 버튼 두 개. Pro와 Community가 함께 있으면 둘 다 활성화될 수 없고 — 같은 명령과 보기를 정의하기 때문 — 이를 알리는 메시지는 확장 보기로 가는 안내로 끝났습니다. 두 해결책 모두 명령 하나씩이므로 이제 버튼입니다. 이것 유지는 다른 에디션을 제거하고 다시 로드를 제안하며, 확장에서 둘 다 표시는 확장 보기를 정확히 그 둘에 대해 엽니다. 제거가 실패해도 다시 로드는 여전히 제안됩니다 — 어느 에디션이 활성인지는 어차피 다시 로드가 결정합니다.
- 사용 한도는 처음 한 번만 전체 안내되고, 이후에는 상태 표시줄에만 표시됩니다. Community 한도에 처음 도달했을 때는 전체 답변 — 숫자, 요금제, 원격 분석 잠금 해제, 등급에 포함된 항목 목록 — 을 받을 만합니다. 10분 뒤 다섯 번째는 그렇지 않습니다. 같은 세션에서 같은 한도에 다시 도달하면 상태 표시줄에 8초짜리 한 줄만 표시되고 아무것도 중단하지 않습니다. 키를 입력하면 처음부터 다시 시작합니다. 새 라이선스는 새로운 한도 집합이기 때문입니다.
0.2026.45 — Next / Previous Uncovered의 키
2025-07-26
추가됨
- Next / Previous Uncovered에 키가 생겼습니다. 파일을 읽으며 반복해서 누르는 두 명령인데, 지금까지는 누를 때마다 명령 팔레트를 열고 이름을 입력해야 했습니다.
Alt+N은 다음 미커버 범위로, Alt+P는 이전으로 이동합니다(macOS에서는 Option이 문자를 입력하므로 Ctrl+Alt+N / Ctrl+Alt+P). 둘 다 포커스된 텍스트 편집기에서만 동작하며 다른 기본값처럼 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." — 을 만들었고, 이유는 코드와 파서 메시지로 한 채널 떨어진 곳에 있었습니다. 알림은 이제 파일로 시작하고 거부를 실제 원인에 따라 분류합니다. 이 확장이 읽는 형식이 아님, 형식이 올바르지 않음(빌드가 아직 쓰는 중인 것이 보통의 원인), 형식은 올바르지만 아무것도 기록되지 않음(실행이 계측된 코드를 실행하지 않음), 또는 읽을 수 없음. 파서 자체의 말도 함께 전달되고, 여러 파일은 집계되며, 출력 채널은 강제로 열리는 대신 출력 표시 버튼 뒤에 제공됩니다.
- 트레이스 파일에 나열되어 있지만 측정할 것이 없는 파일이 이제 화면에서 집계됩니다. 선언만 있는 헤더는 0 중 0으로 100%를 받는 대신 항상 Coverage 보기에서 제외되었고 — 그 이름은 출력 채널에만 기록되었습니다. 불러오기 결과는 이제 계측할 내용이 없는 파일 N개는 표시되지 않습니다라고 말하며, 어떤 파일? 버튼으로 이름이 있는 채널을 엽니다.
0.2025.42 · 빌드 3 — NCover와 dotCover, 갈 곳 없던 .NET 커버리지
2025-06-08
추가됨
- NCover와 JetBrains dotCover. Coverlet의 Cobertura와 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인 이유는 뮤테이션 점수가 첫날부터 넘어야 할 기준이 아니라 끌어올려야 할 목표이기 때문입니다. - 공정한 실행을 한 번도 받지 못한 뮤턴트는 어느 쪽에도 세지 않습니다. PIT의
NON_VIABLE과 Stryker의 CompileError, Ignored는 도구가 만들어 낼 수 없었던 변이입니다. 이를 미검출로 세는 것은 스위트에 한 번도 제시된 적 없는 결함으로 그것을 처벌하는 셈입니다.
0.2025.40 — GCC 9보다 오래된 컴파일러를 위한 gcov의 일반 텍스트 목록
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% 미만인 실행은, 소스가 설명하지 못하는 컴파일러 생성 코드를 정확히 짚어낸 것입니다. 컴플라이언스 카드는 이를 "94%"로 묻어 두지 않고 "312바이트가 한 번도 실행되지 않음, 행 커버리지는 100%"라고 말합니다. 그 반대 경우 — 소스는 실행되지 않았는데 바이너리 전체가 실행되었다고 보고되는 경우 — 는 낮은 점수가 아니라 모순으로 보고됩니다.
0.2025.38 · 빌드 2 — 함수 호출 커버리지, VectorCAST와 TRACE32 완성
2025-04-01
추가됨
- 함수 호출 커버리지 — 모든 호출 지점이 실행되었는가. 함수 커버리지와는 다른 질문입니다. 세 호출 지점 중 하나에서 한 번 호출된 함수는 함수 항목에서는 완전하지만, 여기서는 3분의 1만 완전합니다. VectorCAST, TRACE32, Cantata 모두 이를 보고했지만, 이 모델에는 그 수치를 담을 곳이 없었습니다.
- 이로써 VectorCAST와 TRACE32가 완성됩니다. 이전 릴리스들은 분기 비율을 부풀리면 결국 감사에 들어가는 수치가 부풀려진다는 이유로, 이 데이터를 분기 커버리지에 접어 넣기를 의도적으로 거부했습니다. 이제 두 형식 모두 항상 보내던 것을 그대로 불러옵니다.
변경됨
- 컴플라이언스 게이트와 가중 점수는 이제 여섯 개가 아닌 일곱 개의 지표를 인식합니다 — 17개 언어 모두에 설명이 담긴 두 개의 새 설정,
fuciniCoverage.whmWeights.functionCalls와 fuciniCoverage.threshold.functionCalls입니다.
0.2025.37 — 위치뿐 아니라 개수로도 세는 함수 커버리지
2025-02-16
변경됨
- 도구가 함수 위치를 알려주지 않아도 이제 함수 커버리지가 집계됩니다. TRACE32의
func 내보내기, VectorCAST의 자체 종료 <method> 요소, EMMA의 method, % 롤업 모두 CodeLens를 놓을 곳이 전혀 없는 상태에서 함수 개수를 명확히 알려주었지만, 셋 다 들어올 때 버려지고 있었습니다. 선언이 존재하는 곳에서는 여전히 그것이 우선 소스이며, 존재하지 않는 곳에서는 이제 도구가 보고한 개수를 대체 수단으로 사용합니다.
0.2025.36 · 빌드 4 — UCIS와 Aldec UCDB, 그리고 한 줄까지 테스트된 새 파서들
2025-02-03
추가됨
- UCIS와 UCDB XML — 시뮬레이터에서 바로 나오는 VHDL과 Verilog. 이 이름에 해당하는 문서는 두 가지이며, 프로젝트에는 그 시뮬레이터가 작성한 쪽이 있으므로 둘 다 읽습니다: Accellera의 표준 교환 형식
<UCIS>와 Aldec 고유의 ux:ucdb(Active-HDL과 Riviera-PRO에서 acdb2xml이 실제로 생성하는 것)입니다. 문 및 분기 커버리지는 전달됩니다. 토글, FSM, assertion, 기능 커버리지는 읽지 않으며, 그런 데이터만 담은 문서는 빈 상태로 불러오는 대신 그 사실을 알려 줍니다. - 오픈소스 VHDL은 이미 여기서 아무것도 필요로 하지 않았습니다. GHDL의 GCC 백엔드는
-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는 doctype까지 완전한 Cobertura 리포트를 작성한 다음, 일반 Cobertura로는 표현할 수 없는 속성들을 추가합니다. 즉 이 파일들은 이미 여기서 로드되고 있었고 완전해 보였습니다 — 그런데
mcdcpair-coverage는 바로 그것을 만들려고 도구를 산 사용자들에게서 조용히 버려지고 있었습니다. 이제 그 쌍 개수는 살아남습니다. MC/DC 게이트, 백분율, 종합 점수에 반영됩니다. - 함수 호출 커버리지는 의도적으로 근사치로 처리하지 않습니다. 이를 분기 커버리지에 접어 넣으면 결국 감사에 들어가는 수치를 부풀리게 됩니다. 모델에 이를 위한 이름이 생길 때까지 기다리며, 그것이 0.2025.38에서 이루어집니다.
변경됨
- Cobertura 리더는 이제 방언(dialect) 정보를 함께 가지고 다닙니다.
<coverage line-rate=…>는 단일 형식이 아니라 하나의 계열이며, 어떤 방언을 읽고 있는지는 요소마다 추측하는 대신 파싱 과정과 함께 전달됩니다.
0.2025.31 — Ada와 Swift, 그리고 스스로 다시 불러오는 커버리지
2024-11-07
추가됨
- GNATcoverage XML — 드디어 Ada. DO-178C 항공전자 및 EN 50128 철도 팀은 이 제품의 안전 가중 점수와 MC/DC 지원이 겨냥해 온 바로 그 사용자층이지만, 지금까지는
gnatcov가 Cobertura까지 출력할 만큼 최신이 아니면 여기서 아무것도 불러올 수 없었습니다(게다가 Cobertura는 줄 아래의 모든 정보를 버립니다). gnatcov coverage --annotate=xml은 파일이 아니라 디렉터리를 씁니다. 소스별 *.xml 파일을 불러오세요 — index.xml을 열면 알 수 없는 오류 대신 커버리지가 실제로 어디에 있는지 알려 줍니다. 부분적으로 커버된 줄은 커버되지 않은 결정을 가진 커버된 줄로 남습니다. 부족분은 분기와 MC/DC 커버리지, 즉 원래 있어야 할 곳에 드러납니다. 면제 영역은 제외된 줄이 되고, 상태가 확정되지 않은 의무는 커버됨이 아니라 커버되지 않음으로 집계되며, --level=stmt+mcdc에서는 MC/DC가 조건 단위로 집계되어 임계값과 종합 점수를 움직입니다.
- BullseyeCoverage, 그리고 Visual Studio
.coveragexml. Bullseye는 임베디드 및 안전 필수 팀이 실제로 보유한 상용 C/C++ 도구입니다. 함께 제공되는 covxml을 실행하고 그 결과를 불러오세요. 대표 지표는 줄 커버리지가 아니라 조건/결정 커버리지이며, 여기서는 둘을 분리해 다룹니다 — 또한 결과가 하나뿐인 프로브는 2가 아니라 1을 기준으로 채점하므로, 완전히 테스트된 switch가 절반만 커버된 것으로 보고되지 않습니다. Visual Studio의 .coveragexml은 Coverlet 대신 MSTest와 vstest를 쓰는 팀을 위해 .NET을 완성합니다. 바이너리 .coverage는 먼저 dotnet-coverage convert로 변환하세요. 부분 커버된 줄은 두 경로 모두에서 그대로 유지됩니다.
- SonarQube 제네릭 커버리지 — 그리고 Xcode에 대한 분명한 답. 두 요소에 네 개의 속성뿐이지만 중요한 이유는, 다른 형식을 전혀 내보내지 못하는 도구라도 대개 이 형식은 내보낼 수 있기 때문입니다. 이 확장이 한 번도 들어본 적 없는 커버리지 도구를 쓰는 프로젝트에도 이제 들어올 길이 생겼습니다. 이는
xcresultparser가 쓰는 형식이기도 하며, Swift와 Objective-C 프로젝트가 여기에 도달하는 경로입니다. .xcresult 자체에는 파서가 없고, 문서는 이제 추측하게 두는 대신 그 이유를 밝힙니다 — xccov는 줄 단위 데이터가 아니라 백분율을 보고하며, 줄 데이터 아카이브는 한 번에 한 파일씩만 읽을 수 있고 그 문서는 자신이 설명하는 파일 이름을 결코 밝히지 않습니다.
- gzip으로 압축된 트레이스 파일이 그대로 로드됩니다.
gcov --json-format은 기본적으로 .gcov.json.gz를 쓰므로, 문서가 광고하던 형식이야말로 대부분의 사람이 실제로는 불러올 수 없는 형식이었습니다. 감지는 이름이 아니라 파일 자체의 매직 바이트로 하므로 .gz를 잃은 압축 보고서도 여전히 동작합니다 — 그리고 이제 gcov의 것뿐 아니라 지원되는 모든 형식이 압축된 채로 들어올 수 있습니다.
- Xcode 자체 리포트에서 가져온 Swift와 Objective-C.
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은 처음부터 텔레메트리 기본 항목이었고, 모든 게이트 바깥에 있어 텔레메트리를 켠 사람 모두에게서 전송됐습니다. 컴퓨터 이름은 대개 사람 이름이거나 자리 번호, 고객사 프로젝트명이며, 사용 현황에 대해 운영체제보다 더 나은 답을 주지 못했습니다. 이제 설치본은 무작위 설치 ID로만 식별됩니다. 이로써 당신이나 당신의 컴퓨터를 지목하는 것은 아무것도 그 컴퓨터를 떠나지 않습니다. 컴퓨터 이름도, OS 사용자 이름도, 홈 디렉터리도, 네트워크 인터페이스도, 파일 경로도, 프로젝트 폴더 이름도, 로그인 계정 표시도 마찬가지입니다. 남는 것은 운영체제와 릴리스, 아키텍처 — 어떤 종류의 컴퓨터인지이지, 어느 컴퓨터인지가 아닙니다.
- 텔레메트리는 이제 늦어도 90일 이내에 삭제됩니다. 이전 정책은 “유용한 동안 보관한다”고만 했는데, 그것은 기간이라 할 수 없습니다.
변경됨
- 유료 라이선스는 이제 커버리지를 스스로 다시 불러옵니다. 추적 파일을 감시한다는 것은 모든 등급에서 빌드할 때마다 “새 커버리지가 감지되었습니다. 불러올까요?”라는 질문을 받는 일이었습니다 — 합리적인 답이 하나뿐인 질문을 시간당 여러 번. 그 확인은 이제 무료 Community의 동작이고, 유료 라이선스는 그냥 불러옵니다. Community는 감시와 감지, 그리고 늘 있던 확인을 그대로 유지합니다.
- 더 이상 일치하지 않는 파일은, 이를 입증한 검사와 함께, 유료 라이선스에서 지목됩니다. 감지 자체는 제한되지 않으며 앞으로도 그렇습니다. 커버리지가 더 이상 그 파일을 설명하지 않는다고 알려주는 것은 팔 만한 것이 아니기 때문입니다. Community도 여전히 결과를 받고, 행은 여전히 흐려집니다. 유료 라이선스가 더하는 것은 지목입니다 — 표시, 탐색기 배지, 그리고 그 뒤의 줄·함수·체크섬.
- 원격 분석은 더 적게 보내고, 누구의 것인지 밝힙니다. 월간 요약에는 더 이상 파일 경로, 프로젝트 폴더 이름, 로그인 계정 이름이 담기지 않습니다. 기능-대-원격 분석 교환은 이제 이메일 주소를 요청합니다. 동의한 분께 그 설치본이 무엇을 보내는지 알리고 요청 시 삭제하기 위해서입니다.
- 설정 설명 세 건을 바로잡았습니다.
watch.enabled, staleWarning.enabled, telemetry.enabled이 각각 코드 동작과 어긋나 있었고, 특히 telemetry.enabled은 실제보다 훨씬 많은 것을 보낸다고 설명하고 있었습니다.
수정됨
- 파일 선택기가 자신이 읽는 형식을 더 이상 숨기지 않습니다. Pick Coverage File이
info, json, xml로만 필터링해, Go의 coverage.out과 gcov의 .gcov.json.gz — 둘 다 이 확장이 읽는 형식 — 이 정작 파일을 고르라는 대화 상자에서 흐리게 표시되었습니다.
- 일반 Community 설치본은 더 이상 소스 한 페이지를 보내지 않습니다. 주석이 달린 소스 샘플을 통제하는 검사가, 실제로 교환에 응한 설치본뿐 아니라 모든 Community 설치본을 응한 것으로 취급했습니다.
- 불러오기당 경고가 둘에서 하나로. 커버리지와 더 이상 일치하지 않는 파일은 거의 언제나 실행 이후 편집되기도 했고, 각각 따로 보고되었습니다.
- 제거 시 OS 사용자 이름과 홈 디렉터리를 더 이상 보고하지 않습니다 — 라이선스가 이를 허용하지 않는 경우에.
0.2025.30 · 빌드 3 — 빌드가 이미 쓰고 있는 것
2024-10-18
추가됨
- Go 커버리지 프로파일.
go test -coverprofile은 표준 Go 툴체인이 만들어 내는 유일한 커버리지 출력입니다. Rust나 Dart, Elixir처럼 기댈 lcov가 없으므로, Go 프로젝트에는 이 확장이 읽을 수 있는 것이 아무것도 없었습니다. 프로파일이 기록하는 것은 줄이 아니라 블록이며, 블록이 걸치는 모든 줄이 그 실행 횟수를 가져갑니다 — 닫는 중괄호까지 포함해, go tool cover -html이 강조하는 그대로입니다. coverage.out이 기본 탐색 이름에 합류했으므로, 아무 설정 없는 Go 프로젝트도 C 프로젝트가 lcov.info를 찾듯 자기 프로파일을 찾습니다.
- Clover XML과 OpenCover XML. PHP 프로젝트가 실제로 가진 것은 Clover입니다.
php-code-coverage는 Cobertura도 낼 수 있지만 기본은 Clover이고, 거의 모든 phpunit.xml이 그것을 설정합니다. 즉 PHP 커버리지는 여기서 읽히지 않은 채였고, 바로 옆에서 Cobertura 파서가 거의 아무도 만들지 않는 출력을 기다리고 있었습니다. Istanbul의 clover 리포터는 같은 문서를 쓰므로, 그렇게 설정된 Jest 프로젝트도 함께 다뤄집니다. OpenCover는 .NET 쪽 대응물입니다. C#과 VB.NET은 이미 Cobertura로 들어오고 있었지만, Cobertura는 판정을 condition-coverage="50% (1/2)"라는 문자열로 눌러 버려서 어느 갈래가 실행됐는지는 파서가 보기도 전에 사라졌습니다. OpenCover는 갈래마다 방문 횟수를 남깁니다 — 분기의 절반이 덮였다는 것과 어느 절반인지를 아는 것의 차이입니다.
- coverage.py의 JSON, 그리고 gcov/gcovr의 JSON. coverage.py의 Cobertura·lcov 내보내기는
# pragma: no cover 줄을 덮였다 또는 빠졌다 중 하나로 부를 수밖에 없습니다. "의도적으로 제외됨"에 해당하는 말이 없기 때문입니다 — 이 확장에는 있습니다. 바로 LCOV_EXCL 표시가 세우는 그 플래그입니다. 덕분에 Python 프로젝트의 pragma는 coverage.py 자신의 보고서에서 뜻하는 바를 여기서도 그대로 뜻합니다. 한편 GCC 커버리지는 lcov나 gcovr -x를 거쳐야만 들어왔습니다. GCC가 이미 만들어 낸 데이터를 변환하려고 두 번째 도구를 돌린 셈입니다. gcov --json-format --stdout과 gcovr --json은 거의 같은 문서를 내보내며, 이제 하나의 파서가 둘 다 읽습니다.
수정됨
- 주석은 파일이 쓰인 언어로 읽힙니다. 비코드 줄 스캐너는 C를 위해 쓰였고 모든 파일에 적용되었습니다. 이 확장이 읽는 모든 형식이 C 계열 언어를 기술하던 동안에는 그것이 옳았습니다. 이제는 아닙니다.
# don't를 만난 C 스캐너는 아포스트로피가 문자열을 열었다고 보고, 닫히는 것을 끝내 보지 못한 채 주석 줄을 코드로 셉니다 — 숫자가 조용히 조금 틀리고, 그것을 알려 주는 것은 아무것도 없습니다. 이제 Python, Ruby, 셸, Perl, R, Elixir, Julia는 #, 셋 다 받아들이는 PHP는 세 형식 모두, 그 밖에는 //와 /* */이며 이것이 알 수 없는 확장자의 기본으로 남습니다 — #define은 코드이고, 그것을 제외하는 것은 반대 방향의 오류가 됩니다.
0.2025.29 · 빌드 4 — 모든 설정에 설명을
2024-10-15
추가됨
- 이제 규정 준수 관련 13개뿐 아니라 모든
fuciniCoverage.* 설정이 그 패널에 자리를 갖습니다. 55개 전부가 공개된 설정 레퍼런스와 같은 섹션에, 같은 순서로 묶였습니다. 설정하는 화면과 읽는 화면이 어떤 설정이 어디에 사는지를 두고 어긋나지 않습니다. 검색 상자는 이름·키·설명으로 걸러 내고, 점프 목록은 섹션 사이를 옮겨 줍니다. 폼은 실행 시점에 확장의 패키징된 매니페스트에서 파생됩니다 — 형식, 기본값, 범위, 열거값, 그리고 모든 설명 문장까지. 따라서 설정에 관해 두 번 적히는 것이 없고, 패널이 자신이 편집하는 확장과 어긋날 수 없습니다.
- 설명은 여러분이 고정한 언어를 따릅니다. VS Code는 확장을 로드할 때 편집기의 표시 언어에서 매니페스트 지역화를 해석하며, 확장별로 그것을 재정의할 방법을 제공하지 않습니다. 그래서 영어 편집기에서
fuciniCoverage.language를 독일어로 두면 설정을 제외한 모든 것이 번역되었습니다. 패널은 그 파일들을 직접 읽고 해석하므로, 그 선택을 존중할 수 있는 유일한 곳입니다.
- JSON 스키마가 요청할 수 없는 위젯들. 설정 스키마에는 문자열이 경로임을 표시하는 수단이 없어 기본 UI가 선택기를 제공할 수 없습니다. 디렉터리를 담는 세 설정에는 이제 찾아보기… 버튼이 붙습니다.
coverageFile.paths와 pathRemap은 원시 JSON 입력란 대신 진짜 목록 편집기를 갖고, 각 colorScale 색상은 16진값 옆에 색 견본을 갖습니다.
변경됨
- 저장은 바꾼 것만 기록합니다. 설정이 13개일 때는 저장이 13개를 모두 기록해도 별문제가 아니었습니다. 55개에서는 한 번의 편집이 두 줄짜리
settings.json에 네임스페이스 전체를 새겨 넣는 일이 됩니다. 값이 실제로 달라진 설정만 기록되고, 기본값과 같은 값은 확장이 이미 제공하는 것을 다시 적는 대신 재정의 자체를 지웁니다.
- 라이선스 키는 항상 사용자 설정으로 저장되며, 해당 행이 그렇게 알려 줍니다.
license.key는 애플리케이션 범위로 선언되어 VS Code가 그곳에서만 읽습니다 — 작업 영역에 쓰는 것은 성공한 것처럼 보이지만 아무것도 바꾸지 않는 저장입니다. 재설정은 이제 선택한 범위의 13개가 아니라 55개 키를 모두 지우므로 먼저 확인을 묻습니다. 그리고 패널 밖에서 이루어진 편집이 더는 읽던 자리를 앗아가지 않습니다. 다시 그리기 전에 비교하므로, 저장을 눌러도 55행이 맨 위로 되돌아가지 않습니다.
0.2025.28 · 빌드 3 — 열세 개의 행, 하나의 결정
2024-10-12
추가됨
- 규정 준수 모드, 일곱 개의 임계값 게이트, 복합 점수의 여섯 가중치가 이제 하나의 편집기에 모였습니다. 설정 UI에서는 서로 무관한 열세 개의 행이지만 실제로는 하나의 결정입니다. 적용 중인 모드가 참조하지 않는 한 임계값은 아무 일도 하지 않고, 가중 게이트가 판정하지 않는 한 가중치도 아무 일도 하지 않습니다. Coverage 뷰 제목 표시줄의 톱니바퀴 버튼에 있는 Fucini Coverage: Configure Coverage Compliance & Thresholds...는 이 셋을 함께 묶고, 모드를 고르는 바로 그 자리에서 각 모드를 설명하며, 게이트가 아무것도 검사하지 않게 되는 구성 — 메트릭별 임계값이 하나도 설정되지 않은 엄격 모드, 임계값이
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가 같은 구성을 가진 이웃 체크아웃에서 해석될 수 있습니다 — 옳아 보이는 틀린 답입니다. 이미 절대 경로이고 존재하는 경로는 그대로 두므로 평범한 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 추적 파일, Cobertura XML, SARIF, 또는 README용 자체 완결형 SVG 배지로 씁니다. 명령 팔레트, Covered Files 뷰 제목 표시줄의 Generate Full HTML Report 옆, 그리고 quickActions.exportReport를 켜면 상태 표시줄 빠른 메뉴에서 쓸 수 있습니다.
- 이제 뷰어가 아니라 변환기입니다. 확장은 이미 lcov, llvm-cov JSON, Cobertura, JaCoCo, Istanbul/nyc, SimpleCov를 읽습니다. LCOV와 Cobertura 작성기가 더해져 반대 방향으로도 갈 수 있습니다. JaCoCo 보고서나 하나의 실행으로 병합된 여러 보고서를 불러와, genhtml·Codecov·Coveralls·SonarQube가 모두 받아들이는 그 하나의 추적 파일을 내보내십시오 — 또는 Jenkins·GitLab·Azure DevOps가 기본으로 수집하는 XML을. 둘 다 확장 자신의 파서를 거쳐 돌아오며, 줄 범위는 줄 단위로 펼쳐지므로 기록되는
LF/LH가 화면의 비율을 근사하지 않고 그대로 일치합니다.
- 모든 작성기가 무엇을 버리는지 밝힙니다. CSV를 제외하면 전부 손실이 있고, 그것도 조용히 일어납니다. MC/DC, 코드 리전, C++ 인스턴스화는 LCOV·Cobertura·SARIF에 표현이 없고, Cobertura는 한 줄의 조건 중 몇 개가 커버됐는지는 남기지만 어느 분기인지는 남기지 않습니다. 측정한 모든 것을 담는 형식은 여전히 Fucini JSON과 두 CSV입니다. CSV에서는 실행이 갖고 있지 않은 지표의 셀이 0이 아니라 비어 있습니다 — 빈 셀은 "이 도구가 분기 데이터를 보고하지 않았다"는 뜻이고,
0은 "어떤 분기도 지나가지 않았다"는 뜻인데, 나중에 스프레드시트로는 둘을 구별할 수 없습니다. 스프레드시트가 수식으로 실행해 버릴 만한 것 — =, +, -, @로 시작하는 필드, 즉 모든 npm 스코프 경로 — 은 쓰기 전에 따옴표로 감싸 무력화합니다.
- SARIF는 diff에 주석을 달고, 배지는 네트워크가 필요 없습니다. 커버되지 않은 범위는
warning이 아니라 note 수준으로 보고합니다. 커버되지 않은 코드는 테스트 스위트에 관한 정보이고, 코드 스캐닝은 경고를 막아야 할 것으로 취급하기 때문입니다 — 실제로 막는 관문은 여전히 Check Coverage Thresholds입니다. 배지는 shields.io에서 가져오지 않고 여기서 그리므로 망 분리 환경이나 온프레미스 저장소에서도 동작하며, 색은 여백과 상태 표시줄과 같은 colorScale에서 가져옵니다. 무료 Community 에디션에서도 선택기는 열리고 두 CSV 모두 동작하며, Export Fucini JSON과 마찬가지로 하루 20회로 제한됩니다. 교환 형식은 유료 계층이며, 이 에디션이 늘 그어 온 선 그대로입니다 — 자기 숫자를 읽는 것은 무료, CI 파이프라인에 넣는 것은 아닙니다.
0.2025.22 · 빌드 3 — 측정할 것이 없다
2024-06-24
수정
- 계측할 것이 없는 파일을 더 이상 100% 커버리지로 보고하지 않습니다. 선언만 있는 헤더(프로토타입, 매크로, 인클루드 가드)에는 함수 본문이 없어 컴파일러가 커버리지 매핑을 전혀 만들지 않으며, 0을 0으로 나누는 모든 것은 100%라고 답합니다. 실제로 테스트된 코드 옆에서 트리에 초록색으로 놓여 있었습니다. 이제 두 리더 모두 도구 자신의 집계를 그 파일이 스스로에 대해 밝힌 내용으로 받아들입니다 — lcov의
LF/FNF/BRF, llvm-cov JSON의 summary 블록입니다. 모든 집계가 0인 파일은 점수를 받는 대신 실행 결과에서 빠집니다. 그 집계 아래의 줄 단위 기록은 일부러 무시합니다. 매크로의 확장은 그것을 정의한 줄에 귀속되지만 카운트는 다른 파일에서 그것을 사용한 줄의 것이며, 그 빌려온 줄이야말로 그런 헤더가 측정된 것처럼 보인 유일한 이유였습니다. 전체 집계에서도 빠지므로 대표 수치는 조금 낮아지고 훨씬 정확해집니다. 제외된 경로는 모두 출력 채널에 이름이 남고, 모든 파일이 선언뿐인 보고서라면 전부 그대로 남깁니다.
변경
- Pick Coverage File이 이미 로드된 것을 대체하지 않고 더합니다. 모듈마다 보고서를 쓰는 빌드에는 고정할 단일 파일이 없는데, 두 번째 모듈의 보고서를 고르면 첫 번째가 조용히 내려갔습니다. 이제 대화 상자는 여러 파일을 한 번에 받고, 선택할 때마다 목록에 더해지며, 선택한 모두가 하나의 실행으로 병합되어 패널에 각 프로젝트 이름 아래로 그려집니다. 감시는 전부를 따라가고, 보고서 하나를 다시 만들어도 나머지가 화면에서 사라지지 않습니다. 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%인 파일이, 그 트레이스 파일의 무엇으로도 넘을 수 없는 기준에 대해 "5개 중 3개 충족"이라고 적힌 카드 아래 놓였던 셈입니다. 데이터가 없는 지표는 이제 판정이 이루어지는 모든 곳 — 파일별 상태 표시줄, 실행 전체 카드, 주석 소스 배너, 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%인 파일은 여전히 0%로 표시됩니다 — 대시는 "측정할 것이 없음"이지 "측정했는데 놓쳤음"이 아닙니다. - 병합된 프로젝트의 행이 엉뚱한 곳을 가리켰습니다. 경로가 자기 루트가 아니라 작업 영역의 루트에서 만들어졌기 때문에, 작업 영역 밖의 파일에 대해 행 메뉴가 복사하고 "Reveal in File Explorer"가 여는 경로는 그 파일이 한 번도 있던 적 없는 곳이었습니다. 이제는 실제로 온 루트를 지닙니다.
변경
- Coverage 보기가 더 이상 작업 영역 루트를 그리지 않습니다. 트리는 파일 시스템 루트에서 시작해 프로젝트 위의 모든 폴더 — 드라이브, 프로젝트를 담고 있는 디렉터리, 그리고 프로젝트 자체 — 를 거친 뒤에야 실제로 사용자의 것인 첫 폴더에 닿았습니다. 모든 행에 여러 단계의 들여쓰기가 있었고, 창 제목이 이미 말한 것을 되풀이하고 있었던 셈입니다. 이제 경로는 작업 영역 폴더에서 시작합니다. 행 메뉴가 복사하고 편집기가 여는 것은 여전히 전체 절대 경로입니다.
0.2025.18 · 빌드 4 — 접어둔 그대로
2024-04-30
수정
- Coverage 보기에서 접어 둔 폴더가 다시 불러올 때마다 다시 펼쳐졌습니다. 감시는 기본적으로 켜져 있으므로 커버리지를 다시 생성하는 빌드가 패널을 다시 그립니다. 그런데 모든 폴더가 펼쳐진 상태로 그려졌기 때문에 접어 둔 상태는 다음 빌드까지만 유지되었습니다. 큰 트리에서는 같은 작업을 한 시간에 여러 번 반복해야 했다는 뜻입니다. 이제 패널은 닫은 폴더를 기억하고 닫힌 채로 둡니다. 이후 실행에서 처음 나타나는 디렉터리는 여전히 다른 폴더와 마찬가지로 펼쳐진 채 표시됩니다. 기억되는 것은 폴더를 닫는 의도적인 동작이지 기본 상태가 아닙니다.
- 텔레메트리를 꺼도 제거 핑이 멈추지 않았습니다. 이 핑은 확장을 제거할 때 VS Code가 실행하는 작은 독립 스크립트가 보냅니다. 이 스크립트는 VS Code API에 접근할 수 없고 설정도 읽을 수 없으므로, 보내지 말라고 알려 주는 유일한 신호는 텔레메트리가 켜져 있는 동안 확장이 기록하는 파일이 없다는 사실입니다. 그런데 텔레메트리를 꺼도 이 파일은 삭제되지 않았습니다. 텔레메트리를 켰다가 나중에 끈 사용자는 확장을 제거할 때 여전히 OS 사용자 이름, 호스트 이름, 홈 디렉터리를 보냈을 것입니다. 이제 텔레메트리가 꺼지는 즉시 파일이 삭제됩니다.
- Pro 갱신이 방금 교체한 키에 대해 성공을 보고할 수 있었습니다. 자동 갱신은 설정된 키를 두 번 읽었습니다. 한 번은 갱신할지 결정하려고, 그다음에 다시 한 번은 무언가를 알릴지 결정하려고였습니다. 갱신이 진행되는 동안 새 키를 붙여 넣으면 두 번째 읽기에서 다른 키를 보게 되었고, “Pro 구독이 갱신되었습니다” 메시지는 이미 교체된 키에 대한 것이었습니다. 이제 키는 한 번만 읽습니다.
변경
- 이제 확장의 모든 모듈이 자체 테스트로 커버됩니다. 테스트가 실제로 어디까지 닿는지 알려 주는 것이 본업인 도구이니 제대로 할 가치가 있다고 보았습니다. 소스 파일 54개 중 53개가 구문, 분기, 함수, 줄 모두에서 100%이고, 나머지 하나인 VS Code 연결 계층은 함수의 95%입니다. 테스트를 작성하면서 위의 결함들과 함께 결코 실행될 수 없는 스무 개 남짓한 방어 코드가 드러났습니다. 이미 그 경우를 배제한 검사 뒤에 서 있어 안전망처럼 보이지만 아무것도 잡지 못하던 대체 경로였습니다. 이들은 실패할 수 없는 테스트로 덮어 두지 않고 제거했습니다.
0.2025.17 — 답할 만한 순간에 묻기
2024-04-27
변경됨
- 선택 설문이 이제 확장을 실제로 사용한 뒤에, 더 알맞은 순간에 묻습니다. 이전에는 설치 이후의 달력 일수를 세었는데, 이는 언제 설치했는지를 잴 뿐 실제로 동작하는 모습을 보았는지는 재지 못했습니다. 그래서 한 달간 손대지 않은 설치에도 아무것도 보여준 적 없는 제품을 평가해 달라고 요청했습니다. 이제는 경과 시간과 함께 실제 커버리지 로드가 필요하며, 편집기가 시작되는 동안에는 나타나지 않고 로드가 성공한 뒤를 기다립니다. 1년 뒤에는 세 번째이자 마지막 초대가 옵니다. 한 분기 안의 두 번은 그때 마침 바빴던 사람을 영구히 제외해 버렸기 때문입니다.
- 네덜란드어 번역에서 경어체를 걷어냈습니다. 전체에서 «u»로 불렀는데, 개발자 도구로서는 딱딱하고 제품의 다른 어조와도 맞지 않았습니다. 모든 네덜란드어 문구가 이제 «je»를 사용하며, 동사 형태까지 함께 바뀌므로 문장 단위로 다시 썼습니다.
0.2025.16 — 회사가 아니라 코드
2024-04-23
변경
- 활성화 양식이 1인 개발자에게 "company code"를 물었습니다. Pro나 Pro Plus를 혼자 구매하면 코드는 본인의 구독에서 발급됩니다. 뒤에 회사가 있는 것이 아니며, 회사 코드를 요구받으면 엉뚱한 양식에 온 것처럼 보입니다. 이 항목은 Pro와 Pro Plus에서 Subscription code로 바뀌고, 팀이 실제로 하나를 공유하는 Business와 Enterprise에서는 Company code로 남습니다. 아래 안내 문구는 이미 요금제별로 작성돼 있었고, 라벨만 일반적인 채로 남아 있었습니다.
0.2025.15 · 빌드 3 — 당신이 정한 기준으로
2024-03-25
수정됨
- 생성된 HTML 보고서는 어떤 임계값을 설정했든 코드를 100% 기준으로 판정했습니다. 상태 열이 모든 지표를 숨겨진 100과 비교했기 때문에, 기준을 80으로 정하고 이를 충족한 프로젝트조차 같은 실행, 같은 페이지에서 빨간 ✗가 늘어선 열 바로 위에 녹색 COMPLIANT 배너를 보게 되었습니다. 지표 범례도 마찬가지였습니다. 이제 둘 다 설정한 임계값을 사용하며, 적용되는 임계값이 없는 곳에서는 없는 판정을 만들어내는 대신 흐린 대시를 표시합니다.
- 컴플라이언스 배너는 실제로 확인한 것보다 많은 것을 주장했습니다. 가중 점수만 검사하는 기본 모드에서도 항상 "구성된 모든 임계값 충족"이라고 표시되어, 아래 표에서 한 임계값이 분명히 미달인데도 모두 충족했다고 주장할 수 있었습니다. 이제 각 모드가 실제로 적용한 규칙을 밝힙니다.
- README에는 확장이 "2026-12-31까지 무료로 동작한다"고 적혀 있었습니다. 제품에 그런 날짜는 존재하지 않습니다. 이전 릴리스가 설정 설명에서는 이 문구를 바로잡았지만, 마켓플레이스에서 가장 먼저 읽히는 README는 놓쳤습니다. 이제 실제 동작을 설명합니다. 첫 사용부터 14일 체험, 이후에는 무료 Community 등급이며, 무언가가 멈추는 날짜는 없습니다.
0.2025.14 — 구별되도록
2024-03-15
변경됨
- 두 에디션이 마켓플레이스에서 더 이상 똑같아 보이지 않습니다. Pro와 Community는 하나의 소스 트리에서 빌드되며 지금까지는 아이콘도 마찬가지였습니다. 그래서 두 항목은 같은 검색 결과에 나란히 놓인, 설명만 다른 동일한 그림이었습니다. 이제 각 에디션은 고유한 아이콘을 갖습니다. 같은 그림 아래에 색 띠를 두어 Pro는 청록, Community는 슬레이트로 구분합니다. 아이콘이 크게 표시될 때는 단어가 둘을 구별해 주고, 검색 결과 행에서는 단어가 너무 작아 읽을 수 없으므로 색이 그 역할을 대신합니다.
0.2025.13 — 지금 있는 자리에서 바로
2024-02-26
수정됨
- 주석 보기를 열어도 더 이상 다시 열 수 없게 되지 않습니다. 주석 소스 패널은 텍스트 편집기가 아니라 웹뷰이므로, 거기에 포커스가 있는 동안 확장은 "현재 파일"을 볼 수 없었습니다. 그 상태에서 Open Annotated Source를 실행하면 "커버리지가 로드된 파일을 먼저 여세요"라고 답했습니다 — 커버리지가 분명히 있는 파일의 주석 보기를 보고 있는 사람에게 말이죠. 이제는 눈앞의 패널 뒤에 있는 파일로 대체됩니다. 같은 분기는 두 번째 실행이 존재하는 이유인 재확인도 조용히 건너뛰고 있었습니다. llvm-cov HTML 보고서가 설정되어 있을 때 패널을 그 보고서 자체 페이지로 전환하는 것이 바로 재실행이기 때문에, 커버리지 빌드가 패널을 연 뒤에 끝났다면 패널에서는 그것을 가져올 방법이 없었습니다.
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%로 표시될 수 있었습니다. 측정할 것이 없는 지표는 이제 점수에서 완전히 제외되며, 해당 행도 «0 / 0 조건 커버»로 표시되는 대신 사라집니다.
- 라이선스 상태가 이제 17개 언어 모두로 번역되었습니다. 계속 영어로 남아 있었고, 이미 번역된 문장 안에 들어가기 때문에 상태 표시줄, 알림, 커버된 파일 패널에서 절반만 번역된 줄이 나타났습니다.
- 주석이 달린 소스 보기와 커버리지 마우스오버 정보도 번역되었습니다 — 규정 준수 세부 내역 표, 탐색 버튼과 툴팁, 분기 및 MC/DC 세부 정보입니다.
변경됨
- 유료 Pro 구독을 전용 코드로 활성화할 수 있습니다. 키 요청의 플랜 목록에 Pro 항목이 추가되어, Pro 구독과 함께 제공되는 코드를 마침내 입력할 수 있습니다. 개인용 Pro 키는 여전히 완전히 오프라인으로 동작하며 활성화 후 서버에 연결하지 않습니다.
- 활동 표시줄 아이콘이 더 크고 알아보기 쉬워졌습니다 — 기본 제공 아이콘 옆에서도 뚜렷합니다.
- Community 에디션으로 전환할 때 이제 fucini.software에서 설치합니다. 이전에는 Community 에디션이 게시되어 있지 않은 Marketplace를 시도했기 때문에, 전환 후 확장이 하나도 설치되지 않은 상태가 될 수 있었습니다.
0.2025.10 · 빌드 5 — 더 부드러운 착륙
2023-12-08
변경됨
- 만료된 구독이 이제 무료 등급으로 안착합니다 — 개인용 활성화 키가 만료되면 확장 프로그램이 갱신을 무한정 요청했습니다. 갱신하지 않기로 하는 것은 구독의 정상적인 종료이지 결함이 아니므로, 이제는 그 대신 영구 무료인 Community 등급으로 내려앉습니다. 팀 요금제는 의도적으로 영향을 받지 않습니다. 만료된 Pro Plus, Business, Enterprise 키는 여전히 만료로 보고되는데, 그 경우에는 관리자가 갱신해야 하며 회사 전체를 조용히 무료 등급으로 떨어뜨리면 그 사실이 가려지기 때문입니다.
수정됨
- 텔레메트리를 끄는 설정이 이제 모든 경우에 존중됩니다. 확장 프로그램의 내부 상세 진단 모드가 켜져 있을 때 한 코드 경로가 이 확인을 건너뛸 수 있었습니다. 이 모드는 게시된 모든 빌드에서 꺼져 있으므로 실제로 그렇게 동작한 릴리스는 한 번도 없었지만, 이제 이 확인은 무조건 수행됩니다.
- 설정이 다시 로드를 기다리지 않고 즉시 적용됩니다. 경로 재매핑, 주석 제외, git-diff 필터링 또는 제외된 파일 합계를 수정하면 이제 커버리지가 곧바로 다시 로드됩니다 — 특히 경로 재매핑은 경로가 서로 맞지 않기 때문에 바로 그때 찾게 되는 설정이기 때문입니다.
- "Unlock Full Features"와 "Switch to Community"이 도중에 멈출 수 있었습니다. 그것도 아무런 안내 없이 말입니다. 이제 둘 다 끝까지 실행됩니다.
- 활성화 키가 동일한 머신 ID에 계속 연결된 상태로 유지됩니다. 일부 환경에서는 이 ID가 세션 간에 다시 생성될 수 있었고, 그로 인해 이미 발급된 키가 무효화되었습니다.
0.2025.9 — 번역 완성
2023-12-02
추가됨
- 제공되는 17개 언어 전체의 번역 완성 — 활성화 및 라이선스 대화 상자, 선택적 피드백 설문, Community 잠금 해제 흐름, 자체 업데이트 알림을 포함해 비교적 새로운 인터페이스 문자열 약 100개가 영어 이외의 모든 번들에서 여전히 영어로 대체되고 있었습니다. 이제 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 — 동일한 소스로 빌드된 별도의 전용 배포본으로, 유료 등급의 체험/활성화/팀 요금제 코드가 단순히 숨겨진 것이 아니라 실제로 존재하지 않습니다. 다운로드 페이지를 참조하세요.
변경됨
- Community 기준선에서는 Full HTML Report 생성과 상시 Annotated Source 보기(일반 및 나란히 보기)가 이제 유료 등급 기능입니다 — 제자리에서 전환하는 토글 보기만 남으며, 이전과 마찬가지로 월 단위 한도가 적용됩니다. 잠금을 해제하면 여전히 모두 사용할 수 있습니다.
- Community 등급의 사용량 한도 경고가 이제 하나의 안내에서 두 가지 방법을 모두 제시합니다. 유료 요금제를 보거나, 텔레메트리로 잠금을 해제하는 것입니다.
수정됨
- 상세하고 개인을 식별할 수 있는 텔레메트리(OS 사용자 이름, 홈 디렉터리, CPU/RAM 사양, 네트워크 인터페이스, 전체 보고서/소스 내용)는 이제 Community 또는 텔레메트리를 조건으로 하는 무료 권한에서만 전송될 수 있습니다 — 로컬 텔레메트리 설정과 관계없이 유료 Pro/Pro Plus/Business/Enterprise 라이선스에서는 절대 전송되지 않습니다.
- 이전 빌드를 이미 실행 중이던 설치본이 업그레이드했다는 이유만으로 새 체험 기간을 다시 받는 일이 없어졌습니다 — 기존 체험 기간이 이미 끝났다면 이제 올바르게 Community 등급으로 전환됩니다.
- 업데이트 알림, 다운로드 진행 상황, 오류 메시지가 내부 빌드 번호를 노출하는 대신 간결한
Major.Year.Minor 버전(VS Code 확장 보기에 표시되는 것과 동일)을 표시합니다. 예를 들어 0.2024.6.2가 아니라 0.2024.6입니다.
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 등급으로 전환됩니다. 요청 시 라이선스 키가 자동으로 발급됩니다. 자세히 보기 →
변경됨
- 자동 활성화 — 이제 키를 요청하면 짧은 설문지가 제출되고, 반환된 키가 이메일 왕복 없이 설정에 자동으로 적용됩니다.
- 더 빠른 갱신 — 갱신 요청은 사용 및 요청 사항 질문만 물어봅니다. 이전 요청의 연락처 정보가 재사용되며 다시 묻지 않습니다.
- 고정된 평가 기간 — 체험판은 이제 설치 기준 이전의 14일 카운트다운 대신, 모든 사용자에 대해 2026-12-31까지 진행됩니다.
- 현지화된 활성화 흐름 — 갱신 설문지와 활성화 확인 메시지가 이제 확장 프로그램의 나머지 부분과 마찬가지로 지원되는 18개 언어로 번역되었습니다.
0.2024.1 · 빌드 3 — 더 스마트한 업데이트 확인
2023-06-02
이제 확장 프로그램은 fucini.software와 VS Code 마켓플레이스를 모두 확인하여 항상 더 최신 버전을 제공합니다.
수정됨
- 이중 소스 확인 — 이제 fucini.software와 VS Code 마켓플레이스를 모두 조회하여 더 최신 버전을 제공합니다.
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을 자동으로 감지합니다.
- 결정론적 병합 — 여러 트레이스 파일을 로드 순서와 관계없이 안정적으로, 기록된 출처와 함께 하나의 실행으로 결합합니다.
- 네이티브 커버리지 UI — 라인/브랜치/함수 거터, 개요 눈금자, 내장 Test Coverage 패널.
- MC/DC 커버리지 — 호버 시 결정별 세부 분석과 선택적인 색상 여백 거터.
- 종합 점수 — 라인, 브랜치, 함수, 리전, MC/DC, C++ 인스턴스화에 대한 SIL 가중 조화 평균.
- 컴플라이언스 판정 —
strict, whm, both, either 모드를 지원하는 COMPLIANT / NON-COMPLIANT 게이팅.
- 경로 재매핑, 차이 커버리지, Explorer 배지, 프로젝트 전체 상태 표시줄.
- 에디터 내 분석 — 함수 CodeLens, 브랜치 호버, 데드 코드 경고, 오래된 커버리지 경고, Next/Previous Uncovered.
- 커버된 파일 보기, HTML 보고서, 기록 및 추세, watch 모드, Fucini JSON 내보내기.