코드 검사를 사용하여 테스트할 코드 범위 결정Use Code Coverage to determine how much code is being tested

프로젝트의 코드 중 유닛 테스트와 같은 코딩된 테스트를 사용하여 실제로 테스트할 부분을 결정하려면 Visual Studio의 코드 검사 기능을 사용합니다.To determine what proportion of your project's code is actually being tested by coded tests such as unit tests, you can use the code coverage feature of Visual Studio. 버그로부터 효과적으로 보호하려면 코드의 상당한 부분을 실행 또는 '검사'해야 합니다.To guard effectively against bugs, your tests should exercise or 'cover' a large proportion of your code.

코드 검사 분석은 관리되는(CLI) 코드와 관리되지 않은(네이티브) 코드에 적용할 수 있습니다.Code coverage analysis can be applied to both managed (CLI) and unmanaged (native) code.

테스트 탐색기를 사용하여 테스트 메서드를 실행하는 경우 코드 검사는 선택 사항입니다.Code coverage is an option when you run test methods using Test Explorer. 결과 테이블에는 각 어셈블리, 클래스 및 메서드에서 실행되는 코드의 백분율이 표시됩니다.The results table shows the percentage of the code that was run in each assembly, class, and method. 또한 소스 편집기에는 테스트된 코드가 표시됩니다.In addition, the source editor shows you which code has been tested.

색 지정이 사용된 코드 검사 결과

요구 사항Requirements

  • Visual Studio EnterpriseVisual Studio Enterprise

테스트 탐색기의 단위 테스트에서 코드 검사를 분석하려면To analyze code coverage on unit tests in Test Explorer

  1. 테스트 메뉴에서 코드 검사 분석을 선택합니다.On the Test menu, choose Analyze Code Coverage.

  2. 실행된 줄을 확인하려면 코드 검사 강조 표시 아이콘코드 검사 강조 표시를 선택합니다.To see which lines have been run, choose Show Code Coverage Coloring IconShow Code Coverage Coloring.

    색을 변경하거나 굵게 표시하려면 도구 > 옵션 > 환경 > 글꼴 및 색 > 설정 표시: 텍스트 편집기를 선택합니다.To alter the colors, or to use bold face, choose Tools > Options > Environment > Fonts and Colors > Show settings for: Text Editor. 표시 항목에서 검사 항목을 조정합니다.Under Display Items, adjust the Coverage items.

  3. 결과에 검사가 낮게 표시되는 경우, 코드에서 실행되지 않은 부분을 확인한 다음 검사할 추가 테스트를 작성합니다.If the results show low coverage, investigate which parts of the code are not being exercised, and write more tests to cover them. 개발 팀을 일반적으로 약 80%의 코드 검사를 목표로 합니다.Development teams typically aim for about 80% code coverage. 경우에 따라 더 낮은 검사도 허용됩니다.In some situations, lower coverage is acceptable. 예를 들어, 일부 코드가 표준 템플릿에서 생성된 경우 낮은 검사가 허용됩니다.For example, lower coverage is acceptable where some code is generated from a standard template.

  • 컴파일러 최적화가 해제되었는지 확인make sure that compiler optimization is turned off
  • 관리되지 않은(네이티브) 코드를 사용하는 경우 디버그 빌드 사용if you are working with unmanaged (native) code, use a debug build
  • 각 어셈블리에 대해 .pdb(기호) 파일을 생성하고 있는지 확인합니다.make sure that you are generating .pdb (symbol) files for each assembly.

예상한 결과를 얻지 못한 경우 코드 검사 문제 해결을 참조하세요.If you don't get the results you expect, see Troubleshooting Code Coverage. 이어야 합니다.. 코드를 업데이트한 후 반드시 코드 검사를 다시 실행하세요.Don't forget to run code coverage again after updating your code. 검사 결과 및 코드 강조는 코드를 수정한 후 또는 테스트를 실행한 경우 자동으로 업데이트되지 않습니다.Coverage results and code coloring are not automatically updated after you modify your code or when you run tests.

블록 또는 줄에서 보고Report in blocks or lines

