다음을 통해 공유


퀵 스타트: 테스트 탐색기를 사용한 테스트 구동 방식 개발

개발의 많은 증분 단계를 제대로 작동 하는 코드를 유지 하기 위해 단위 테스트를 만드는 것이 좋습니다.일부 타사에서 개발한를 비롯 한 단위 테스트를 작성 하는 데 사용할 수 있는 몇 가지 프레임 워크입니다.일부 테스트 프레임 워크는 다른 언어 또는 플랫폼의 테스트에 전문화 되어 있습니다.테스트 탐색기는 이러한 프레임 워크의 모든 단위 테스트에 대 한 단일 인터페이스를 제공 합니다.어댑터는 가장 일반적으로 사용 되는 프레임 워크를 사용할 수 있으며 다른 프레임 워크에 대 한 자신의 어댑터를 작성할 수 있습니다.

Visual Studio 이전 버전에서 찾을 수 있는 단위 테스트 windows 탐색기 테스트를 대체 합니다.그 이점은 다음과 같습니다.

  • 다음 중 하나를 실행 합니다.NET, 비관리, 데이터베이스 및 다른 종류의 단일 인터페이스를 사용 하 여 테스트 합니다.

  • 같은 단위 테스트 프레임 워크를 사용 하 여 NUnit 또는 MSTest 프레임 워크입니다.

  • 한 창에 일반적으로 필요한 모든 정보를 참조 하십시오.자세한 내용을 찾을 수 있습니다의 속성이 창.

테스트 탐색기 사용

실행 단위 테스트 탐색기를 사용 하 여 테스트 하려면

  1. 테스트 프레임 워크를 사용 하는 단위 테스트를 만듭니다.

    예를 들어, 테스트를 만드는 데는 MSTest 프레임 워크 사용 합니다.

    1. 테스트 프로젝트를 만듭니다.

      새 프로젝트 대화 상자에서 확장 Visual Basic, C#, 또는 Visual C++, 다음을 선택 하 고 테스트.

      선택 단위 테스트 프로젝트.

    2. 각 단위 테스트는 메서드로 작성 합니다.각 테스트 메서드로 접두사는 [TestMethod] 특성.

  2. 메뉴 표시줄에서 선택 테스트, 를 실행 하는 단위 테스트, 모든 테스트.

    솔루션을 빌드하고 테스트를 실행.

    테스트 탐색기가 열리고에 결과 요약이 표시 됩니다.

테스트의 전체 목록을 보려면: 선택 모두 표시 범주에 있습니다.

요약으로 돌아가려면 선택은 보기.

테스트 결과의 세부 정보를 보려면. 테스트 테스트를 탐색기에서 선택 합니다.예외 메시지와 같은 세부 정보 세부 정보 창에 표시 됩니다.속성 창에서 더 자세히를 볼 수도 있습니다.

테스트의 코드를 탐색 하기: 탐색기, 테스트에 테스트를 두 번 클릭 하거나 선택 열기 테스트 바로 가기 메뉴입니다.

테스트를 디버깅 하려면: 테스트를 하나 이상에 대 한 바로 가기 메뉴를 열고 선택 선택한 테스트 디버그.

중요중요

표시 되는 결과 대 한 가장 최근의 실행 됩니다.색칠 된 결과 테스트 실행에 대 한 결과만 표시 됩니다.예를 들어, 몇 가지 테스트를 실행 하 고 일부는 실패 하 고 다음만 성공적으로 테스트를 실행할 경우 다음 결과 표시줄 모두 녹색 표시 됩니다.

[!참고]

테스트 표시 되 면 테스트 탐색기 사용 중인 테스트 프레임 워크에 연결 하려면 어댑터가 설치 되어 있는지 확인 하십시오.자세한 내용은 를 사용 하 여 다른 테스트 프레임 워크와 테스트 탐색기.

연습: 단위 테스트를 사용 하 여 메서드를 개발할 수

이 연습에서는 Microsoft 단위 테스트 프레임 워크를 사용 하 여 C#에서 테스트 메서드를 개발 하는 방법을 보여 줍니다.하면 쉽게 그 다른 언어 및 Nunit과 같은 다른 테스트 프레임 워크를 사용 하도록 적응할 수 있습니다.자세한 내용은 를 사용 하 여 다른 테스트 프레임 워크.

테스트를 만들고 메서드

  1. Visual C# 클래스 라이브러리 프로젝트를 만듭니다.이 프로젝트를 배달 하려는 코드가 포함 됩니다.이 예제에서는 이름 MyMath.

  2. 테스트 프로젝트를 만듭니다.

    • 새 프로젝트 대화를 선택 C#, 테스트 및 다음 선택 단위 테스트 프로젝트.

      새 코드 및 테스트 프로젝트

  3. 기본 테스트 메서드를 작성 합니다.특정 입력을 얻은 결과 확인 합니다.

      [TestMethod]
      public void BasicRooterTest()
      {
        // Create an instance to test:
        Rooter rooter = new Rooter();
        // Define a test input and output value:
        double expectedResult = 2.0;
        double input = expectedResult * expectedResult;
        // Run the method under test:
        double actualResult = rooter.SquareRoot(input);
        // Verify the result:
        Assert.AreEqual(expectedResult, actualResult,
            delta: expectedResult / 100);
      }
    
  4. 테스트 메서드를 생성 합니다.

    1. 에 커서를 놓고 Rooter를 클릭 한 다음 바로 가기 메뉴에서 선택 생성, 새 형식.

    2. 새 형식을 생성 대화 상자에서 설정 프로젝트 에 클래스 라이브러리 프로젝트입니다.이 예제에서는 것입니다 MyMath.

    3. 에 커서를 놓고 SquareRoot를 클릭 한 다음 바로 가기 메뉴에서 선택 생성, 메서드 스텁.

  5. 단위 테스트를 실행 합니다.

    • 테스트 메뉴를 선택 단위 테스트 실행, 모든 테스트.

      솔루션을 빌드하고 실행 합니다.

      테스트 탐색기가 열리고 결과가 표시 됩니다.

      테스트에서 나타납니다 테스트 실패.

  6. 테스트의 이름을 선택 합니다.

    테스트의 세부 사항을 테스트 탐색기의 아래 부분에 나타납니다.

  7. 선택 항목에서 스택 추적 테스트에 실패 합니다.

