다음을 통해 공유


단위 테스트 기본 사항

이 항목 작성 하 고 테스트 Visual Studio 탐색기에서 단위 테스트 실행의 기본 사항을 설명 합니다.여기에는 다음 단원이 포함되어 있습니다.

Unit testing overview

  • Quick starts

The MyBank Solution example

Creating the unit test projects

Writing your tests

Running tests in Test Explorer

  • Running and viewing tests from the Test Explorer toolbar

  • Running tests after every build

  • Filtering and grouping the test list

Debugging unit tests

Additional tools for unit tests

  • Generating application code from tests

  • Generating multiple tests by using data driven test methods

  • Analyzing unit test code coverage

  • Isolating unit test methods with Microsoft Fakes

단위 테스트 개요

Visual Studio 테스트 탐색기 개발자와 통합 하는 팀을 지원 하도록 설계 된 단위 테스트 는 소프트웨어 개발 방법에서.단위 테스트 작업을 수행 하 여 예상 하지 응용 프로그램 코드를 확인 하 여 프로그램의 정확성을 확인 하는 데 도움이 됩니다.단위 테스트를 개인으로 테스트할 수 있는 개별 테스트 가능한 동작을 검색 하 여 프로그램의 기능 분석 단위.사용에 단위 테스트 프레임 워크 이러한 테스트의 결과 보고 하 고 이러한 동작의 테스트를 만들 수 있습니다.

단위 테스트는 소프트웨어 개발 과정의 핵심 부분이 있으면 최대한 같습니다.함수 또는 다른 응용 프로그램 코드 블록을 작성 하는 즉시 표준, 경계, 및 입력된 데이터의 잘못 된 경우에 응답 하는 코드의 동작을 확인 하는 코드에서 수행한 모든 명시적 또는 암시적 가정을 확인 하는 단위 테스트를 만듭니다.라고 하는 소프트웨어 개발 연습 테스트 구동 방식된 개발, 설계 설명서와 기능 사양 기능 단위 테스트를 사용 하도록 코드를 작성 하기 전에 단위 테스트를 만듭니다.

탐색기 테스트 단위 테스트를 실행 하 고 Visual Studio 결과 확인 하는 유연 하 고 효율적인 방법을 제공 합니다.Visual Studio Microsoft 단위 테스트 프레임 워크에 대 한 관리 코드와 네이티브 코드를 설치 합니다.테스트 탐색기 탐색기 테스트 추가 인터페이스를 구현 해야 하는 단위 테스트 프레임 워크는 타사 공개 소스를 실행할 수도 있습니다.이러한 프레임 워크 Visual Studio 확장 관리자 및 Visual Studio 갤러리를 통해 많은 파일을 추가할 수 있습니다.방법: 타사 단위 테스트 프레임워크 설치을 참조하십시오.

성공, 실패 한 테스트는 아직 실행 되지 않은 또는 건너뛴 테스트 탐색기 보기의 테스트를 모두 표시할 수 있습니다.검색 상자는 전역 수준에서 일치 하는 텍스트 또는 미리 정의 된 필터 중 하나를 선택 하 여 테스트 보기에서를 필터링 할 수 있습니다.언제 든 지 선택한 테스트를 실행할 수 있습니다.사용 하는 경우 Visual Studio Ultimate, 각 빌드 후 자동으로 테스트를 실행할 수 있습니다.테스트 실행의 결과 성공 탐색기 창 맨 위에 있는 표시줄에서 바로 확인할 수 있습니다.테스트 메서드 결과의 세부 정보는 테스트를 선택 하면 표시 됩니다.

Hh694602.collapse_all(ko-kr,VS.110).gif빠른 시작

이러한 항목을 직접 코딩에 사용 되는 단위 테스트에 대 한 소개를 참조 하십시오.

MyBank 솔루션 예제

이 항목에서는 우리 라는 가상 응용 프로그램을 개발 사용 MyBank 예를 들어.실제 코드는이 항목의 설명에 따라 필요 하지 않습니다.그러나 테스트 메서드 C#를 작성 하 여 Microsoft 단위 테스트 프레임 워크를 사용 하 여 관리 코드에 대 한 설명, 개념 쉽게 다른 언어와 프레임 워크에 전송 됩니다.