코드 검사는 블록으로 계산됩니다.Code coverage is counted in blocks. 블록은 진입점 및 진출점이 정확히 하나씩인 코드입니다.A block is a piece of code with exactly one entry and exit point. 테스트 실행 중 프로그램의 제어 흐름이 블록을 통과할 경우 해당 블록은 검사된 것으로 계산됩니다.If the program's control flow passes through a block during a test run, that block is counted as covered. 블록이 사용된 횟수는 결과에 영향을 아무 영향을 미치지 않습니다.The number of times the block is used has no effect on the result.

또한 표 머리글에서 열 추가/제거를 선택하여 결과를 줄 단위로 표시할 수 있습니다.You can also have the results displayed in terms of lines by choosing Add/Remove Columns in the table header. 테스트 실행이 모든 코드 블록을 임의의 코드 줄에서 실행한 경우 하나의 줄로 계산됩니다.If the test run exercised all the code blocks in any line of code, it is counted as one line. 한 줄에 실행된 일부 코드 블록과 실행되지 않은 일부 코드 블록이 포함된 경우 해당 줄은 부분적 줄로 계산됩니다.Where a line contains some code blocks that were exercised and some that were not, that is counted as a partial line.

일부 사용자는 백분율이 소스 코드에 표시되는 조각 크기와 더 가깝기 때문에 줄 수를 더 선호합니다.Some users prefer a count of lines because the percentages correspond more closely to the size of the fragments that you see in the source code. 긴 계산 블록은 여러 줄을 차지하는 경우에도 단일 블록으로 계산됩니다.A long block of calculation would count as a single block even if it occupies many lines.

코드 검사 결과 관리Manage code coverage results

일반적으로 코드 검사 결과 창에는 가장 최근 실행 결과가 표시됩니다.The Code Coverage Results window usually shows the result of the most recent run. 결과는 테스트 데이터를 변경할 경우 또는 매번 테스트의 일부만 실행할 경우 달라집니다.The results will vary if you change your test data, or if you run only some of your tests each time.

코드 검사 창은 이전 결과 또는 다른 컴퓨터에서 얻은 결과를 보는 데에도 사용할 수 있습니다.The code coverage window can also be used to view previous results, or results obtained on other computers.

여러 실행(예: 다른 테스트 데이터를 사용하는 실행)의 결과를 병합할 수 있습니다.You can merge the results of several runs, for example from runs that use different test data.

  • 이전 결과 집합을 보려면 드롭다운 메뉴에서 선택합니다.To view a previous set of results, select it from the drop-down menu. 이 메뉴에는 새 솔루션을 열 때 삭제되는 임시 목록이 표시됩니다.The menu shows a temporary list that is cleared when you open a new solution.

  • 이전 세션의 결과를 보려면 코드 검사 결과 가져오기를 선택한 다음 솔루션에서 TestResults 폴더를 탐색하고 .coverage 파일을 가져옵니다.To view results from a previous session, choose Import Code Coverage Results, navigate to the TestResults folder in your solution, and import a .coverage file.

    .coverage 파일이 생성된 이후 소스 코드가 변경된 경우 검사 강조가 잘못될 수 있습니다.The coverage coloring might be incorrect if the source code has changed since the .coverage file was generated.

  • 결과를 텍스트 형식으로 읽으려면 코드 검사 결과 내보내기를 선택합니다.To make results readable as text, choose Export Code Coverage Results. 그러면 다른 도구로 처리하거나 메일로 쉽게 전송할 수 있는 읽기 가능한 .coveragexm 파일이 생성됩니다.This generates a readable .coveragexml file which you could process with other tools or send easily in mail.

  • 결과를 다른 사람에게 전송하려면 .coverage 파일 또는 내보낸 .coveragexml 파일을 전송합니다.To send results to someone else, send either a .coverage file or an exported .coveragexml file. 그런 다음 수신자는 파일을 가져올 수 있습니다.They can then import the file. 동일한 버전의 소스 코드가 있으면 검사 강조를 볼 수 있습니다.If they have the same version of the source code, they can see coverage coloring.

