연습: 관례에서 생성 기능을 통한 테스트 우선 개발Walkthrough: Test-first development with the Generate From Usage feature

이 항목에서는 테스트 우선 개발을 지원하는 관례에서 생성 기능을 사용하는 방법을 보여 줍니다.This topic demonstrates how to use the Generate From Usage feature, which supports test-first development.

테스트 우선 개발 은 먼저 제품 사양에 따라 단위 테스트를 작성한 다음 테스트에 성공하는 데 필요한 소스 코드를 작성하는 소프트웨어 디자인 방식입니다.Test-first development is an approach to software design in which you first write unit tests based on product specifications, and then write the source code that is required to make the tests succeed. Visual Studio는 정의하기 전에 테스트 사례에서 처음 참조할 때 소스 코드에서 새 형식과 멤버를 생성하여 테스트 우선 개발을 지원합니다.Visual Studio supports test-first development by generating new types and members in the source code when you first reference them in your test cases, before they are defined.

Visual Studio는 워크플로를 중단을 최소화하면서 새 형식과 멤버를 생성합니다.Visual Studio generates the new types and members with minimal interruption to your workflow. 코드에서 현재 위치를 벗어나지 않고 형식, 메서드, 속성, 필드 또는 생성자에 대한 스텁을 만들 수 있습니다.You can create stubs for types, methods, properties, fields, or constructors without leaving your current location in code. 형식 생성 옵션을 지정할 수 있는 대화 상자를 여는 경우 대화 상자를 닫으면 포커스가 즉시 현재 열린 파일로 돌아갑니다.When you open a dialog box to specify options for type generation, the focus returns immediately to the current open file when the dialog box closes.

Visual Studio와 통합된 테스트 프레임워크와 함께 관례에서 생성 기능을 사용할 수 있습니다.The Generate From Usage feature can be used with test frameworks that integrate with Visual Studio. 이 항목에서는 Microsoft 단위 테스트 프레임워크를 보여 줍니다.In this topic, the Microsoft Unit Testing Framework is demonstrated.

참고

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다.The Visual Studio edition that you have and the settings that you use determine these elements. 자세한 내용은 IDE 개인 설정을 참조하세요.For more information, see Personalizing the IDE.

Windows 클래스 라이브러리 프로젝트 및 테스트 프로젝트 만들기Create a Windows Class Library project and a Test project

  1. Visual C#Visual C# 또는 Visual BasicVisual Basic에서 새 Windows 클래스 라이브러리 프로젝트를 만듭니다.In Visual C#Visual C# or Visual BasicVisual Basic, create a new Windows Class Library project. 사용하는 언어에 따라 이름을 GFUDemo_VB 또는 GFUDemo_CS로 지정합니다.Name it GFUDemo_VB or GFUDemo_CS, depending on which language you are using.

  2. 솔루션 탐색기에서 맨 위의 솔루션 아이콘을 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 새 프로젝트를 선택합니다.In Solution Explorer, right-click the solution icon at the top, choose Add, and then choose New Project. 새 프로젝트 대화 상자의 왼쪽 창에서 테스트를 선택합니다.In the left pane of the New Project dialog box, choose Test.

  3. 가운데 창에서 단위 테스트 프로젝트를 선택하고 기본 이름인 UnitTestProject1을 적용합니다.In the middle pane, choose Unit Test Project and accept the default name of UnitTestProject1. 다음 그림에서는 Visual C#Visual C#에 표시되는 경우의 대화 상자를 보여 줍니다.The following illustration shows the dialog box when it appears in Visual C#Visual C#. Visual BasicVisual Basic에서도 대화 상자가 유사하게 표시됩니다.In Visual BasicVisual Basic, the dialog box looks similar.

    새 테스트 프로젝트 대화 상자New Test Project dialog

  4. 확인 을 선택하여 새 프로젝트 대화 상자를 닫습니다.Choose OK to close the New Project dialog box.

클래스 라이브러리 프로젝트에 참조 추가Add a reference to the Class Library project

  1. 솔루션 탐색기의 단위 테스트 프로젝트 아래에서 참조 항목을 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다.In Solution Explorer, under your unit test project, right-click the References entry and choose Add Reference.

  2. 참조 관리자 대화 상자에서 프로젝트를 선택한 다음 클래스 라이브러리 프로젝트를 선택합니다.In the Reference Manager dialog box, select Projects and then select the class library project.

  3. 확인을 선택하여 참조 관리자 대화 상자를 닫습니다.Choose OK to close the Reference Manager dialog box.

  4. 솔루션을 저장합니다.Save your solution. 이제 테스트 작성을 시작할 준비가 되었습니다.You are now ready to begin writing tests.

