연습: 관리 코드에 대한 단위 테스트 만들기 및 실행

이 연습에서는 실행 하 고 사용자 지정 하는 일련의 관리 되는 코드와 Visual Studio 테스트 탐색기에 대 한 Microsoft 단위 테스트 프레임 워크를 사용 하 여 단위 테스트 만들기 과정을 단계별로 안내 합니다.개발 중인 C# 프로젝트로 시작하여 해당 코드를 실행해 보는 테스트를 만들어 테스트를 실행하고 결과를 검사합니다.그런 다음 프로젝트 코드를 변경하고 테스트를 다시 실행할 수 있습니다.

이 항목에는 다음과 같은 단원이 포함되어 있습니다.

연습 준비

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

테스트 클래스 만들기

첫 번째 테스트 메서드 만들기

빌드 및 테스트 실행

코드를 수정 하 고 테스트를 다시 실행 하십시오.

사용 단위 테스트를 사용 하 여 코드를 향상 시키기 위해

[!참고]

이 연습에서는 Microsoft 단위 테스트 프레임 워크에 대 한 관리 되는 코드를 사용합니다.테스트 탐색기 테스트에서 제 3 자 단위 테스트 프레임 워크에 테스트 탐색기에 대 한 어댑터를가지고 실행할 수도 있습니다.자세한 내용은 방법: 타사 단위 테스트 프레임워크 설치를 참조하십시오.

[!참고]

명령줄에서 테스트를 실행하는 방법에 대한 자세한 내용은 연습: 명령줄 테스트 유틸리티 사용을 참조하십시오.

사전 요구 사항

연습 준비

연습을 준비하려면

  1. Visual Studio 2012를 엽니다.

  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.

    새 프로젝트 대화 상자가 나타납니다.

  3. 설치된 템플릿에서 **Visual C#**을 클릭합니다.

  4. 응용 프로그램 형식 목록에서 클래스 라이브러리를 클릭합니다.

  5. 이름 상자에 Bank를 입력한 다음 확인을 클릭합니다.

    [!참고]

    "Bank"라는 이름이 이미 사용되고 있으면 프로젝트에 대해 다른 이름을 선택합니다.

    새 Bank 프로젝트가 만들어져 솔루션 탐색기에 표시되고 코드 편집기에 Class1.cs 파일이 열립니다.

    [!참고]

    Class1.cs 파일이 코드 편집기에서 열리지 않으면 솔루션 탐색기에서 Class1.cs 파일을 두 번 클릭하여 엽니다.

  6. 단위 테스트를 만들기 위한 샘플 프로젝트에서 소스 코드를 복사합니다.

  7. Class1.cs의 원래 내용을 단위 테스트를 만들기 위한 샘플 프로젝트의 코드로 바꿉니다.

  8. 파일을 Bankaccount.cs로 저장 합니다.

  9. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.

이제 Bank라는 프로젝트가 준비되었습니다.이 프로젝트에는 테스트할 소스 코드와 테스트에 사용할 도구가 들어 있습니다.Bank에 대한 네임스페이스 BankAccountNS에는 다음 절차에서 테스트할 메서드가 포함된 공용 클래스인 BankAccount가 있습니다.

이 퀵 스타트에 우리가 초점을 Debit 메서드.돈이 사라지게 되 면 Debit 메서드에 호출 됩니다 계정을 클릭 하 고 다음 코드를 포함:

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

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

필수 구성 요소: 연습 준비 절차의 단계별 지침을 따릅니다.

단위 테스트 프로젝트를 만들려면

  1. 파일 메뉴를 선택 추가, 다음을 선택 하 고 새 프로젝트....

  2. 새 프로젝트 대화 상자에서 확장 설치 된, 확장 C#, 다음을 선택 하 고 테스트.

  3. 템플릿 목록에서 선택 단위 테스트 프로젝트.

  4. 이름 상자에 Banktest를 입력 하 고 다음 선택 확인.

    BankTests 프로젝트에 추가 되는 은행 솔루션입니다.

  5. BankTests 프로젝트에 대 한 참조를 추가 은행 솔루션입니다.

    솔루션 탐색기에서 선택 참조 에 있는 BankTests 프로젝트 및 다음 선택 참조 추가... 상황에 맞는 메뉴에서.

  6. 참조 관리자 대화 상자에서 확장 솔루션 다음 확인은 Bank 항목.

테스트 클래스 만들기

테스트 클래스를 확인 하기 위해 필요한의 BankAccount 클래스입니다.우리가 파일을 제공 하 고 보다 설명적인 이름을 클래스 해야 우리는 프로젝트 템플릿에 의해 생성 된 UnitTest1.cs 사용할 수 있습니다.우리는 한 단계에서 솔루션 탐색기에서 파일 이름을 바꾸면 가능 합니다.

