코드 검사를 사용하여 테스트할 코드 범위 결정

프로젝트의 코드 중 유닛 테스트와 같은 코딩된 테스트를 사용하여 테스트할 부분을 결정하려면 Visual Studio의 코드 검사 기능을 사용합니다. 버그로부터 효과적으로 보호하려면 코드의 상당한 부분을 실행 또는 ‘검사’해야 합니다.

코드 검사 분석은 관리형(CLR) 코드와 비관리형(네이티브) 코드에 적용할 수 있습니다. 정적 계측과 동적 계측이 모두 지원됩니다. 명령줄 시나리오에서 코드 검사를 사용하려면 네이티브 코드도 지원하는 dotnet-coverage의 확장인 vstest.console.exe 또는 Microsoft.CodeCoverage.Console 도구를 사용합니다.

테스트 탐색기를 사용하여 테스트 메서드를 실행할 때 테스트 메뉴에서 코드 검사 옵션을 사용할 수 있습니다. 결과 테이블에는 각 어셈블리, 클래스 및 절차에서 실행된 코드의 백분율이 표시됩니다. 소스 편집기는 테스트된 코드를 강조 표시합니다. Cobertura와 같은 인기 있는 형식으로 결과를 내보낼 수 있습니다.

요구 사항

코드 검사 기능은 Visual Studio Enterprise Edition에서만 사용할 수 있습니다.

참고 항목

.NET 코드 검사의 경우 명령줄 도구인 dotnet-coverage를 사용할 수도 있습니다.

코드 검사 분석

  1. 테스트 메뉴에서 모든 테스트에 대한 코드 검사 분석을 선택합니다.

    코드 검사 분석이 강조 표시된 테스트 메뉴의 스크린샷.

    코드 검사 분석이 강조 표시된 테스트 메뉴의 스크린샷.

    또한 테스트 탐색기 도구 창에서 코드 검사를 실행할 수 있습니다.

  2. 테스트가 실행된 후 실행된 줄을 확인하려면 코드 검사 결과 창에서 Visual Studio 코드 검사 분석 메뉴의 스크린샷코드 검사 강조 표시를 선택합니다. 기본적으로 테스트에 포함된 코드는 연한 파랑으로 강조됩니다.

    코드 검사가 강조 표시된 스크린샷.

    코드 검사가 강조 표시된 스크린샷.

    코드 검사 색 표시 옵션의 드롭다운 목록에서 코드 줄, 왼쪽 여백의 문자 모양 또는 둘 다에 색 지정이 적용되는지 여부를 선택할 수 있습니다.

  3. 색을 변경하거나 굵게 표시하려면 도구>옵션>환경>글꼴 및 색>설정 표시: 텍스트 편집기를 선택합니다. 표시 항목에서 “검사” 항목(예: 검사가 수행되지 않은 영역)에 대한 설정을 조정합니다.

    코드 검사 글꼴 및 색을 표시하는 스크린샷

    코드 검사 글꼴 및 색을 표시하는 스크린샷.

  4. 결과에 검사가 낮게 표시되는 경우, 코드에서 실행되지 않은 부분을 확인한 다음 검사할 추가 테스트를 작성합니다. 개발 팀을 일반적으로 약 80%의 코드 검사를 목표로 합니다. 경우에 따라 더 낮은 검사도 허용됩니다. 예를 들어, 일부 코드가 표준 템플릿에서 생성된 경우 낮은 검사가 허용됩니다.

코드 검사를 최적화하려면 다음을 수행합니다.

  • 컴파일러 최적화를 끕니다.
  • 비관리(네이티브) 코드를 사용하는 경우 디버그 빌드를 사용합니다.
  • 각 어셈블리에 대한 .pdb(기호) 파일을 생성합니다.

예상한 결과를 얻지 못한 경우 코드 검사 문제 해결을 참조하세요.

코드를 업데이트한 후 반드시 코드 검사를 다시 실행하세요. 검사 결과 및 코드 강조는 코드를 수정한 후 또는 테스트를 실행한 경우 자동으로 업데이트되지 않습니다.

Visual Studio 2022 업데이트 2부터 도구 > 옵션 > 환경 > 미리 보기 기능을 선택하고, 코드 검사 환경 개선 사항을 선택한 다음, Visual Studio를 다시 시작하여 더 빠른 코드 검사 테스트 결과를 구현할 수 있습니다.

블록 또는 줄에서 보고

코드 검사는 블록으로 계산됩니다. 블록은 진입점과 진출점이 정확히 하나씩인 코드의 일부입니다. 테스트 실행 중 프로그램의 제어 흐름이 블록을 통과할 경우 해당 블록은 검사된 것으로 계산됩니다. 블록이 사용된 횟수는 결과에 영향을 미치지 않습니다.

