컨트롤의 코딩된 UI 테스트 사용Enable Coded UI testing of your controls

컨트롤을 보다 쉽게 테스트할 수 있으려면 코딩된 UI 테스트 프레임워크에 대한 지원을 구현합니다.Implement support for the coded UI testing framework to make your control more testable. 지원 수준 증가는 점진적으로 추가할 수 있습니다.You can add increasing levels of support incrementally. 기록 및 재생 및 속성 유효성 검사 지원으로 시작합니다.Start by supporting record and playback and property validation. 그런 다음, 그 위에 빌드해 컨트롤의 사용자 지정 속성을 인식하기 위해 코딩된 UI 테스트 빌더를 사용하도록 설정합니다.Then, build on that to enable the coded UI test builder to recognize your control's custom properties. 생성된 코드에서 이러한 속성에 액세스하려면 사용자 지정 클래스를 제공합니다.Provide custom classes to access those properties from generated code. 또한 기록 중인 작업의 의도와 가까운 방식으로 코딩된 UI 테스트 빌더가 작업을 캡처하도록 할 수 있습니다.You can also help the coded UI test builder capture actions in a way that is closer to the intent of the action being recorded.

CUIT_FullCUIT_Full

접근성을 구현하여 기록 및 재생, 속성 유효성 검사를 지원Support record and playback and property validation by implementing accessibility

코딩된 UI 테스트 빌더는 기록 중 발견된 컨트롤에 대한 정보를 캡처하고 해당 세션을 재생하기 위한 코드를 생성합니다.The coded UI test builder captures information about the controls that it encounters during a recording and then generates code to replay that session. 컨트롤이 액세스 가능성을 지원하지 않을 경우, 코딩된 UI 테스트 빌더는 화면 좌표를 사용하여 작업(예: 마우스 클릭)을 캡처합니다.If your control doesn't support accessibility, then the coded UI test builder captures actions (like mouse clicks) using screen coordinates. 테스트를 재생하면 생성된 코드가 동일 화면 좌표에서 동작을 실행합니다.When the test is played back, the generated code issues the actions in the same screen coordinates. 테스트를 재생할 때 컨트롤이 화면의 다른 위치에 표시되면 생성된 코드가 작업을 수행하는 데 실패합니다.If your control appears in a different place on the screen when the test is played back, the generated code will fail to perform the action. 컨트롤에 대한 액세스 가능성을 구현하지 못하면 테스트가 다른 화면 구성 및 다른 환경에서 재생되는 경우 또는 UI 레이아웃이 변경되는 경우 오류 테스트가 표시될 수 있습니다.By not implementing accessibility for your control, you might see test failures if the test is played back on different screen configurations, in different environments, or when the UI layout changes.

CUIT_RecordNoSupportCUIT_RecordNoSupport

액세스 가능성을 구현할 경우, 코딩된 UI 테스트 빌더는 테스트를 기록할 때 이를 사용해서 컨트롤에 대한 정보를 캡처합니다.If you implement accessibility, the coded UI test builder uses that to capture information about your control when it records a test. 그런 다음 테스트를 실행하면 컨트롤이 사용자 인터페이스에서 다른 위치에 있더라도 생성된 코드가 컨트롤에 대해 해당 이벤트를 재생합니다.Then, when you run the test, the generated code will replay those events against your control, even if it's somewhere else in the user interface. 테스트 작성자는 또한 컨트롤의 기본 속성을 사용해서 어설션을 만들 수 있습니다.Test authors can also create asserts using the basic properties of your control.

CUIT_RecordCUIT_Record

Windows Forms 컨트롤의 기록 및 재생, 속성 유효성 검사 및 탐색을 지원하려면To support record and playback, property validation, and navigation for a Windows Forms control

다음 절차의 개요 및 AccessibleObject의 자세한 설명에 따라 컨트롤에 대해 액세스 가능성을 구현합니다.Implement accessibility for your control as outlined in the following procedure, and explained in detail in AccessibleObject.