클래스 파일 이름 바꾸기

솔루션 탐색기에서 BankTests 프로젝트의 UnitTest1.cs 파일을 선택 합니다.상황에 맞는 메뉴에서 선택 이름 바꾸기, Bankaccounttests.cs에 파일의 이름을 바꾸십시오.선택 프로젝트에 대 한 모든 참조를 코드 요소 'UnitTest1'에 이름을 바꿀 것인지 묻는 대화 상자에서.이 단계는 클래스의 이름을 변경 BankAccountTest.

이제 BankAccountTests.cs 파일에 다음 코드가 포함 되어 있습니다.

// unit test code
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

사용 하 여 추가 문을 테스트 프로젝트

사용 하 여도 추가할 수 있습니다 테스트에서 정규화 된 이름을 사용 하 여 완벽 하 게 하지 않고 호출할 수 있도록 클래스 문.클래스 파일의 맨 위에 추가 합니다.

using BankAccountNS

ms182532.collapse_all(ko-kr,VS.110).gif테스트 클래스의 요구 사항

다음 테스트 클래스에 대 한 최소 요구 사항은 다음과 같습니다.

  • [TestClass] 특성이 필요한 Microsoft 장치 관리에 대 한 테스트 프레임 워크에서 코드가 모든 클래스에 대 한 테스트 탐색기를 실행 하려면 단위 테스트 메서드가 포함 되어 있습니다.

  • 탐색기 실행 테스트를 사용 하 여 원하는 각 테스트 메서드에 있어야는 [TestMethod]특성.

되지 않은 단위 테스트 프로젝트의 다른 클래스를 가질 수 있습니다는 [TestClass] 특성을 가질 수 있습니다 다른 방법이 없는 테스트 클래스에는 [TestMethod] 특성.테스트 메서드를 이러한 기타 클래스 및 메서드를 사용할 수 있습니다.

첫 번째 테스트 메서드 만들기

이 절차에서는 단위 테스트의 동작을 확인 하는 방법을 작성할 수 있는 Debit 메서드는 BankAccount 클래스.메서드는 위에 나열 되어 있습니다.

테스트 대상 메서드를 분석 하 여 가지 확인 해야 하는 최소한 세 개의 동작이 결정 됩니다.

  1. 메서드에서 throw 된 [ArgumentOutOfRangeException] 대변 금액 잔액 보다 클 경우입니다.

  2. 또한 throw ArgumentOutOfRangeException 대변 금액 보다 작은 경우 0입니다.

  3. 경우에는 검사 1에서.) 및 2입니다.) 충족 되, 메서드가 양 계정 잔고에서 뺍니다.

첫 번째 테스트에서 올바른 금액 (하나는 계정 잔고 보다 하 고 0 보다 크면) 계정에서 정확한 양은 삭제 되는 확인 합니다.

테스트 메서드를 만들려면

  1. 사용 하는 추가 BankAccountNS; BankAccountTests.cs 파일에 문.

  2. 다음 메서드를 사용 하는 추가 BankAccountTests 클래스:

    // unit test code
    [TestMethod]
    public void Debit_WithValidAmount_UpdatesBalance()
    {
        // arrange
        double beginningBalance = 11.99;
        double debitAmount = 4.55;
        double expected = 7.44;
        BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
    
        // act
        account.Debit(debitAmount);
    
        // assert
        double actual = account.Balance;
        Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
    }
    

대신 간단한 메서드입니다.우리를 새 설정 BankAccount 개체는 잔액을 하 고 다음을 올바른 금액을 인출 합니다.이제 Microsoft 단위 테스트 프레임 워크에 대 한 관리 되는 코드 사용 AreEqual 최종 잔고 예상할 무엇 인지 확인 합니다.

ms182532.collapse_all(ko-kr,VS.110).gif테스트 메서드의 요구 사항

테스트 메서드는 다음 요구 사항을 충족 해야 합니다.

  • 방법으로 데코레이팅되어야는 [TestMethod] 특성.

  • 해당 메서드는 void를 반환해야 합니다.

  • 메서드 매개 변수를 사용할 수 없습니다.

빌드 및 테스트 실행