또한 테이블 머리글에서 열 추가/제거를 선택하여 줄에 대해 결과를 표시할 수 있습니다. 일부 사용자는 백분율이 소스 코드에 표시되는 조각 크기와 더 가깝기 때문에 줄 수를 더 선호합니다. 긴 계산 블록은 여러 줄을 차지하는 경우에도 단일 블록으로 계산됩니다.

코드 줄에는 코드 블록이 둘 이상 있을 수 있습니다. 이와 같은 경우인 데다 테스트 실행에서 줄의 코드 블록을 모두 실행할 경우에는 하나의 줄로 계산됩니다. 줄에서 코드 블록이 전체가 아닌 일부만 실행되면 이는 부분 줄로 계산됩니다.

코드 검사 결과 필터링

일반적으로 코드 검사 결과 창에는 전체 솔루션에 대한 결과가 표시됩니다. 결과를 필터링하여 현재 분기에서 업데이트된 파일의 결과만 표시할 수 있습니다.

  • 변경 집합 보고서를 보려면코드 검사 결과 창에서 코드 검사 보기 구성 아이콘을 선택합니다. 그런 다음 보고서 콘텐츠 드롭다운에서 변경 집합 보고서를 선택합니다. 비교 보고서를 제공하려면 활성 리포지토리 및 기본 분기를 업데이트하여 비교합니다.

코드 검사 결과 창의 검색 상자에서 보고서를 필터링할 수 있는 여러 가지 방법이 있습니다.

  • 이름으로 검색하려면(창에서 검색 문자열과 일치하는 항목만 표시) 검색 상자에 검색 문자열을 입력합니다.
  • 형식별로 필터링하려면 검색 상자에 형식의 이름을 입력합니다.
  • 모두 표시하려면 검색 상자를 선택 취소합니다.
  • 100% 완전 검사된 코드를 표시하려면 검색 상자에 "Covered (%Lines)":"100"을 입력합니다.
  • >&&<<부분적으로 검사된 코드(0% 100%)를 표시하려면 "Partially Covered (%Lines)":"##"를 입력합니다(##을 검사 백분율로 바꿈).
  • 0% 검사된 코드를 표시하려면 검색 상자에 "Not Covered (%Lines)":"0"을 입력합니다.

코드 검사 결과 관리

일반적으로 코드 검사 결과 창에는 가장 최근 실행 결과가 표시됩니다. 결과는 테스트 데이터를 변경할 경우 또는 매번 테스트의 일부만 실행할 경우 달라집니다.

코드 검사 결과 창은 이전 결과 또는 다른 컴퓨터에서 얻은 결과를 보는 데에도 사용할 수 있습니다.

여러 실행(예: 다른 테스트 데이터를 사용하는 실행)의 결과를 병합할 수 있습니다.

  • 이전 결과 집합을 보려면 드롭다운 메뉴에서 선택합니다. 이 메뉴에는 새 솔루션을 열 때 삭제되는 임시 목록이 표시됩니다.

  • 이전 세션의 결과를 보려면코드 검사 결과 가져오기를 선택하고, 솔루션에서 TestResults 폴더를 탐색하고, .coverage 파일을 가져옵니다.

    .coverage 파일이 생성된 이후 소스 코드가 변경된 경우 검사 강조 표시가 잘못될 수 있습니다.

  • 결과를 텍스트 형식으로 읽으려면코드 검사 결과 내보내기를 선택합니다. 그러면 다른 도구로 처리하거나 메일로 쉽게 전송할 수 있는 읽기 가능한 .coveragexml 파일이 생성됩니다. Cobertura와 같은 내보내기 형식을 선택할 수도 있습니다.

  • 결과를 다른 사람에게 전송하려면.coverage 파일 또는 내보낸 .coveragexml 파일을 전송합니다. 그런 다음 수신자는 파일을 가져올 수 있습니다. 동일한 버전의 소스 코드가 있으면 검사 강조를 볼 수 있습니다.

다른 실행에서 결과 병합

테스트 데이터에 따라 코드에 다른 블록이 사용되는 경우가 있습니다. 따라서 여러 테스트 실행에서 결과를 결합할 수 있습니다.

예를 들어, 입력 "2"로 테스트를 실행할 경우를 가정하면 특정 함수의 50%만 검사됩니다. 입력 “-2”로 다시 테스트를 실행하면 검사 강조 보기에서 함수의 나머지 50%가 검사된 것을 확인할 수 있습니다. 이제 두 테스트 실행의 결과를 병합하면 보고서와 검사 강조 보기에 함수의 100%가 검사된 것으로 나타납니다.

코드 검사 창의 병합 단추 아이콘.코드 검사 결과 병합을 사용하여 이 작업을 수행합니다. 최근의 실행 또는 가져온 결과의 조합을 선택할 수 있습니다. 내보낸 결과를 결합하려면 내보낸 결과를 가져와야 합니다.

병합 작업 결과를 저장하려면 코드 검사 결과 내보내기를 사용합니다.

병합 제한 사항

  • 다른 코드 버전의 검사 데이터를 병합하는 경우 결과가 별도로 표시되지만 결합되지 않습니다. 완전히 결합된 결과를 얻으려면 동일한 빌드의 코드를 사용하고 테스트 데이터만 변경하세요.

  • 내보낸 다음 가져온 결과 파일을 병합할 경우 결과를 블록 단위가 아닌 줄 단위로만 볼 수 있습니다. 줄 데이터를 보려면 열 추가/제거 명령을 사용합니다.

  • ASP.NET 프로젝트 테스트의 결과를 병합할 경우 별도 테스트의 결과가 표시되지만 결합되지는 않습니다. 이 동작은 ASP.NET 아티팩트 자체에만 적용되며, 다른 어셈블리의 결과는 결합됩니다.

코드 검사 결과에서 요소 제외

코드가 텍스트 템플릿에서 생성된 경우와 같이 검사 점수에서 코드의 특정 요소를 제외하려는 경우가 있습니다. System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute 특성을 class, struct, method, property, property setter 또는 getter, event 코드 요소에 임의로 추가할 수 있습니다.

클래스를 제외해도 해당 파생 클래스는 제외되지 않습니다.

예를 들면 다음과 같습니다.

using System.Diagnostics.CodeAnalysis;
...
public class ExampleClass1
{
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }

}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }

