연습: 관례에서 생성 기능을 통한 테스트 우선 지원

이 항목에서는 테스트 우선 개발을 지원하는 관례에서 생성 기능을 사용하는 방법을 보여 줍니다.

테스트 우선 개발은 먼저 제품 사양을 기반으로 단위 테스트를 작성한 다음 테스트 성공에 필요한 소스 코드를 작성하는 소프트웨어 디자인 방법입니다. Visual Studio에서는 새 형식과 멤버를 정의하기 전에 테스트 사례에서 처음 참조할 때 소스 코드에서 해당 형식과 멤버를 생성하여 테스트 우선 개발을 지원합니다.

Visual Studio에서는 워크플로의 중단을 최소화하면서 새 형식과 멤버를 생성합니다. 코드에서 현재 위치를 벗어나지 않고 형식, 메서드, 속성, 필드 또는 생성자의 스텁을 만들 수 있습니다. 형식 생성을 위한 옵션을 지정하기 위해 대화 상자를 여는 경우 대화 상자가 닫힐 때 포커스가 현재 열린 파일로 즉시 돌아옵니다.

관례에서 생성 기능은 Visual Studio와 통합되는 테스트 프레임워크에서 사용할 수 있습니다. 이 항목에서는 Microsoft 단위 테스트 프레임워크를 보여 줍니다.

참고

이 연습은 Visual Basic 개발 설정 또는 Visual C# 개발 설정을 고려하여 작성되었습니다. 이 연습에서는 다른 설정도 사용하여 작업합니다.

권장 설정으로 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 클릭하는 절차를 사용하면 됩니다. 설정 가져오기 및 내보내기 마법사의 첫 페이지에서 모든 설정 다시 설정을 클릭합니다. 기본 설정 모음을 선택하십시오. 페이지에서 Visual Basic 개발 설정 또는 Visual C# 개발 설정을 클릭합니다.

Windows 클래스 라이브러리 프로젝트와 테스트 프로젝트를 만들려면

  1. Visual C# 또는 Visual Basic에서 Windows 클래스 라이브러리 프로젝트를 새로 만듭니다. 사용하는 언어에 따라 이 프로젝트의 이름을 GFUDemo_VB 또는 GFUDemo_CS로 지정합니다.

  2. 솔루션 탐색기에서 맨 위의 솔루션 아이콘을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 프로젝트를 클릭합니다. 새 프로젝트 대화 상자의 왼쪽에 있는 프로젝트 형식 창에서 테스트를 클릭합니다.

  3. 템플릿 창에서 테스트 프로젝트를 클릭하고 TestProject1의 기본 이름을 적용합니다. 다음 그림에서는 Visual C#에서 표시되는 대화 상자를 보여 줍니다. Visual Basic에서 표시되는 대화 상자도 이와 유사합니다.

    새 프로젝트 대화 상자

    새 테스트 프로젝트 대화 상자

  4. 확인을 클릭하여 새 프로젝트 대화 상자를 닫습니다. 이제 테스트 작성을 시작할 준비가 되었습니다.