MyBank 솔루션

디자인에 대 한 첫 번째 시도가 MyBank 나타내는 개별 계정 및 해당 트랜잭션과 은행에 계정 구성 요소와 개별 계정을 관리할 수 있는 기능을 나타내는 데이터베이스 구성 요소 응용 프로그램에 포함 됩니다.

만들는 MyBank 두 개의 프로젝트가 포함 된 솔루션:

  • Accounts

  • BankDb

첫 번째 시도가 디자인의 Accounts 프로젝트 계정 계정 제공 및 자산 계정에서 철회 한다는 등 모든 종류의 일반적인 기능을 지정 하는 인터페이스에 대 한 기본 정보를 보유 하는 클래스를 포함 한 예금 계좌를 나타내는 인터페이스에서 파생 된 클래스.다음 소스 파일을 작성 하 여 계정 프로젝트를 시작 합니다.

  • AccountInfo.cs계정에 대 한 기본 정보를 정의합니다.

  • IAccount.cs표준 정의 IAccount비축 자산 계정에서 철수 하 고 계정 잔고를 검색 하는 메서드를 포함 하는 계정에 대 한 인터페이스.

  • CheckingAccount.cs포함 된 CheckingAccount 구현 하는 클래스는 IAccounts 당좌 예금 계좌에 대 한 인터페이스.

우리는 예금 계좌에서 인출 작업을 수행 해야 하나 그걸 출금된 시간 계정 잔액 보다 작은 것입니다 경험에서 알고 있습니다.우리를 무시할 수는 IAccount.Withdaw 메서드에서 CheckingAccount 확인 하는 방법을이 조건에 대해.이 메서드는 다음과 같습니다.

public void Withdraw(double amount)
{
    if(m_balance >= amount)
    {
        m_balance -= amount;
    }
    else
    {
        throw new ArgumentException(amount, "Withdrawal exceeds balance!")
    }
}

우리가 일부 코드 만들었으므로 테스트 하는 시간입니다.

단위 테스트 프로젝트 만들기

일반적으로 단위 테스트 프로젝트가 단일 코드 프로젝트의 구조를 반영합니다.MyBank 예제에서는 명명 된 두 단위 테스트 프로젝트를 추가 AccountsTests 및 BankDbTests 에 있는 MyBanks 솔루션.테스트 프로젝트 이름은 임의의 이름 이지만 표준 명명 규칙을 채택 하는 것이 좋습니다.

단위 테스트 프로젝트가 솔루션에 추가 하려면:

  1. 파일 메뉴를 선택 New 다음 선택 프로젝트 (키보드의 Ctrl + Shift + N).

  2. 새 프로젝트 대화 상자에서 확장 된 설치 된 노드를 테스트 프로젝트를 사용 하 고 다음을 선택 하려면 원하는 언어를 선택 테스트.

  3. Microsoft 단위 테스트 프레임 워크 중 하나를 사용 하려면 단위 테스트 프로젝트 프로젝트 템플릿 목록에서.그렇지 않으면 프로젝트 서식 파일의 단위 테스트 프레임 워크를 사용 하 여 선택 합니다.테스트 하는 Accounts 프로젝트의 예제에서는 프로젝트의 이름을 지정 합니다 AccountsTests.

    주의 정보주의

    모든 타사 공개 소스 단위 테스트 프레임 워크는 Visual Studio 프로젝트 템플릿을 제공합니다.프로젝트 만들기에 대 한 정보를 프레임 워크 문서를 참조 하십시오.

  4. 단위 테스트 프로젝트에 예제 계정 프로젝트 테스트 대상 코드 프로젝트에 대 한 참조를 추가 합니다.

    코드 프로젝트에 참조를 생성 하려면:

    1. 솔루션 탐색기에서 프로젝트를 선택합니다.

    2. 프로젝트 메뉴를 선택 참조 추가.

    3. 관리자 참조 대화 상자에서 열기는 솔루션 노드를 선택 하 고 프로젝트.코드 프로젝트 이름을 선택 하 고 대화 상자를 닫습니다.