단위 테스트에서 새 클래스 생성Generate a new class from a unit test

  1. 테스트 프로젝트에는 UnitTest1이라는 파일이 포함되어 있습니다.The test project contains a file that is named UnitTest1. 솔루션 탐색기에서 이 파일을 두 번 클릭하여 코드 편집기에서 엽니다.Double-click this file in Solution Explorer to open it in the code editor. 테스트 클래스 및 테스트 메서드가 생성되었습니다.A test class and test method have been generated.

  2. UnitTest1 클래스에 대한 선언을 찾아서 이름을 AutomobileTest로 바꿉니다.Locate the declaration for class UnitTest1 and rename it to AutomobileTest.

    참고

    이제 IntelliSense는 IntelliSense 문 완성을 위해 완성 모드제안 모드라는 두 가지 대안을 제공합니다.IntelliSense now provides two alternatives for IntelliSense statement completion: completion mode and suggestion mode. 클래스 및 멤버를 정의하기 전에 사용하는 경우에는 제안 모드를 사용합니다.Use suggestion mode for situations in which classes and members are used before they are defined. IntelliSense 창이 열려 있으면 Ctrl+Alt+스페이스를 눌러 완성 모드와 제안 모드 간을 전환할 수 있습니다.When an IntelliSense window is open, you can press Ctrl+Alt+Space to toggle between completion mode and suggestion mode. 자세한 내용은 IntelliSense 사용을 참조하세요.See Use IntelliSense for more information. 제안 모드는 다음 단계에서 Automobile 을 입력할 때 도움이 됩니다.Suggestion mode will help when you are typing Automobile in the next step.

  3. TestMethod1() 메서드를 찾아서 이름을 DefaultAutomobileIsInitializedCorrectly()로 바꿉니다.Locate the TestMethod1() method and rename it to DefaultAutomobileIsInitializedCorrectly(). 이 메서드 내에서 다음 스크린샷과 같이 Automobile이라는 클래스의 새 인스턴스를 만듭니다.Inside this method, create a new instance of a class named Automobile, as shown in the following screenshots. 컴파일 타임 오류를 나타내는 물결선이 표시되고 왼쪽 여백(C#에만 해당) 또는 가리키는 경우 오류 표시선 바로 아래에 빠른 작업 전구가 나타납니다.A wavy underline appears, which indicates a compile-time error, and a Quick Actions light bulb appears in the left margin (C# only), or directly below the squiggle if you hover over it.

    Visual Basic의 빠른 작업Quick Actions in Visual Basic

    C#의 빠른 작업Quick Actions in C#

  4. 빠른 작업 전구를 선택하거나 클릭합니다.Choose or click the Quick Actions light bulb. Automobile 유형이 정의되지 않았다는 오류 메시지가 표시됩니다.You'll see an error message that states that the type Automobile is not defined. 또한 몇 가지 솔루션이 표시됩니다.You are also presented with some solutions.

  5. 새 형식 생성을 클릭하여 형식 생성 대화 상자를 엽니다.Click Generate new type to open the Generate Type dialog box. 이 대화 상자는 다른 프로젝트에서 형식 생성을 포함하는 옵션을 제공합니다.This dialog box provides options that include generating the type in a different project.

  6. 프로젝트 목록에서 GFUDemo_VB 또는 GFUDemo_CS를 클릭하여 테스트 프로젝트 대신 클래스 라이브러리 프로젝트에 파일을 추가하도록 Visual Studio에 지시합니다.In the Project list, click GFUDemo_VB or GFUDemo_CS to instruct Visual Studio to add the file to the class library project instead of the test project. 선택되어 있지 않은 경우 새 파일 만들기를 선택하고 이름을 Automobile.cs 또는 Automobile.vb로 지정합니다.If it's not already selected, choose Create new file and name it Automobile.cs or Automobile.vb.

    새 형식 생성 대화 상자Generate New Type dialog box

  7. 확인 을 클릭하여 대화 상자를 닫고 새 파일을 만듭니다.Click OK to close the dialog box and create the new file.

  8. 솔루션 탐색기GFUDemo_VB 또는 GFUDemo_CS 프로젝트 노드 아래에서 새 Automobile.vb 또는 Automobile.cs 파일이 있는지 확인합니다.In Solution Explorer, look under the GFUDemo_VB or GFUDemo_CS project node to verify that the new Automobile.vb or Automobile.cs file is there. 코드 편집기에서 포커스는 여전히 AutomobileTest.DefaultAutomobileIsInitializedCorrectly에 있으며 이를 통해 최소한의 사용 중단으로 테스트를 계속해서 작성할 수 있습니다.In the code editor, the focus is still in AutomobileTest.DefaultAutomobileIsInitializedCorrectly, which enables you to continue to write your test with a minimum of interruption.

속성 스텁 생성Generate a property stub

제품 사양에 따라 Automobile 클래스에 ModelTopSpeed라는 두 개의 공용 속성이 있다고 가정합니다.Assume that the product specification states that the Automobile class has two public properties named Model and TopSpeed. 이러한 속성은 기본값 "Not specified"-1 을 사용하여 기본 생성자에서 초기화되어야 합니다.These properties must be initialized with default values of "Not specified" and -1 by the default constructor. 다음 단위 테스트는 기본 생성자가 속성을 올바른 기본값으로 설정하는지 확인합니다.The following unit test will verify that the default constructor sets the properties to their correct default values.

  1. 다음 코드 줄을 DefaultAutomobileIsInitializedCorrectly 테스트 메서드에 추가합니다.Add the following line of code to the DefaultAutomobileIsInitializedCorrectly test method.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
    Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
    
  2. 코드에서 두 개의 정의되지 않은 Automobile속성을 참조하기 때문에 ModelTopSpeed 아래에 물결선이 나타납니다.Because the code references two undefined properties on Automobile, a wavy underline appears under Model and TopSpeed. Model 위로 마우스를 가져가고 빠른 작업 전구를 선택한 다음, 속성 'Automobile.Model' 생성을 선택합니다.Hover over Model and choose the Quick Actions light bulb, then choose Generate property 'Automobile.Model'.

  3. 동일한 방식으로 TopSpeed 속성에 대한 속성 스텁을 생성합니다.Generate a property stub for the TopSpeed property in the same way.

    Automobile 클래스에서 새 속성의 형식이 컨텍스트에서 올바르게 유추됩니다.In the Automobile class, the types of the new properties are correctly inferred from the context.

새로운 생성자에 대한 스텁 생성Generate a stub for a new constructor

이제 생성자 스텁을 생성하여 ModelTopSpeed 속성을 초기화하는 테스트 메서드를 만들겠습니다.Now we'll create a test method that will generate a constructor stub to initialize the Model and TopSpeed properties. 나중에 더 많은 코드를 추가하여 테스트를 완료합니다.Later, you'll add more code to complete the test.

  1. 다음과 같은 추가 테스트 메서드를 AutomobileTest 클래스에 추가합니다.Add the following additional test method to your AutomobileTest class.

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
    <TestMethod()> Public Sub AutomobileWithModelNameCanStart()
        Dim model As String = "Contoso"
        Dim topSpeed As Integer = 199
        Dim myAuto As New Automobile(model, topSpeed)
    End Sub
    
  2. 빨간색 물결선 아래의 빠른 작업 전구를 클릭한 다음, 'Automobile'에서 생성자 생성을 클릭합니다.Click the Quick Actions light bulb under the red squiggle, and then click Generate constructor in 'Automobile'.

    Automobile 클래스 파일에서 새로운 생성자가 생성자 호출에 사용되는 지역 변수의 이름을 검사하고 Automobile 클래스에서 동일한 이름을 가진 속성을 찾고 ModelTopSpeed 속성에 인수 값을 저장하는 코드를 생성자 본문에 제공한 것을 확인합니다.In the Automobile class file, notice that the new constructor has examined the names of the local variables that are used in the constructor call, found properties that have the same names in the Automobile class, and supplied code in the constructor body to store the argument values in the Model and TopSpeed properties.

  3. 새로운 생성자를 생성하면 DefaultAutomobileIsInitializedCorrectly의 기본 생성자 호출 아래에 물결선이 표시됩니다.After you generate the new constructor, a wavy underline appears under the call to the default constructor in DefaultAutomobileIsInitializedCorrectly. Automobile 클래스에 인수를 사용하지 않는 생성자가 없다는 오류 메시지가 나타납니다.The error message states that the Automobile class has no constructor that takes zero arguments. 매개 변수가 없는 명시적 기본 생성자를 생성하려면 빠른 작업 전구를 클릭한 다음, 'Automobile'에서 생성자 생성을 클릭합니다.To generate an explicit default constructor that does not have parameters, click the Quick Actions light bulb, and then click Generate constructor in 'Automobile'.

메서드에 대한 스텁 생성Generate a stub for a method

ModelTopSpeed 속성이 기본값이 아닌 다른 값으로 설정된 경우 사양에 따라 새 AutomobileIsRunning 상태로 전환할 수 있다고 가정합니다.Assume that the specification states that a new Automobile can be put into a IsRunning state if its Model and TopSpeed properties are set to something other than the default values.

  1. AutomobileWithModelNameCanStart 메서드에 다음 줄을 추가합니다.Add the following lines to the AutomobileWithModelNameCanStart method.

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
  2. myAuto.Start 메서드 호출에 대한 빠른 작업 전구를 클릭한 다음, 메서드 'Automobile.Start' 생성을 클릭합니다.Click the Quick Actions light bulb for the myAuto.Start method call and then click Generate method 'Automobile.Start'.

  3. IsRunning 속성에 대한 빠른 작업 전구를 클릭한 다음, 속성 'Automobile.IsRunning' 생성을 클릭합니다.Click the Quick Actions light bulb for the IsRunning property and then click Generate property 'Automobile.IsRunning'.

    Automobile 클래스는 이제 Start()라는 메서드 및 IsRunning이라는 속성을 포함합니다.The Automobile class now contains a method named Start() and a property named IsRunning.

테스트 실행Run the tests

  1. 테스트 메뉴에서 실행 > 모든 테스트를 선택합니다.On the Test menu, choose Run > All Tests.

    실행 > 모든 테스트 명령은 현재 솔루션에 대해 작성된 모든 테스트 프레임워크의 모든 테스트를 실행합니다.The Run > All Tests command runs all the tests in any test frameworks that are written for the current solution. 이 경우 두 가지 테스트가 있으며 둘 다 예상대로 실패합니다.In this case, there are two tests, and they both fail, as expected. DefaultAutomobileIsInitializedCorrectly 테스트는 Assert.IsTrue 조건이 False를 반환하기 때문에 실패합니다.The DefaultAutomobileIsInitializedCorrectly test fails because the Assert.IsTrue condition returns False. AutomobileWithModelNameCanStart 테스트는 Start 클래스의 Automobile 메서드에서 예외가 발생하기 때문에 실패합니다.The AutomobileWithModelNameCanStart test fails because the Start method in the Automobile class throws an exception.

    다음 그림에는 테스트 결과 창이 나와 있습니다.The Test Results window is shown in the following illustration.

    실패한 테스트 결과Test results that failed

  2. 테스트 결과 창에서 각 테스트 결과 행을 두 번 클릭하면 각 테스트 위치로 이동할 수 있습니다.In the Test Results window, double-click on each test result row to go to the location of each test.

소스 코드 구현Implement the source code

  1. Model, TopSpeedIsRunning 속성이 모두 올바른 기본값인 "Not specified", -1False(또는 C#의 경우 false)로 초기화되도록 기본 생성자에 다음 코드를 추가합니다.Add the following code to the default constructor so that the Model, TopSpeed and IsRunning properties are all initialized to their correct default values of "Not specified", -1, and False (or false for C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = false;
    }
    
    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = False
    End Sub
    
  2. Start 메서드를 호출할 경우 IsRunning 또는 Model 속성이 기본값 이외의 값으로 설정된 경우에만 TopSpeed 플래그를 true로 설정해야 합니다.When the Start method is called, it should set the IsRunning flag to true only if the Model or TopSpeed properties are set to something other than their default value. 메서드 본문에서 NotImplementedException 을 제거하고 다음 코드를 추가합니다.Remove the NotImplementedException from the method body and add the following code.

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

테스트 다시 실행Run the tests again

  • 테스트 메뉴에서 실행을 가리킨 다음 모든 테스트를 클릭합니다.On the Test menu, point to Run, and then click All Tests.

    이번에는 테스트가 성공합니다.This time the tests pass. 다음 그림에는 테스트 결과 창이 나와 있습니다.The Test Results window is shown in the following illustration.

    통과한 테스트 결과Test results that passed

참고 항목See also