다른 실행에서 결과 병합Merge results from different runs

테스트 데이터에 따라 코드에 다른 블록이 사용되는 경우가 있습니다.In some situations, different blocks in your code will be used depending on the test data. 따라서 여러 테스트 실행에서 결과를 결합할 수 있습니다.Therefore, you might want to combine the results from different test runs.

예를 들어, 입력 "2"로 테스트를 실행할 경우를 가정하면 특정 함수의 50%만 검사됩니다.For example, suppose that when you run a test with input "2", you find that 50% of a particular function is covered. 입력 "-2"로 다시 테스트를 실행하면 검사 강조 보기에서 함수의 나머지 50%가 검사된 것을 확인할 수 있습니다.When you run the test a second time with the input "-2" you see in the coverage coloring view that the other 50% of the function is covered. 이제 두 테스트 실행의 결과를 병합하면 보고서와 검사 강조 보기에 함수의 100%가 검사된 것으로 나타납니다.Now you merge the results from the two test runs, and the report and coverage coloring view show that 100% of the function was covered.

코드 검사 창의 병합 단추 아이콘코드 검사 결과 병합을 사용하여 이 작업을 수행합니다.Use Icon for Merge button in Code Coverage windowMerge Code Coverage Results to do this. 최근의 실행 또는 가져온 결과의 조합을 선택할 수 있습니다.You can choose any combination of recent runs or imported results. 내보낸 결과를 결합하려면 내보낸 결과를 가져와야 합니다.If you want to combine exported results, you must import them first.

병합 작업 결과를 저장하려면 코드 검사 결과 내보내기를 사용합니다.Use Export Code Coverage Results to save the results of a merge operation.

병합 제한 사항Limitations in merging

  • 다른 코드 버전의 검사 데이터를 병합하는 경우 결과가 별도로 표시되지만 결합되지 않습니다.If you merge coverage data from different versions of the code, the results are shown separately, but they are not combined. 완전히 결합된 결과를 얻으려면 동일한 빌드의 코드를 사용하고 테스트 데이터만 변경하세요.To get fully combined results, use the same build of the code, changing only the test data.

  • 내보낸 다음 가져온 결과 파일을 병합할 경우 결과를 블록 단위가 아닌 줄 단위로만 볼 수 있습니다.If you merge a results file that has been exported and then imported, you can only view the results by lines, not by blocks. 줄 데이터를 보려면 열 추가/제거 명령을 사용합니다.Use the Add/Remove Columns command to show the line data.

  • ASP.NET 프로젝트 테스트의 결과를 병합할 경우 별도 테스트의 결과가 표시되지만 결합되지는 않습니다.If you merge results from tests of an ASP.NET project, the results for the separate tests are displayed, but not combined. 이는 ASP.NET 아티팩트 자체에만 적용되며, 다른 어셈블리의 결과는 결합됩니다.This applies only to the ASP.NET artifacts themselves: results for any other assemblies will be combined.

코드 검사 결과에서 요소 제외Exclude elements from the code coverage results

코드가 텍스트 템플릿에서 생성된 경우와 같이 검사 점수에서 코드의 특정 요소를 제외하려는 경우가 있습니다.You might want to exclude specific elements in your code from the coverage scores, for example if the code is generated from a text template. System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage 특성을 class, struct, method, property, property setter 또는 getter, event 코드 요소에 임의로 추가할 수 있습니다.Add the attribute System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage to any of the following code elements: class, struct, method, property, property setter or getter, event. 클래스를 제외할 경우 해당 파생 클래스는 제외되지 않습니다.Note that excluding a class does not exclude its derived classes.

예:For example:

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

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

    int ExampleProperty2
        [ExcludeFromCodeCoverage] // exclude setter

class ExampleClass2 { ... }
Imports System.Diagnostics.CodeAnalysis

Class ExampleClass1
    Public Sub ExampleSub1()
    End Sub

    ' Exclude property
    < ExcludeFromCodeCoverage()>
    Property ExampleProperty1 As Integer
    End Property

    ' Exclude setter
    Property ExampleProperty2 As Integer
        End Get
        Set(ByVal value As Integer)
        End Set
    End Property