빌드 및 테스트를 실행 하려면

  1. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

    오류가 없으면 UnitTestExplorer 창이 나타납니다 Debit_WithValidAmount_UpdatesBalance않습니다 테스트 실행 그룹.성공적인 빌드 후 테스트 탐색기 나타나지 않으면 선택 테스트 다음의 메뉴에서 선택 Windows, 다음을 선택 하 고 테스트 탐색기.

  2. 선택 모두 실행 테스트를 실행할 수 있습니다.테스트 상태 표시줄은 창의 맨 실행 되는 동안 애니메이션 효과가 나타납니다.테스트 중 하나라도 실패 하면 테스트 실행이 끝날 때 모든 테스트 메서드에 전달 하는 경우 녹색 또는 빨간색 막대를 끕니다.

  3. 이 경우 테스트는 실패 하지.이동 된 테스트 메서드를 테스트 실패.있어야 합니다.메서드의 테스트 탐색기 창의 아래쪽에 세부 정보를 보려면 선택 합니다.

코드를 수정 하 고 테스트를 다시 실행 하십시오.

테스트 결과 분석

테스트 결과 오류를 설명 하는 메시지가 포함 되어 있습니다.에 AreEquals 메서드를 메시지를 표시 하면 예상 된 (의 (**예상 <XXX>**매개 변수) 실제로 보내거나 받는 (의 실제 <YYY> 매개 변수).예상 되었던 잔액 잔액에서 거부할 수 있지만 출금 양 올랐습니다.

Reexamination 직불 코드의 단위 테스트는 버그를 찾는데 성공 했다는 것을 보여 줍니다.출금 차감 해야 계정 잔액에 추가 됩니다.

버그 수정

오류를 해결 하려면 단순히 줄 바꾸기

m_balance += amount;

다음과 같이 바꿀 수 있습니다.

m_balance -= amount;

테스트를 다시 실행

테스트 탐색기에서 선택 하 여 모두 실행 테스트를 다시 실행 합니다.빨강/녹색 막대가 녹색으로 바뀌고 테스트 이동은 테스트 통과 그룹.

사용 단위 테스트를 사용 하 여 코드를 향상 시키기 위해

반복적인 프로세스의 분석, 단위 테스트 개발 및 리팩터링을 프로덕션 코드를 더욱 강력 하 고 효과적인 작업 수 있는 방법 설명.

문제 분석

공제 유효 크기는 정확 하 게 인지를 확인 하기 위한 테스트 메서드를 만든 후에 Debit 메서드를 우리 수 설정 나머지 사례를 우리의 원래 분석에.

  1. 메서드에서 throw 된 ArgumentOutOfRangeException 대변 금액 잔액 보다 클 경우입니다.

  2. 또한 throw ArgumentOutOfRangeException 대변 금액 보다 작은 경우 0입니다.

테스트 메서드를 만듭니다.

이러한 문제를 해결 하려면 테스트 메서드를 만들 때 첫 번째로 기대할 것으로 보입니다.

//unit test method
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    account.Debit(debitAmount);

    // assert is handled by ExpectedException
}

우리가 사용 하는 ExpectedExceptionAttribute 오른쪽 예외가 throw 되었음을 어설션할 수 있는 특성입니다.특성을 사용 하지 않으면 실패 하는 테스트 하면는 ArgumentOutOfRangeException throw 됩니다.테스트를 실행 하 여 모두 양수 및 음수 debitAmount 값과 다음 throw 제네릭 테스트 대상 메서드를 일시적으로 수정 ApplicationException 때 양이 0 보다 작거나 테스트 동작 정확 하 게 보여 줍니다.출금된 금액 잔액 보다 클 때 대/소문자를 테스트 하려면 수행 해야 됩니다.

  1. 라는 새 테스트 메서드를 만들 Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. 메서드 본문에서 복사 Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange 새 메서드를입니다.

  3. 설정 된 debitAmount 잔액 보다 큰 숫자를.

테스트를 실행 합니다.

두 가지 방법에 대 한 다른 값을 가진 실행 debitAmount 테스트 우리의 나머지 경우 적절 하 게 처리 하는 방법을 보여 줍니다.세 테스트를 모두 확인 모든 경우에 우리의 원래 분석 제대로 다루지 실행 합니다.

분석을 계속 합니다.

그러나 마지막 두 테스트 방법을 다소 문제가 있습니다.우리 두 테스트를 실행 하면 어떤 조건 테스트 코드에서 throw 확신할 수 없습니다.두 조건을 구별 방법이 유용 합니다.으로 기타 문제에 대 한 인지가 우리의 신뢰도 테스트를 알면 어떤 조건을 위반한 증가 시킨다 드러납니다.이 정보는 대부분 테스트 메서드에 의해 throw 되는 경우는 예외를 처리 하는 생산 메커니즘에 유용 합니다.메서드가 throw 모든 관련 도움이 되 면 더 많은 정보를 생성 하지만 ExpectedException 특성이이 정보를 제공할 수 없습니다.