각 단위 테스트 프로젝트 코드 프로젝트에는 클래스의 이름을 반영 하는 클래스를 포함 합니다.이 예제에는 AccountsTests 프로젝트는 다음과 같은 클래스가 포함 됩니다:

  • AccountInfoTests단위 테스트 메서드를 클래스에 포함 된는 AccountInfo 클래스에 BankAccount 프로젝트

  • CheckingAccountTests단위 테스트 메서드를 클래스에 포함 된 CheckingAccount 클래스입니다.

테스트를 작성합니다.

사용 하면 프레임 워크는 단위 테스트 및 Visual Studio IntelliSense 코드 프로젝트에 대 한 단위 테스트를 만드는 방법을 안내 합니다.탐색기 테스트를 실행 하려면 대부분의 프레임 워크는 단위 테스트 메서드를 식별 하는 특정 특성을 추가 하는 필요 합니다.프레임 워크는 또한 방법을 제공-일반적으로 통해 문이나 메서드 특성 어설션-테스트 메서드에 전달 하거나 여부를 나타냅니다.다른 특성 클래스 초기화와 각 테스트 메서드 및 각 테스트 메서드 및 클래스 소멸 되기 전에 실행 되는 해체 방법 전에 선택적 설치 메서드를 식별 합니다.

AAA (정렬, Act, Assert) 패턴 테스트 메서드에 대 한 단위 테스트를 작성 하는 일반적인 방법입니다.

  • 정렬 섹션에 단위 테스트 메서드의 개체를 초기화 하 고 테스트 메서드에 전달 되는 데이터의 값을 설정 합니다.

  • Act 섹션 정렬된 매개 변수를 테스트 대상 메서드를 호출 합니다.

  • Assert 단원 확인 테스트 메서드의 동작을 예상 대로 작동 합니다.

테스트 하는 CheckingAccount.Withdraw 메서드 예 두 테스트 작성할 수 있습니다: 메서드의 표준 동작을 확인 하 고 확인의 균형 보다는 출금이 되지 것입니다.에 CheckingAccountTests 클래스에 다음 메서드 추가:

[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
    // arrange
    double currentBalance = 10.0;
    double withdrawal = 1.0;
    double expected = 9.0;
    var account = new CheckingAccount("JohnDoe", currentBalance);
    // act
    account.Withdraw(withdrawal);
    double actual = account.Balance;
    // assert
    Assert.AreEqual(expected, actual);
}