End Class

Class ExampleClass2
End Class
// A .cpp file compiled as managed (CLI) code.
using namespace System::Diagnostics::CodeAnalysis;
public ref class ExampleClass1
    void ExampleFunction1() { ... }

    property int ExampleProperty2 {...}

    property int ExampleProperty2 {
      int get() { ... }
      void set(int value) { ...  }

public ref class ExampleClass2
{ ... }

네이티브 C++ 코드에서 요소 제외Exclude elements in Native C++ code

C++ 코드에서 관리되지 않는(네이티브) 요소를 제외하려면To exclude unmanaged (native) elements in C++ code:

#include <CodeCoverage\CodeCoverage.h>

// Exclusions must be compiled as unmanaged (native):
#pragma managed(push, off)

// Exclude a particular function:
ExcludeFromCodeCoverage(Exclusion1, L"MyNamespace::MyClass::MyFunction");

// Exclude all the functions in a particular class:
ExcludeFromCodeCoverage(Exclusion2, L"MyNamespace::MyClass2::*");

// Exclude all the functions generated from a particular template:
ExcludeFromCodeCoverage(Exclusion3, L"*::MyFunction<*>");

// Exclude all the code from a particular .cpp file:
ExcludeSourceFromCodeCoverage(Exclusion4, L"*\\unittest1.cpp");

// After setting exclusions, restore the previous managed/unmanaged state:
#pragma managed(pop)

다음과 같은 매크로를 사용합니다.Use the following macros:

ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");

ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");

  • ExclusionName은 임의의 고유한 이름입니다.ExclusionName is any unique name.

  • FunctionName은 정규화된 함수 이름입니다.FunctionName is a fully qualified function name. 와일드 카드를 포함할 수 있습니다.It may contain wildcards. 예를 들어, 클래스의 모든 함수를 제외하려면 MyNamespace::MyClass::*를 씁니다.For example, to exclude all the functions of a class, write MyNamespace::MyClass::*

  • SourceFilePath는 .cpp 파일의 로컬 또는 UNC 경로입니다.SourceFilePath is the local or UNC path of a .cpp file. 와일드 카드를 포함할 수 있습니다.It may contain wildcards. 다음 예제는 특정 디렉터리에서 모든 파일을 제외합니다. \\MyComputer\Source\UnitTests\*.cppThe following example excludes all files in a particular directory: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • 임의의 네임스페이스 또는 클래스 안이 아닌 전역 네임스페이스에 제외 매크로에 대한 호출을 추가합니다.Place calls to the exclusion macros in the global namespace, not within any namespace or class.

  • 단위 테스트 코드 파일 또는 응용 프로그램 코드 파일에 제외를 추가할 수 있습니다.You can place the exclusions either in the unit test code file or the application code file.

  • 제외는 컴파일러 옵션을 설정하거나 #pragma managed(off)를 사용하여 관리되지 않는(네이티브) 코드로 컴파일해야 합니다.The exclusions must be compiled as unmanaged (native) code, either by setting the compiler option or by using #pragma managed(off).


C++/CLI 코드에서 함수를 제외하려면 함수에 [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] 특성을 적용합니다.To exclude functions in C++/CLI code, apply the attribute [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] to the function. C#의 경우에도 동일합니다.This is the same as for C#.

추가 요소 포함 또는 제외Include or exclude additional elements

코드 검사 분석은 로드되어 있고 .pdb 파일을 .dll 또는 .exe 파일과 같은 디렉터리에서 사용할 수 있는 어셈블리에서만 수행할 수 있습니다.Code coverage analysis is performed only on assemblies that are loaded and for which a .pdb file is available in the same directory as the .dll or .exe file. 따라서 경우에 따라 적절한 .pdb 파일의 사본을 가져와서 포함된 어셈블리 집합을 확장할 수 있습니다.Therefore in some circumstances, you can extend the set of assemblies that is included by getting copies of the appropriate .pdb files.

.runsettings 파일을 작성하면 코드 검사 분석에 대해 선택되는 어셈블리와 요소를 더 자세히 제어할 수 있습니다.You can exercise more control over which assemblies and elements are selected for code coverage analysis by writing a .runsettings file. 예를 들어, 클래스에 특성을 추가하지 않고도 특정 종류의 어셈블리를 제외할 수 있습니다.For example, you can exclude assemblies of particular kinds without having to add attributes to their classes. 자세한 내용은 코드 검사 분석 사용자 지정을 참조하세요.For more information, see Customizing Code Coverage Analysis.

빌드 서비스에서 코드 검사 분석Analyze code coverage in the build service

코드에 체크 인하면 테스트가 다른 팀원의 나머지 모든 테스트와 함께 빌드 서버에서 실행됩니다.When you check in your code, your tests will run on the build server, along with all the other tests from other team members. (아직 설정하지 않은 경우 빌드 프로세스에서 테스트 실행을 참조하세요.) 빌드 서비스에서 코드 검사를 분석하면 전체 프로젝트에 대한 최신 검사 정보를 전체적으로 파악할 수 있습니다.(If you haven't already set this up, see Run tests in your build process.) It's useful to analyze code coverage on the build service, because that gives the most up-to-date and comprehensive picture of coverage in the whole project. 또한 일반적으로 개발 컴퓨터에서 실행하지 않는 자동화된 시스템 테스트와 기타 코딩된 테스트도 포함됩니다.It will also include automated system tests and other coded tests that you don't usually run on the development machines.

  1. 팀 탐색기에서 빌드를 연 다음 빌드 정의를 추가하거나 편집합니다.In Team Explorer, open Builds, and then add or edit a build definition.

  2. 프로세스 페이지에서 자동화된 테스트, 테스트 소스, 실행 설정을 확장합니다.On the Process page, expand Automated Tests, Test Source, Run Settings. 실행 설정 파일 형식코드 검사 사용으로 설정합니다.Set Type of Run Settings File to Code Coverage Enabled.

    테스트 소스 정의가 두 개 이상일 경우 각각에 대해 이 단계를 반복합니다.If you have more than one Test Source definition, repeat this step for each one.

    코드 검사를 위한 빌드 정의 설정 중

실행 설정 파일 유형이라는 이름의 필드가 없으면 테스트 실행기 특성을 변경합니다.If there's no field named Type of Run Settings File, change the Test Runner property. 자동화된 테스트에서 테스트 어셈블리를 선택한 다음 줄임표 단추 [...] 를 선택합니다.Under Automated Tests, select Test Assembly and choose the ellipsis button [...] at the end of the line. 테스트 실행 추가/편집 대화 상자의 Test Runner에서 Visual Studio Test Runner를 선택합니다.In the Add/Edit Test Run dialog box, under Test Runner, choose Visual Studio Test Runner.

빌드 실행 후 코드 검사 결과가 테스트 실행에 첨부되고 빌드 요약에 나타납니다.After the build runs, the code coverage results are attached to the test run and appear in the build summary.

명령줄에서 코드 검사 분석Analyze Code Coverage in a Command Line

명령줄에서 테스트를 실행하려면 vstest.console.exe를 사용합니다.To run tests from the command line, use vstest.console.exe. 코드 검사는 vstest.console.exe 유틸리티의 옵션입니다.Code coverage is an option of the vstest.console.exe utility.

  1. Visual Studio 개발자 명령 프롬프트를 시작합니다.Launch the Visual Studio Developer Command Prompt:

    Windows 시작 메뉴에서 Visual Studio 2017 > VS 2017용 개발자 명령 프롬프트를 선택합니다.On the Windows Start menu, choose Visual Studio 2017 > Developer Command Prompt for VS 2017.

  2. 다음 명령을 실행합니다.Run the following command:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

문제 해결Troubleshoot

코드 검사 결과가 표시되지 않으면 코드 검사 문제 해결 항목이 도움이 될 수 있습니다.If you do not see code coverage results, the Troubleshooting Code Coverage topic might help you.

참고 항목See also