단위 테스트에서 새 클래스를 생성하려면

  1. 테스트 프로젝트에는 UnitTest1이라는 파일이 들어 있습니다. 솔루션 탐색기에서 이 파일을 두 번 클릭하여 코드 편집기에서 엽니다. 테스트 클래스와 테스트 메서드가 생성되었습니다.

  2. UnitTest1 클래스의 선언을 찾아 AutomobileTest로 이름을 바꿉니다. C#에서 UnitTest1() 생성자가 있는 경우 생성자의 이름을 AutomobileTest()로 바꿉니다.

    참고

    IntelliSense에서는 IntelliSense 문 완성을 위해 두 가지 방법을 제공하며 그 중 하나는 완성 모드이고 다른 하나는 제안 모드입니다. 제안 모드는 클래스와 멤버를 정의하기 전에 사용하는 경우에 사용됩니다. IntelliSense 창이 열려 있으면 Ctrl+Alt+스페이스바를 눌러 완성 모드와 제안 모드 간을 전환할 수 있습니다. 자세한 내용은 멤버 목록을 참조하십시오. 제안 모드는 다음 단계에서 Automobile을 입력할 때 도움이 됩니다.

  3. TestMethod1() 메서드를 찾아 이름을 DefaultAutomobileIsInitializedCorrectly()로 바꿉니다. 다음 그림에 표시된 것과 같이 이 메서드 내에서 Automobile이라는 클래스의 새 인스턴스를 만듭니다. 컴파일 타임 오류를 나타내는 물결선이 나타나고 스마트 태그가 형식 이름 아래에 나타납니다. 스마트 태그의 정확한 위치는 Visual Basic을 사용하는지 아니면 Visual C#을 사용하는지에 따라 다릅니다.

    Visual Basic

    Visual Basic의 스마트 태그 밑줄

    Visual C#

    C#의 스마트 태그 밑줄

  4. 스마트 태그 위에 마우스 포인터를 놓고 Automobile이라는 형식이 아직 정의되지 않았음을 나타내는 오류 메시지를 확인합니다. 스마트 태그를 클릭하거나 Ctrl+.(Ctrl+마침표)를 눌러 다음 그림에 표시된 것과 같이 관례에서 생성 바로 가기 메뉴를 엽니다.

    Visual Basic

    Visual Basic의 스마트 태그 상황에 맞는 메뉴

    Visual C#

    C#의 스마트 태그 상황에 맞는 메뉴

  5. 이제 다음과 같은 두 가지 선택 옵션이 있습니다. Automobile에 대한 클래스 생성을 클릭하여 테스트 프로젝트에서 새 파일을 만들고 Automobile이라는 빈 클래스로 채울 수 있습니다. 이는 현재 프로젝트의 새 파일에서 기본 액세스 한정자를 가진 새 클래스를 가장 빨리 만들 수 있는 방법입니다. 새 형식 생성을 클릭하여 새 형식 생성 대화 상자를 열 수도 있습니다. 이 경우 기존 파일에 클래스를 넣거나 다른 프로젝트에 파일을 추가하는 등의 옵션이 제공됩니다.

    새 형식 생성을 클릭하여 다음 그림에 표시된 것과 같은 새 형식 생성 대화 상자를 엽니다. 프로젝트 목록에서 GFUDemo_VB 또는 GFUDemo_CS를 클릭하여 Visual Studio에서 테스트 프로젝트 대신 소스 코드 프로젝트에 파일을 추가하도록 합니다.

    새 형식 생성 대화 상자

    새 형식 생성 대화 상자

  6. 확인을 클릭하여 대화 상자를 닫고 새 파일을 만듭니다.

  7. 솔루션 탐색기의 GFUDemo_VB 또는 GFUDemo_CS 프로젝트 노드 아래에 새로운 Automobile.vb 또는 Automobile.cs 파일이 있는지 확인합니다. 코드 편집기에서 포커스가 여전히 AutomobileTest.DefaultAutomobileIsInitializedCorrectly에 있습니다. 중단을 최소화하면서 계속 테스트를 작성할 수 있습니다.

속성 스텁을 생성하려면

  • 제품 사양에 따라 Automobile 클래스에 Model 및 TopSpeed라는 두 가지 공용 속성이 있다고 가정합니다. 이러한 속성은 기본 생성자에 의해 기본값 "Not specified" 및 -1로 초기화되어야 합니다. 다음 단위 테스트에서는 기본 생성자가 이러한 속성을 올바른 기본값으로 설정하는지 확인합니다.

    다음 코드 줄을 DefaultAutomobileIsInitializedCorrectly에 추가합니다.

    Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
    
    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    

    코드에서 Automobile에 대한 정의되지 않은 두 가지 속성을 참조하기 때문에 스마트 태그가 나타납니다. Model의 스마트 태그를 클릭한 다음 속성 스텁 생성을 클릭합니다. TopSpeed 속성의 속성 스텁도 생성합니다.

    Automobile 클래스에서 새 속성의 형식이 컨텍스트에서 올바르게 유추됩니다.

    다음 그림에서는 스마트 태그 바로 가기 메뉴를 보여 줍니다.

    Visual Basic

    Visual Basic의 속성 생성 상황에 맞는 메뉴

    Visual C#

    C#의 속성 생성 상황에 맞는 메뉴

소스 코드를 찾으려면

  • 탐색 기능을 사용하여 Automobile.cs 또는 Automobile.vb 소스 코드 파일로 이동하여 새 속성이 생성되었는지 확인합니다.

    탐색 기능을 사용하면 형식 이름이나 이름의 일부와 같은 텍스트 문자열을 빠르게 입력하고 결과 목록에서 요소를 클릭하여 원하는 위치로 이동할 수 있습니다.

    코드 편집기에서 클릭하고 Ctrl+,(Ctrl+쉼표)를 눌러 탐색 대화 상자를 엽니다. 텍스트 상자에 automobile을 입력합니다. 목록에서 Automobile 클래스를 선택한 다음 확인을 클릭합니다.

    탐색 창이 다음 그림에 나와 있습니다.

    탐색 창

    탐색 대화 상자