CUIT_AccessibleCUIT_Accessible

  1. Control.ControlAccessibleObject에서 파생되는 클래스를 구현하고 클래스의 개체를 반환하도록 AccessibilityObject 속성을 재정의합니다.Implement a class that derives from Control.ControlAccessibleObject, and override the AccessibilityObject property to return an object of your class.

    public partial class ChartControl : UserControl
    {
        // Overridden to return the custom AccessibleObject for the control.
        protected override AccessibleObject CreateAccessibilityInstance()
        {
            return new ChartControlAccessibleObject(this);
        }
    
        // Inner class ChartControlAccessibleObject represents accessible information
        // associated with the ChartControl and is used when recording tests.
        public class ChartControlAccessibleObject : ControlAccessibleObject
        {
            ChartControl myControl;
            public ChartControlAccessibleObject(ChartControl ctrl)
                : base(ctrl)
            {
                myControl = ctrl;
            }
        }
    }
    
  2. 액세스 가능한 개체의 Role, State, GetChildGetChildCount 속성과 메서드를 재정의합니다.Override the accessible object's Role, State, GetChild and GetChildCount properties and methods.

  3. 자식 컨트롤에 대해 또 다른 접근성 개체를 구현하고 이 접근성 개체를 반환하도록 자식 컨트롤의 AccessibilityObject 속성을 재정의합니다.Implement another accessibility object for the child control and override the child control's AccessibilityObject property to return the accessibility object.

  4. 자식 컨트롤의 접근성 개체에 대해 Bounds, Name, Parent, Role, State, NavigateSelect 속성과 메서드를 재정의합니다.Override the Bounds, Name, Parent, Role, State, Navigate, and Select properties and methods for the child control's accessibility object.

참고

이 항목에서는 AccessibleObject에 있는 액세스 가능성 샘플로부터 시작한 다음, 남은 절차의 해당 샘플에 빌드합니다.This topic starts with the accessibility sample in AccessibleObject, and then builds on that sample in the remaining procedures. 액세스 가능성 샘플의 작동 가능 버전을 만들려면 콘솔 응용 프로그램을 만들고 Program.cs의 코드를 샘플 코드로 바꿉니다.If you want to create a working version of the accessibility sample, create a console application and then replace the code in Program.cs with the sample code. Accessibility, System.Drawing 및 System.Windows.Forms에 대한 참조를 추가합니다.Add references to Accessibility, System.Drawing, and System.Windows.Forms. 빌드 경고를 제거하려면 Accessibility에 대한 Interop 형식 포함False로 변경합니다.Change the Embed Interop Types for Accessibility to False to eliminate a build warning. 프로젝트의 출력 형식을 콘솔 응용 프로그램에서 Windows 응용 프로그램으로 변경하면 응용 프로그램을 실행할 때 콘솔 창이 표시되지 않습니다.You can change the project's output type from Console Application to Windows Application so that a console window doesn't appear when you run the application.

속성 공급자를 구현하여 사용자 지정 속성의 유효성 검사를 지원Support custom property validation by implementing a property provider

기록 및 재생과 속성 유효성 검사를 위한 기본 지원을 구현한 후 UITestPropertyProvider 플러그 인을 구현해서 코딩된 UI 테스트에서 컨트롤의 사용자 지정 속성을 사용할 수 있도록 지정할 수 있습니다.After you implement basic support for record and playback and property validation, you can make your control's custom properties available to coded UI tests by implementing a UITestPropertyProvider plug-in. 예를 들어 다음 절차에서는 코딩된 UI 테스트가 차트 컨트롤의 CurveLegend 자식 컨트롤의 State 속성에 액세스할 수 있도록 속성 공급자를 만듭니다.For example, the following procedure creates a property provider that allows coded UI tests to access the State property of the chart control's CurveLegend child controls:

CUIT_CustomPropsCUIT_CustomProps

사용자 지정 속성의 유효성 검사를 지원하려면To support custom property validation