[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void Withdraw_AmountMoreThanBalance_Throws()
{
    // arrange
    var account = new CheckingAccount("John Doe", 10.0);
    // act
    account.Withdraw(1.0);
    // assert is handled by the ExcpectedException
}

이때 Withdraw_ValidAmount_ChangesBalance 명시적 사용 Assert 문을 테스트의 테스트 메서드가 성공 여부를 확인 하려면 동안 Withdraw_AmountMoreThanBalance_Throws 사용 하는 ExpectedException 테스트 메서드의 성공 여부를 결정 하는 특성.내부적으로 단위 테스트 프레임 워크에서 try/catch 문을 테스트 메서드를 래핑합니다.대부분의 경우 예외가 발생 하는 경우 테스트 메서드에 실패 하 고 예외는 무시 됩니다.ExpectedException 특성 테스트 메서드가 지정 된 예외가 발생할 경우 전달 됩니다.

Microsoft 단위 테스트 프레임 워크에 대 한 자세한 내용은 다음 항목 중 하나를 참조 하십시오.

테스트 탐색기에서 테스트 실행

테스트는 테스트 프로젝트를 빌드할 때 테스트 탐색기에 나타납니다.테스트 탐색기가 표시 되어 있지 않으면 선택 테스트 Visual Studio 메뉴에서 선택 Windows, 다음을 선택 하 고 테스트 탐색기.

단위 테스트 탐색기

실행, 쓰기 및 테스트를 다시 실행 하면 테스트 탐색기의 기본 보기에서 그룹의 결과 표시 테스트 실패, 테스트 통과, 테스트 생략테스트 실행 하지.이 모든 해당 그룹에서 테스트를 표시 하는 뷰 열에 그룹 머리글을 선택할 수 있습니다.

Hh694602.collapse_all(ko-kr,VS.110).gif실행 및 테스트 테스트 탐색기 도구 모음에서 보기

테스트 탐색기 도구 모음 검색, 구성 및 관심 있는 테스트를 실행 하는 데 도움이 됩니다.

테스트 탐색기 도구 모음에서 테스트 실행

선택할 수 있습니다 를 실행 하는 모든 모든 테스트를 실행 하거나 선택할 수 실행 실행할 테스트의 하위 집합을 선택 합니다.일련의 테스트를 실행 한 테스트 실행의 요약 테스트 탐색기 창 맨 아래에 나타납니다.아래쪽 창에서 해당 테스트의 세부 정보를 보려면 테스트를 선택 합니다.선택 열기 테스트 에서 컨텍스트 메뉴 (키보드: F12) 선택한 테스트에 대 한 소스 코드를 표시 합니다.

Hh694602.collapse_all(ko-kr,VS.110).gif각 빌드 후 테스트를 실행합니다.

주의 정보주의

모든 빌드만 Visual Studio 궁극적인의 지 후 실행 중인 단위 테스트 합니다.

빌드 후 실행

각 로컬 빌드 후 단위 테스트를 실행 하려면 테스트 표준 메뉴에서 선택 후 테스트 실행 빌드 테스트 탐색기 도구 모음에서.

Hh694602.collapse_all(ko-kr,VS.110).gif필터링 및 그룹화 테스트 목록

많은 수의 테스트를 할 때 지정 된 문자열 목록을 필터링 하려면 테스트 탐색기 검색 상자에 입력할 수 있습니다.필터 목록에서 필터를 선택 하 여 더 많은 이벤트를 제한할 수 있습니다.

검색 필터 범주

테스트 탐색기 그룹 단추

테스트 범주에 따라 그룹화 할의 Group By 단추.

자세한 내용은 테스트 탐색기를 사용하여 단위 테스트 실행를 참조하십시오.

단위 테스트 디버깅

탐색기 테스트 테스트 디버깅 세션을 시작할 수 있습니다.코드를 완벽 하 게 Visual Studio 디버거를 단계별로 실행 하면 앞뒤로 프로젝트 테스트 및 단위 테스트 간에 이동 합니다.디버깅을 시작.

  1. Visual Studio 편집기에서 디버깅 하려는 하나 이상의 테스트 메서드에 중단점을 설정 합니다.

    [!참고]

    테스트 메서드를 순서에 관계 없이 실행할 수 있으므로 디버깅 하려는 테스트의 모든 메서드에 중단점을 설정 합니다.

  2. 탐색기, 테스트에서 테스트 메서드를 선택 하 고 선택 선택한 테스트 디버그 바로 가기 메뉴에서.

디버거에 대 한 자세한 내용은 Visual Studio의 디버깅.

단위 테스트에 대 한 추가 도구

Hh694602.collapse_all(ko-kr,VS.110).gif응용 프로그램 코드에서 테스트 생성

프로젝트 코드를 작성 하기 전에 테스트를 작성 하는 경우 IntelliSense 클래스와 메서드는 프로젝트 코드를 사용할 수 있습니다.클래스를 호출 하는 테스트 메서드 또는 메서드를 생성 하는 문을 작성 한 다음 호출에서 IntelliSense 메뉴를 엽니다.새 클래스의 생성자로 호출 되 면 선택 새 형식 생성 메뉴와 마법사 코드 프로젝트에 클래스를 삽입 하려면 다음과 같이 하십시오.선택 메서드를 호출 되 면 생성 새 메서드 IntelliSense 메뉴에서.

메서드 스텁 Intellisense 메뉴 생성

Hh694602.collapse_all(ko-kr,VS.110).gif데이터 기반 테스트 메서드를 사용 하 여 여러 테스트를 생성 합니다.

[!참고]

이러한 절차 Microsoft 단위 테스트 프레임 워크를 사용 하 여 관리 되는 코드를 작성 하는 방법만 테스트에 적용 됩니다.다른 프레임 워크를 사용 하는 동일한 기능에 대 한 framework 설명서를 참조 하십시오.

데이터 기반 테스트 메서드 범위 값에서 단일 단위 테스트 메서드를 확인할 수 있습니다.데이터 기반 단위 테스트 메서드를 만들려면이 메서드를 꾸미기는 DataSource 데이터 소스와 테이블을 지정 하는 특성 테스트할 변수 값을 포함 합니다.메서드 본문의 행 값을 사용 하 여 변수에 할당 된 TestContext.DataRow[ColumnName] 인덱서.

예를 들어, 메서드에 불필요 한 추가 가정은 CheckingAccount 라는 클래스 AddIntegerHelper.AddIntegerHelper두 개의 정수를 추가합니다.

데이터 기반 테스트를 만들 수 있는 AddIntegerHelper 메서드, 우리가 먼저 만들기 라는 Access 데이터베이스 AccountsTest.accdb 및 테이블이 AddIntegerHelperData.AddIntegerHelperData 테이블 정의의 첫 번째 및 두 번째 피연산자를 지정 하려면 열과 열 예상된 결과 지정할 수 있습니다.우리는 행 수를 적절 한 값으로 채웁니다.

    [DataSource(
        @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projects\MyBank\TestData\AccountsTest.accdb", 
        "AddIntegerHelperData"
    )]
    [TestMethod()]
    public void AddIntegerHelper_DataDrivenValues_AllShouldPass()
    {
        var target = new CheckingAccount();
        int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
        int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]); 
        int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
        int actual = target.AddIntegerHelper(x, y);
        Assert.AreEqual(expected, actual);
    }