실패한 테스트를 보여 주는 단위 테스트 탐색기.

이 시점에서는 테스트 및 테스트를 통과할 수 있도록 수정 합니다 스텁 만들었습니다.

모든 후, 모든 테스트를 통과 변경

  1. MyMath\Rooter.cs, 코드의 개선 SquareRoot:

     public double SquareRoot(double input)
      {
        return input / 2;
      }
    
  2. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    코드를 빌드하고 테스트를 실행 합니다.

    테스트가 통과됩니다.

    통과한 테스트를 보여 주는 단위 테스트 탐색기.

입력 범위를 확장 하는 테스트를 추가 합니다.

  1. 모든 경우에 작동 하는 코드의 신뢰도 향상 시키기 위해 광범위 한 입력된 값을 시도 하는 테스트를 추가 합니다.

    팁

    전달 하는 기존 테스트를 지양 합니다.대신, 새 테스트를 추가 합니다.기존 테스트는 사용자 요구 사항이 바뀔 때만 변경 합니다.이 정책 작업 코드를 확장 하 여 기존 기능 잃지 않을 수 있습니다.

    테스트 클래스에 입력된 값의 범위를 시도 하는 다음 테스트를 추가 합니다.

      [TestMethod]
      public void RooterValueRange()
      {
        // Create an instance to test:
        Rooter rooter = new Rooter();
        // Try a range of values:
        for (double expectedResult = 1e-8;
            expectedResult < 1e+8;
            expectedResult = expectedResult * 3.2)
        {
          RooterOneValue(rooter, expectedResult);
        }
      }
    
      private void RooterOneValue(Rooter rooter, double expectedResult)
      {
        double input = expectedResult * expectedResult;
        double actualResult = rooter.SquareRoot(input);
        Assert.AreEqual(expectedResult, actualResult,
            delta: expectedResult / 1000);
      }
    
  2. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    첫 번째 테스트를 계속 전달 되지만 새 테스트에 실패 합니다.

    오류가 발생 한 시점을 확인 하려면 실패 한 테스트를 선택 하 고 탐색기 테스트 아래 부분에서 맨 위에 있는 항목의 선택은 스택 추적.

  3. 무엇이 잘못 되었을까요 보려면 테스트 대상 메서드를 검사 합니다.에 MyMath.Rooter 클래스, 코드를 다시 작성 하십시오.

      public double SquareRoot(double input)
      {
        double result = input;
        double previousResult = -input;
        while (Math.Abs(previousResult - result) > result / 1000)
        {
          previousResult = result;
          result = result - (result * result - input) / (2 * result);
        }
        return result;
      }
    
  4. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    이제 두 테스트를 통과합니다.

예외적인 경우에 테스트를 추가 합니다.

  1. 음수 입력에 대 한 테스트를 추가 합니다.

           [TestMethod]
            public void RooterTestNegativeInputx()
            {
                Rooter rooter = new Rooter();
                try
                {
                    rooter.SquareRoot(-10);
                }
                catch (ArgumentOutOfRangeException e)
                {
                    return;
                }
                Assert.Fail();
            }
    
  2. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    방법에서 루프에서 테스트 및 수동으로 취소 해야 합니다.

  3. 선택 취소.

    10 초 후 테스트를 중지 합니다.

  4. 메서드 코드를 수정 하십시오.

      public double SquareRoot(double input)
      {
        if (input <= 0.0) 
        {
          throw new ArgumentOutOfRangeException();
        } 
      ...
    
  5. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    모든 테스트를 통과 합니다.

테스트를 변경 하지 않고 리팩터링

  1. 코드를 간단 하 게 테스트를 변경 하지 마십시오.

    팁

    A 리팩터링 변경을 더 잘 수행 하는 코드를 확인 하거나 코드를 더 쉽게 이해할 수 있도록 만들어졌습니다.따라서 테스트 변경 되지 않습니다 하 고 코드의 동작이 변경 되지는지 않습니다.

    하면 리팩터링 단계 개별적으로 기능을 확장 하는 단계를 수행 하는 것이 좋습니다.테스트 변경 되지 않은 상태로 유지 하면 실수로 버그 리팩터링을 하는 동안 제거한 후 자신감을 제공 합니다.

      public class Rooter
      {
        public double SquareRoot(double input)
        {
          if (input <= 0.0) 
          {
            throw new ArgumentOutOfRangeException();
          }
          double result = input;
          double previousResult = -input;
          while (Math.Abs(previousResult - result) > result / 1000)
          {
            previousResult = result;
            result = (result + input / result) / 2;
            //was: result = result - (result * result - input) / (2*result);
          }
          return result;
        }
      }
    
  2. 선택 실행.

    여전히 모든 테스트를 통과 합니다.

    통과한 테스트 3개를 보여 주는 단위 테스트 탐색기.