CUIT_PropsCUIT_Props

  1. 설명 문자열에서 다양한 속성 값을 전달하려면 곡선 범례 액세스 가능성 개체의 Description 속성을 재정의합니다.Override the curve legend accessible object's Description property to pass rich property values in the description string. 여러 값을 세미콜론(;)으로 구분합니다.Separate multiple values with semicolons (;).

    public class CurveLegendAccessibleObject : AccessibleObject
    {
        // add the state property value to the description
        public override string Description
        {
            get
            {
                // Add ";" and the state value to the end
                // of the curve legend's description
                return "CurveLegend; " + State.ToString();
            }
        }
    }
    
  2. 클래스 라이브러리 프로젝트를 만들어서 컨트롤에 대한 UI 테스트 확장명 패키지를 만듭니다.Create a UI test extension package for your control by creating a class library project. Accessibility, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common 및 Microsoft.VisualStudio.TestTools.Extension에 대한 참조를 추가합니다.Add references to Accessibility, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common, and Microsoft.VisualStudio.TestTools.Extension. Accessibility에 대한 Interop 형식 포함False로 변경합니다.Change the Embed Interop Types for Accessibility to False.

  3. UITestPropertyProvider에서 파생되는 속성 공급자 클래스를 추가합니다.Add a property provider class that's derived from UITestPropertyProvider:

    using System;
    using System.Collections.Generic;
    using Accessibility;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
    using Microsoft.VisualStudio.TestTools.UITest.Common;
    
    namespace ChartControlExtensionPackage
    {
        public class ChartControlPropertyProvider : UITestPropertyProvider
        {
        }
    }
    
  4. Dictionary<TKey,TValue>에 속성 이름 및 속성 설명을 배치하여 속성 공급자를 구현합니다.Implement the property provider by placing property names and property descriptors in a Dictionary<TKey,TValue>.

  5. 어셈블리가 컨트롤 및 해당 자식 항목에 대한 컨트롤 특정 지원을 제공함을 나타내도록 UITestPropertyProvider.GetControlSupportLevel을 재정의합니다.Override UITestPropertyProvider.GetControlSupportLevel to indicate that your assembly provides control-specific support for your control and its children.

  6. Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider의 남아 있는 추상 메서드 재정의Override the remaining abstract methods of Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider

  7. UITestExtensionPackage에서 파생된 확장명 패키지 클래스를 추가합니다.Add an extension package class that's derived from UITestExtensionPackage.

  8. 어셈블리에 대한 UITestExtensionPackage 특성을 정의합니다.Define the UITestExtensionPackage attribute for the assembly.

  9. 확장 패키지 클래스에서 속성 공급자가 요청될 때 속성 공급자 클래스를 반환하도록 UITestExtensionPackage.GetService를 재정의합니다.In the extension package class, override UITestExtensionPackage.GetService to return the property provider class when a property provider is requested.

  10. UITestExtensionPackage의 남은 추상 메서드 및 속성을 재정의합니다.Override the remaining abstract methods and properties of UITestExtensionPackage.

  11. 바이너리를 빌드하고 이를 %ProgramFiles%\Common\Microsoft Shared\VSTT\10.0\UITestExtensionPackages에 복사합니다.Build your binaries and copy them to %ProgramFiles%\Common\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

참고

이 확장명 패키지는 “Text” 형식의 모든 컨트롤에 적용됩니다.This extension package is applied to any control that is of type "Text". 같은 형식의 여러 컨트롤을 테스트할 경우, 개별적으로 테스트하고 테스트를 기록할 때 배포되는 확장명 패키지를 관리할 수 있습니다.If you're testing multiple controls of the same type, test them separately so you can manage which extension packages are deployed when you record the tests.

사용자 지정 속성에 액세스하기 위해 클래스를 구현하여 코드 생성을 지원Support code generation by implementing a class to access custom properties

코딩된 UI 테스트 빌더는 세션 기록에서 코드를 생성할 때 UITestControl 클래스를 사용해서 컨트롤에 액세스합니다.When the coded UI test builder generates code from a session recording, it uses the UITestControl class to access your controls.

컨트롤의 사용자 지정 속성에 대한 액세스를 제공하기 위해 속성 공급자를 구현한 경우 해당 속성에 액세스하는 데 사용되는 특수한 클래스를 추가할 수 있습니다.If you've implemented a property provider to provide access to your control's custom properties, you can add a specialized class that is used to access those properties. 특수한 클래스를 추가하면 생성된 코드가 단순화됩니다.Adding a specialized class simplifies the generated code.

컨트롤에 액세스하는 특수화 클래스를 추가하려면To add a specialized class to access your control

CUIT_CodeGenCUIT_CodeGen

  1. WinControl에서 파생된 클래스를 구현하고 생성자의 검색 속성 컬렉션에 이 컨트롤의 형식을 추가합니다.Implement a class that's derived from WinControl and add the control's type to the search properties collection in the constructor.

  2. 컨트롤의 사용자 지정 속성을 클래스의 속성으로 구현합니다.Implement your control's custom properties as properties of the class.

  3. Curve Legend 자식 컨트롤에 대한 새 클래스의 형식을 반환하도록 속성 공급자의 UITestPropertyProvider.GetSpecializedClass 메서드를 재정의합니다.Override your property provider's UITestPropertyProvider.GetSpecializedClass method to return the type of the new class for the curve legend child controls.

  4. 새로운 클래스의 PropertyNames 메서드의 형식을 반환하도록 속성 공급자의 GetPropertyNamesClassType 메서드를 재정의합니다.Override your property provider's GetPropertyNamesClassType method to return the type of the new class' PropertyNames method.