테스트 메서드가 다시 살펴보면, 우리가 사용 하 여 두 조건문 참조는 ArgumentOutOfRangeException 이름 인수를 매개 변수로 사용 하는 생성자.

throw new ArgumentOutOfRangeException("amount");

MSDN 라이브러리의 검색에서 생성자에 풍부한 정보를 보고 있는지을 알 수 있습니다.ArgumentOutOfRangeException(String, Object, String)인수, 인수 값 및 사용자 정의 메시지의 이름을 포함합니다.우리가이 생성자를 사용 하는 테스트 대상 메서드에서는 리팩터링할 수 있습니다.더욱 우수한 오류 지정 우리가 공개적으로 사용할 수 있는 형식 멤버가 사용할 수 있습니다.

테스트 대상 코드를 리팩터링 합니다.

우리가 먼저 클래스 범위에서 오류 메시지에 대 한 두 개의 상수를 정의합니다.

// class under test
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";

우리 두 조건문에서 다음 수정 된 Debit 메서드:

// method under test
// ...
    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
    }

    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
    }
// ...

테스트 메서드에 리팩터링

우리의 테스트 메서드를 우리가 먼저 제거는 ExpectedException 특성.그 자리에서 throw 되는 예외를 catch 하 고 올바른 조건문에서 발생 하는 확인 하십시오.그러나 우리의 나머지 조건을 확인 하는 두 옵션 중 지금 결정 해야 합니다.예를 들어 있는 Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 메서드를 우리가 걸릴 수 있습니다 다음 작업 중 하나:

  • Assert는 ActualValue 예외의 속성 (의 두 번째 매개 변수는 ArgumentOutOfRangeException 생성자)의 잔액 보다 큽니다.우리가 테스트 하는 것이 옵션을 사용 해야는 ActualValue 속성에 대 한 예외는 beginningBalance 테스트 메서드의 변수 및 또한 필요 하 고 있는지는 ActualValue 0 보다 큰.

  • 어설션 (생성자의 세 번째 매개) 메시지에 포함 되어 있는지는 DebitAmountExceedsBalanceMessage 에 정의 BankAccount 클래스입니다.

StringAssert.Contains Microsoft 단위 테스트 프레임 워크에서 메서드를 사용 우리에 게 필요한 첫 번째 옵션을 계산 하지 않고 두 번째 옵션을 확인 합니다.

두 번째 시도에서 개정 Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 다음과 같이 표시 됩니다:

[TestMethod]
public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
    }
}

다시 테스트 하 고 다시 작성을 다시 분석

우리가 테스트 메서드가 서로 다른 값을 다시 테스트 하는 경우 다음과 같은 사실도 마주치.

  1. 우리를 사용 하 여 올바른 오류를 catch 하는 경우는 debitAmount 의 잔액 보다 큰의 Contains 가공, 어설션 예외는 무시 되 고 있으므로 테스트 메서드를 전달 합니다.이것이 우리가 원하는 동작입니다.

  2. 우리가 사용 하는 경우는 debitAmount, 잘못 된 오류 메시지가 반환 되기 때문에 assert에 실패 합니다.또한 임시 우리를 도입 하는 경우는 assert에 실패 ArgumentOutOfRange 다른 지점에서 메서드가 테스트 코드 경로에서 예외입니다.너무 좋아입니다.

  3. 경우는 debitAmount 값이 유효한 (즉, 잔액 0 보다 크고 작은 예외가 catch, assert는 절대로 catch 하도록 합니다.테스트 메서드를 전달합니다.테스트 메서드에 예외가 throw 되지 않은 경우 실패 하도록 하겠습니다 있기 때문에 두 일입니다.

세 번째 사실은 버그 당사의 테스트 방법입니다.추가 문제를 해결 하려고 하는 Fail 예외가 throw 된 경우 처리 테스트 메서드의 끝에 어설션.

꽂은 후 올바른 예외를 찾았다면 이제 테스트 실패를 보여 줍니다.Catch 문은 예외를 다시 설정 하 고 새 assert에 실패 한 메서드를 실행 하려면 계속 합니다.추가 새 문제를 해결 하는 return 문 뒤의 StringAssert.꽂은 후 우리 문제를 고정 한 것을 확인 합니다.우리의 최종 버전을 Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 다음과 같이 보입니다:

[TestMethod]
public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
        return;
    }
    Assert.Fail("No exception was thrown.")
}

이 마지막 섹션에는 수행한 테스트 코드 개선 작업 더 강력 하 고 유용한 테스트 메서드를 led.하지만 보다 중요 한 추가적인 분석 또한 테스트 프로젝트에 더 나은 코드를 led.