특성이 적용된 된 메서드는 테이블의 각 행에 대해 한 번 실행 됩니다.이터레이션 중 하나라도 실패 하면 탐색기 테스트 메서드에 대 한 테스트 실패를 보고 합니다.메서드에 대 한 테스트 결과 세부 정보 창에 데이터의 각 행에 대해 통과/실패 상태 메서드가 표시 됩니다.

자세한 내용은 방법: 데이터 기반 단위 테스트 만들기를 참조하십시오.

Hh694602.collapse_all(ko-kr,VS.110).gif단위 테스트의 코드 검사 분석

[!참고]

단위 테스트의 코드 검사는 네이티브 및 관리 되는 언어 및 단위 테스트 프레임 워크에서 실행할 수 있는 모든 단위 테스트 프레임 워크를 사용할 수 있습니다.

Visual Studio 코드 적용 범위 도구를 사용 하 여 단위 테스트에서 테스트 중인 실제로 제품 코드의 양을 결정할 수 있습니다.솔루션의 모든 테스트 또는 선택한 테스트에서 코드 검사를 실행할 수 있습니다.코드 검사 결과 창 선, 함수, 클래스, 네임 스페이스와 모듈 실행 된 제품 코드 블록의 백분율을 표시 합니다.

솔루션에 테스트 메서드에 대 한 코드 검사를 실행 하려면

  1. 선택 테스트 Visual Studio 메뉴에서 다음 선택 코드 검사 분석.

  2. 이러한 명령 중 하나를 선택 합니다.

    1. 선택한 테스트 테스트 탐색기에서 선택한 테스트 메서드를 실행 합니다.

    2. 모든 테스트 솔루션의 모든 테스트 메서드를 실행 합니다.

검사 결과 코드 검사 결과 창에 나타납니다.

코드 검사 결과

자세한 내용은 코드 검사를 사용하여 테스트할 코드 범위 결정를 참조하십시오.

Hh694602.collapse_all(ko-kr,VS.110).gif단위 테스트 메서드가 Microsoft Fake를 분리합니다.

[!참고]

Microsoft Fake만 Visual Studio Ultimate에서 사용할 수 있습니다.Microsoft Fake 단위 테스트 프레임 워크를 사용 하 여 관리 되는 코드를 작성 하는 테스트 방법만 사용할 수 있습니다.

문제