다음과 같은 매크로를 사용합니다.

ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");

  • ExclusionName은 임의의 고유한 이름입니다.

  • FunctionName은 정규화된 함수 이름입니다. 와일드 카드를 포함할 수 있습니다. 예를 들어, 클래스의 모든 함수를 제외하려면 MyNamespace::MyClass::*를 씁니다.

  • SourceFilePath.cpp 파일의 로컬 또는 UNC 경로입니다. 와일드 카드를 포함할 수 있습니다. 다음 예제는 특정 디렉터리에서 모든 파일을 제외합니다. \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • 임의의 네임스페이스 또는 클래스 안이 아닌 전역 네임스페이스에 제외 매크로에 대한 호출을 추가합니다.

  • 단위 테스트 코드 파일 또는 애플리케이션 코드 파일에 제외를 추가할 수 있습니다.

  • 제외는 컴파일러 옵션을 설정하거나 #pragma managed(off)를 사용하여 관리되지 않는(네이티브) 코드로 컴파일해야 합니다.

참고

C++/CLI 코드에서 함수를 제외하려면 함수에 [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] 특성을 적용합니다. C#의 경우에도 동일합니다.

추가 요소 포함 또는 제외

로드되어 있고 .pdb 파일을 .dll 또는 .exe 파일과 같은 디렉터리에서 사용할 수 있는 어셈블리에서만 코드 검사 분석을 수행할 수 있습니다. 따라서 경우에 따라 적절한 .pdb 파일의 사본을 가져와서 포함된 어셈블리 집합을 확장할 수 있습니다.

.runsettings 파일을 작성하면 코드 검사 분석에 대해 선택되는 어셈블리와 요소를 더 자세히 제어할 수 있습니다. 예를 들어, 클래스에 특성을 추가하지 않고도 특정 종류의 어셈블리를 제외할 수 있습니다. 자세한 내용은 코드 검사 분석 사용자 지정을 참조하세요.

Azure Pipelines에서 코드 검사 분석

코드를 체크 인하면 테스트가 다른 팀원의 테스트와 함께 빌드 서버에서 실행됩니다. Azure Pipelines에서 코드 검사를 분석하여 전체 프로젝트에 대한 최신 검사 정보를 전체적으로 파악하는 데 유용합니다. 또한 Azure Pipelines의 코드 검사에는 일반적으로 개발 머신에서 실행하지 않는 자동화된 시스템 테스트와 기타 코딩된 테스트도 포함됩니다.

명령줄에서 코드 검사 분석

명령줄에서 테스트를 실행하려면 vstest.console.exe 유틸리티를 사용합니다. 코드 검사는 /EnableCodeCoverage 옵션으로 호출된 vstest.console.exe 유틸리티의 옵션입니다.

  1. Visual Studio용 개발자 명령 프롬프트를 시작합니다.

    Windows 시작 메뉴에서 Developer Command Prompt for VS를 검색하고 검색 텍스트와 연결된 앱 결과를 선택합니다.

  2. 명령 프롬프트에서 다음 명령을 실행합니다.

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    개발자 PowerShell의 경우, 셸의 시작 디렉터리는 Visual Studio 프로젝트 위치입니다. MyTestAssembly.dll을 경로와 테스트 파일 이름으로 바꿉니다. 자세한 내용은 MSTest.exe 명령줄 옵션을 참조하세요.

문제 해결

코드 검사 결과가 표시되지 않으면 코드 검사 문제 해결 문서가 도움이 될 수 있습니다.