새 생성자의 스텁을 생성하려면

  1. 이 테스트 방법에서는 지정한 값을 갖도록 Model 및 TopSpeed 속성을 초기화할 생성자 스텁을 생성합니다. 이후에 테스트를 완료하기 위한 코드를 더 추가합니다. 다음 추가 테스트 메서드를 AutomobileTest 클래스에 추가합니다.

    <TestMethod()> Public Sub AutomobileWithModelNameCanStart()
        Dim model As String = "Contoso"
        Dim topSpeed As Integer = 199
        Dim myAuto As New Automobile(model, topSpeed)
    End Sub
    
    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. 새 클래스 생성자 아래에서 스마트 태그를 클릭하고 생성자 스텁 생성을 클릭합니다. Automobile 클래스 파일에서 새 생성자가 생성자 호출에서 사용된 로컬 변수의 이름을 검사하고 Automobile 클래스에서 이름이 동일한 속성을 찾은 다음 Model 및 TopSpeed 속성에 인수 값을 저장하는 코드를 생성자 본문에 제공했는지 확인합니다. Visual Basic에서 새 생성자의 _model 및 _topSpeed 필드는 Model 및 TopSpeed 속성에 대해 암시적으로 정의된 지원 필드입니다.

  3. 새 생성자를 생성한 후 DefaultAutomobileIsInitializedCorrectly에서 기본 생성자에 대한 호출 아래에 물결선이 나타납니다. Automobile 클래스에 인수를 사용하지 않는 생성자가 없다는 오류 메시지가 나타납니다. 매개 변수가 없는 명시적 기본 생성자를 생성하려면 스마트 태그를 클릭한 다음 생성자 스텁 생성을 클릭합니다.

메서드의 스텁을 생성하려면

  1. 사양에 따라 Model 및 TopSpeed 속성이 기본값 이외의 값으로 설정된 경우 새 Automobile을 실행 중 상태로 전환할 수 있다고 가정합니다. 다음 코드 줄을 AutomobileWithModelNameCanStart 메서드에 추가합니다.

    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. myAuto.Start 메서드 호출의 스마트 태그를 클릭한 다음 메서드 스텁 생성을 클릭합니다.

  3. IsRunning 속성의 스마트 태그를 클릭한 다음 속성 스텁 생성을 클릭합니다. Automobile 클래스에 이제 다음 코드가 포함되어 있습니다.

    Public Class Automobile
        Sub New(ByVal model As String, ByVal topSpeed As Integer)
            _model = model
            _topSpeed = topSpeed
        End Sub
        Sub New()
            ' TODO: Complete member initialization 
        End Sub
    
        Property Model() As String
        Property TopSpeed As Integer
        Property IsRunning As Boolean
        Sub Start()
            Throw New NotImplementedException
        End Sub
    End Class
    
    public class Automobile
    {
        public string Model { get; set; }
        public int TopSpeed { get; set; }
    
        public Automobile(string model, int topSpeed)
        {
            this.Model = model;
            this.TopSpeed = topSpeed;
        }
    
        public Automobile()
        {
            // TODO: Complete member initialization
        }
    
        public void Start()
        {
            throw new NotImplementedException();
        }
    
        public bool IsRunning { get; set; }
    }
    

테스트를 실행하려면

  1. 테스트 메뉴에서 실행을 가리킨 다음 솔루션의 모든 테스트를 클릭합니다. 이 명령은 현재 솔루션에 대해 작성된 모든 테스트 프레임워크의 모든 테스트를 실행합니다.

    이 경우 두 가지 테스트가 있으며 둘 다 예상대로 실패합니다. DefaultAutomobileIsInitializedCorrectly 테스트는 Assert.IsTrue 조건이 False를 반환하기 때문에 실패합니다. AutomobileWithModelNameCanStart 테스트는 Automobile 클래스의 Start 메서드가 예외를 throw하기 때문에 실패합니다.

    테스트 결과 창이 다음 그림에 나와 있습니다.

    테스트 결과 창

    실패한 테스트 결과

  2. 테스트 결과 창에서 각 테스트 결과 행을 두 번 클릭하여 각 테스트 실패의 위치로 이동합니다.

    참고

    두 번 클릭해도 코드에서 테스트 실패 위치로 이동되지 않으면 도구 메뉴에서 옵션을 클릭한 다음 테스트 도구를 확장하고 테스트 실행을 클릭하는 절차를 수행하여 이 기능을 활성화할 수 있습니다. 실패했거나 결과가 불충분한 단위 테스트 결과를 두 번 클릭하여 테스트의 실패 지점 표시 확인란을 선택합니다.

소스 코드를 구현하려면

  1. 다음 코드를 기본 생성자에 추가하여 Model, TopSpeed 및 IsRunning 속성이 모두 올바른 기본값 "Not specified", -1 및 True(true)로 초기화되도록 합니다.

    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = True
    End Sub
    
    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Start 메서드가 호출되면 Model 또는 TopSpeed 속성이 기본값 이외의 값으로 설정된 경우에만 IsRunning 플래그를 true로 설정합니다. 메서드 본문에서 NotImplementedException을 제거하고 다음 코드를 추가합니다.

    Sub Start()
        If Model <> "Not specified" Or TopSpeed <> -1 Then
            IsRunning = True
        Else
            IsRunning = False
        End If
    End Sub
    
    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

테스트를 다시 실행하려면

  • 테스트 메뉴에서 실행을 가리킨 다음 솔루션의 모든 테스트를 클릭합니다. 이번에는 테스트가 통과합니다. 테스트 결과 창이 다음 그림에 나와 있습니다.

    테스트 결과 창

    성공한 테스트 결과

참고 항목

작업

방법: 기호 검색 - 개체, 정의 및 참조

참조

멤버 목록

개념

관례에서 생성