함수의 내부 코드를 확인 하는 포커스 메서드 호출 테스트에서 작동 하는 경우 쓰기 어려울 수 있는 단위 테스트 메서드가 외부 종속성을 소개 합니다.예를 들어, 메서드는 CheckingAccount 예제 클래스를 호출 해야 것는 BankDb 구성에서 주 데이터베이스를 업데이트 합니다.우리를 리팩터링하여는 CheckingAccount 클래스를 찾으려면 다음 처럼:

class CheckingAccount : IAccount
{
    public CheckingAccount(customerName, double startingBalance, IBankDb bankDb)
    {
        m_bankDb = bankDb;
        // set up account
    }

    public void Withdraw(double amount)
    {
        if(m_balance >= amount)
        {
            m_balance = m_MyBankDb.Withdraw(m_accountInfo.ID, amount);
        }
        else
        {
            throw new ArgumentException(amount, "Withdrawal exceeds balance!")
        }
    }

    private IBankDb m_bankDb = null;
    // ...

이 단위 테스트 CheckingAccount.Withdraw 메서드 호출에 의해 발생 하는 문제로 인해 실패할 수 있습니다 이제 m_bankDb.Withdraw.데이터베이스에 대 한 권한을 잘못 되었거나 데이터베이스 또는 네트워크 연결 손실 될 수 있습니다.실패는 m_bankDB.Withdraw 호출 인해 해당 내부 코드와 관련 되지 않는 이유로 실패 하는 테스트입니다.

Fake Microsoft 솔루션

Microsoft Fake 클래스와 메서드의 클래스에서 종속성으로 인해 단위 테스트 메서드를 대체할 수 있는 어셈블리를 만듭니다.대체 클래스에서 생성 된 모듈 Fake 메서드와 대상 구성 요소에서 각 공용 메서드에 대 한 대리자를 선언합니다.테스트 메서드에서 종속성 호출의 동작을 정확 하 게 테스트 하려는 메서드를 만들려면 대리자를 구현 합니다.

예에서 우리는 Fake 어셈블리를 만들 수 있습니다는 BankDb 프로젝트를 하 고는 StubIBankDb Fake가 생성 되 고에서 파생 된 클래스는 IBankDb 인터페이스 데이터베이스와의 상호 작용으로 인 한 불확실성을 제거 합니다.수정 된 버전의 Withdraw_ValidAmount_ChangesBalance 메서드를 테스트 하 고 모양은:

[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
    // arrange
    double currentBalance = 10.0;
    double withdrawal = 1.0;
    double expected = 9.0;

    // set up the Fakes object and delegate
    var stubBankDb = new MyBank.Stubs.StubIBankDb();
    stubBankDb.WithdrawDoubleDouble = (id, amount) => { return 9.0; }
    var account = new CheckingAccount("JohnDoe", currentBalance, stubBankDb);

    // act
    account.Withdraw(withdrawal);
    double actual = account.Balance;

    // assert
    Assert.AreEqual(expected, actual);
}

이 줄을 테스트 하는 방법:

stubBankDb.WithdrawDoubleDouble = (id, amount) => { return 9.0; }

Fake는 위임에 대 한 구현에서 Withdraw lamba 식을 사용 하 여 메서드.stubBankDb.Withdraw 메서드 대리자를 호출 하 고 있으므로 항상 안정적으로 동작을 확인 하려면 테스트 메서드를 지정한 값을 반환 된 Accounts 메서드.

Microsoft Fake에 대 한 자세한 내용은

Microsoft Fake 대체 클래스를 만드는 두 가지 방법을 사용 합니다.

  1. 스텁 대상 종속성 클래스의 부모 인터페이스 로부터 파생 된 대체 클래스를 생성 합니다.스텁 메서드는 대상 클래스의 공용 가상 메서드를 대체할 수 있습니다.

  2. Shim 런타임 계기를 사용 하 여 전환 아닌 가상 메서드에 대 한 대체 심은 메서드에 대상 메서드를 호출 합니다.

두 방법 모두 생성 된 대리자를 대 한 종속성 메서드 호출을 테스트 메서드에서 원하는 동작을 지정할 수 있습니다.

자세한 내용은 Microsoft Fakes를 사용하여 테스트 중인 코드 격리를 참조하십시오.