작업 필터를 구현하여 의도 인식 작업을 지원Support intent-aware actions by implementing an action filter

Visual Studio는 테스트를 기록할 때 각 마우스 및 키보드 이벤트를 캡처합니다.When Visual Studio records a test, it captures each mouse and keyboard event. 하지만 일부 경우에는 너무 많은 마우스 및 키보드 이벤트가 포함됨에 따라 작업의 목적이 손실될 수 있습니다.However, in some cases, the intent of the action can be lost in the series of mouse and keyboard events. 예를 들어 컨트롤에 자동 완성이 지원될 경우 동일한 마우스 및 키보드 이벤트 집합으로도 다른 환경에서는 테스트를 재생할 때 다른 값이 발생할 수 있습니다.For example, if your control supports autocomplete, the same set of mouse and keyboard events may result in a different value when the test is played back in a different environment. 일련의 키보드 및 마우스 이벤트를 단일 작업으로 대체하는 작업 필터 플러그인을 추가할 수 있습니다.You can add an action filter plug-in that replaces the series of keyboard and mouse events with a single action. 이 방식을 사용하면 특정 값을 선택하는 일련의 마우스 및 키보드 이벤트를 해당 값을 설정하는 단일 작업으로 대체할 수 있습니다.This way, you can replace the series of mouse and keyboard events that select a value with a single action that sets the value. 이렇게 하면 각 환경 간에 달라지는 자동 완성 기능으로부터 코딩된 UI 테스트를 보호할 수 있습니다.Doing that protects coded UI tests from the differences in autocomplete from one environment to another.

의도 인식 작업을 지원하려면To support intent-aware actions

CUIT_ActionsCUIT_Actions

  1. ApplyTimeout, Category, Enabled, FilterType, GroupName 속성을 재정의하여 UITestActionFilter에서 파생된 작업 필터 클래스를 구현합니다.Implement an action filter class that's derived from UITestActionFilter, overriding the properties ApplyTimeout, Category, Enabled, FilterType, Group and Name.

  2. ProcessRule을 재정의합니다.Override ProcessRule. 이 예제에서는 두 번 클릭 작업을 단일 클릭 작업으로 바꿉니다.The example here replaces a double-click action with a single click action.

  3. 확장 패키지의 GetService 메서드에 작업 필터를 추가합니다.Add the action filter to the GetService method of your extension package.

  4. 바이너리를 빌드하고 이를 %ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages에 복사합니다.Build your binaries and copy them to %ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

참고

작업 필터는 액세스 가능성 구현 또는 속성 공급자에 종속되지 않습니다.The action filter does not depend on the accessibility implementation or on the property provider.

속성 공급자 또는 작업 필터 디버그Debug your property provider or action filter

속성 공급자 및 작업 필터는 확장 패키지에서 구현됩니다.Your property provider and action filter are implemented in an extension package. 테스트 빌더는 응용 프로그램에서 별도의 프로세스로 확장 패키지를 실행합니다.The test builder runs the extension package in a separate process from your application.

속성 공급자 또는 작업 필터를 디버그하려면To debug your property provider or action filter

  1. 확장명 패키지의 디버그 버전을 빌드하고, .dll 및 .pdb 파일을 %ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages에 복사합니다.Build the debug version of your extension package copy the .dll and .pdb files to %ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

  2. (디버거가 아닌 위치에서) 응용 프로그램을 실행합니다.Run your application (not in the debugger).

  3. 코딩된 UI 테스트 빌더를 실행합니다.Run the coded UI test builder.

    codedUITestBuilder.exe /standalone

  4. 디버거를 codedUITestBuilder 프로세스에 연결합니다.Attach the debugger to the codedUITestBuilder process.

  5. 코드에 중단점을 설정합니다.Set breakpoints in your code.

  6. 코딩된 UI 테스트 빌더에서, 속성 공급자를 실행하기 위한 어설션을 만들고, 작업 필터를 실행하기 위한 작업을 기록합니다.In the coded UI test builder, create asserts to exercise your property provider, and record actions to exercise your action filters.

참고 항목See also