다음을 통해 공유


컨트롤의 코딩된 UI 테스트 사용

코딩 된 UI 테스트 프레임 워크에 대 한 지원을 구현 하는 경우 컨트롤을 보다 쉽게 테스트할 수 있습니다.지원 수준을 증가 점진적으로 추가할 수 있습니다.레코드와 재생 및 속성 유효성 검사를 지원 하 여 작업을 시작할 수 있습니다.에 코딩 된 UI 테스트 빌더 컨트롤의 사용자 지정 속성을 인식할 수 있도록 빌드 및 생성 된 코드에서 해당 속성에 액세스 하는 사용자 지정 클래스를 제공 합니다.코딩 된 UI 테스트 작성기 캡처 작업에 기록 되는 작업의 의도에 가까운 방식으로 도움이 됩니다.

항목 내용

  1. 내게 필요한 옵션을 구현 하 여 레코드 및 재생 및 속성 유효성 검사 지원

  2. 속성 공급자를 구현 하 여 사용자 지정 속성의 유효성 검사를 지원 합니다.

  3. 사용자 지정 속성에 액세스 하려면 클래스를 구현 하 여 코드 생성을 지원 합니다.

  4. 작업 필터를 구현 하 여 의도 인식 작업을 지원 합니다.

CUIT_Full

내게 필요한 옵션을 구현 하 여 레코드 및 재생 및 속성 유효성 검사 지원

코딩 된 UI 테스트 빌더에서 기록 하는 동안 발생 한 후 해당 세션을 재생 하는 코드를 생성 하는 컨트롤에 대 한 정보를 캡처합니다.컨트롤이 내게 필요한 옵션을 지원 하지 않으면 코딩 된 UI 테스트 빌더 화면 좌표를 사용 하 여 작업을 (마우스 클릭 등)를 캡처합니다.테스트 재생 될 때 생성 되는 코드는 동일한 화면 좌표에서 마우스 클릭 발급 합니다.테스트를 재생할 때 컨트롤 화면의 다른 위치에 나타나면 생성 된 코드 컨트롤에서 작업을 수행할 수 없습니다.테스트 후 UI 레이아웃 변경 또는 다른 환경에서 다른 화면 구성에서 재생 될 경우이 오류가 발생할 수 있습니다.

CUIT_RecordNoSupport

내게 필요한 옵션을 구현 하는 경우 그러나 코딩 된 UI 테스트 빌더는 테스트를 기록 하 고 코드를 생성 하는 경우 컨트롤에 대 한 정보를 캡처하기 위해 사용 합니다.그런 다음 테스트를 실행할 때 사용자 인터페이스에서 어딘가에 되지 않더라도 생성 된 코드를 이러한 이벤트를 컨트롤에 대해 재생 되지.테스트 작성자도도 없게 만들 컨트롤의 기본 속성을 사용 하 여 어설션 합니다.

CUIT_Record

Hh552522.collapse_all(ko-kr,VS.110).gif녹음 및 재생을 지원 하기 위해 속성 유효성 검사, 탐색을 위한 Windows 폼 및 컨트롤

다음 절차에 따라 컨트롤에 대해 액세스 가능성을 구현 하 고에 자세히 설명 AccessibleObject.

CUIT_Accessible

  1. 파생 되는 클래스를 구현 합니다. Control.ControlAccessibleObject, 재정의 AccessibilityObject 클래스의 개체를 반환 하는 속성입니다.

    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 속성 및 메서드.

  3. 자식 컨트롤에 대 한 다른 액세스 가능성 개체를 구현 하 고 자식 컨트롤의 재정의 AccessibilityObject 해당 액세스 가능성 개체를 반환 하는 속성입니다.

  4. 재정의 된 Bounds, Name, Parent, Role, State, Navigate, 및 Select 속성 및 메서드는 자식 컨트롤의 내게 필요한 옵션 지원 개체에 대 한.

[!참고]

이 항목에서는 내게 필요한 옵션 샘플에서 시작 AccessibleObject 이 절차 및 나머지 절차에서에 다음 빌드.작업 버전의 내게 필요한 옵션 샘플을 만들려면 콘솔 응용 프로그램을 만들고 Program.cs에서 코드를 샘플 코드로 바꿉니다.내게 필요한 옵션, System.Drawing 및 System.windows.forms에 대 한 참조를 추가 해야 합니다.변경 하면의 Interop 형식 포함 빌드 경고를 제거 하려면 내게 필요한 옵션을 False입니다.응용 프로그램을 실행할 때 콘솔 창이 나타나지 않도록 콘솔 응용 프로그램을 Windows 응용 프로그램에서 프로젝트의 출력 형식으로 변경할 수 있습니다.

속성 공급자를 구현 하 여 사용자 지정 속성의 유효성 검사를 지원 합니다.

레코드 및 재생 및 속성 유효성 검사에 대 한 기본 지원을 구현한 후 컨트롤의 사용자 지정 속성 사용할 수 있는 코딩 된 UI 테스트를 구현 하 여 수 있는 UITestPropertyProvider 플러그 인입니다.예를 들어, 다음은 허용 상태 차트 컨트롤의 CurveLegend 자식 컨트롤의 속성에 액세스 하는 코딩 된 UI 테스트 속성 공급자를 만듭니다.

CUIT_CustomProps

Hh552522.collapse_all(ko-kr,VS.110).gif사용자 지정 속성의 유효성 검사를 지원.

CUIT_Props

  1. 재정의 곡선 범례 액세스할 수 있는 개체의 Description 설명 문자열의 다양 한 속성 값을 전달 하려면 속성 구분 주 (설명과 서로에서) 여러 속성을 구현 하는 경우 세미콜론 (;).

    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 테스트 확장 패키지 만들기 및 내게 필요한 옵션, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common, 및 Microsoft.visualstudio.testtools.extension에 대 한 참조를 추가 합니다.변경 된 Interop 형식 포함 의 내게 필요한 옵션을 false로.

  3. 추가 속성 공급자 클래스에서 파생 된 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>.

    // Define a map of property descriptors for CurveLegend
    private static Dictionary<string, UITestPropertyDescriptor> curveLegendPropertiesMap = null;
    private static Dictionary<string, UITestPropertyDescriptor> CurveLegendPropertiesMap
    {
        get
        {
            if (curveLegendPropertiesMap == null)
            {
                UITestPropertyAttributes read =
                    UITestPropertyAttributes.Readable |
                    UITestPropertyAttributes.DoNotGenerateProperties;
                curveLegendPropertiesMap =
                    new Dictionary<string, UITestPropertyDescriptor>
                        (StringComparer.OrdinalIgnoreCase);
                curveLegendPropertiesMap.Add("State",
                    new UITestPropertyDescriptor(typeof(string), read));
            }
            return curveLegendPropertiesMap;
        }
    }
    
    // return the property descriptor
    public override UITestPropertyDescriptor GetPropertyDescriptor(UITestControl uiTestControl, string propertyName)
    {
        return CurveLegendPropertiesMap[propertyName];
    }
    
    // return the property names
    public override ICollection<string> GetPropertyNames(UITestControl uiTestControl)
    {
        if (uiTestControl.ControlType.NameEquals("Chart") || uiTestControl.ControlType.NameEquals("Text"))
        {
            // the keys of the property map are the collection of property names
            return CurveLegendPropertiesMap.Keys;
        }
    
        // this is not my control
        throw new NotSupportedException();
    }
    
    // Get the property value by parsing the accessible description
    public override object GetPropertyValue(UITestControl uiTestControl, string propertyName)
    {
        if (String.Equals(propertyName, "State", StringComparison.OrdinalIgnoreCase))
        {
            object[] native = uiTestControl.NativeElement as object[];
            IAccessible acc = native[0] as IAccessible;
    
            string[] descriptionTokens = acc.accDescription.Split(new char[] { ';' });
            return descriptionTokens[1];
        }
    
        // this is not my control
        throw new NotSupportedException();
    }
    
  5. 재정의 UITestPropertyProvider.GetControlSupportLevel 나타내는 어셈블리 컨트롤 및 해당 자식에 대 한 컨트롤 관련 지원을 제공 합니다.

    public override int GetControlSupportLevel(UITestControl uiTestControl)
    {
        // For MSAA, check the control type
        if (string.Equals(uiTestControl.TechnologyName, "MSAA",
            StringComparison.OrdinalIgnoreCase) &&
            (uiTestControl.ControlType == "Chart"||uiTestControl.ControlType == "Text"))
        {
            return (int)ControlSupport.ControlSpecificSupport;
        }
    
        // This is not my control, so return NoSupport
        return (int)ControlSupport.NoSupport;
    }
    
  6. 나머지 추상 메서드 재정의 Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.

    public override string[] GetPredefinedSearchProperties(Type specializedClass)
    {
        throw new NotImplementedException();
    }
    
    public override Type GetSpecializedClass(UITestControl uiTestControl)
    {
        throw new NotImplementedException();
    }
    
    public override Type GetPropertyNamesClassType(UITestControl uiTestControl)
    {
        throw new NotImplementedException();
    }
    
    public override void SetPropertyValue(UITestControl uiTestControl, string propertyName, object value)
    {
        throw new NotImplementedException();
    }
    
    public override string GetPropertyForAction(UITestControl uiTestControl, UITestAction action)
    {
        throw new NotImplementedException();
    }
    
    public override string[] GetPropertyForControlState(UITestControl uiTestControl, ControlStates uiState, out bool[] stateValues)
    {
        throw new NotImplementedException();
    }
    
    
    
    
    
  7. 파생 되는 확장 패키지 클래스 추가 UITestExtensionPackage.

    using System;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Microsoft.VisualStudio.TestTools.UITest.Common;
    
    namespace ChartControlExtensionPackage
    {
        internal class ChartControlExtensionPackage : UITestExtensionPackage
        {
        }
    }
    
  8. 정의 UITestExtensionPackage 어셈블리에 대 한 특성입니다.

    [assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage(
                    "ChartControlExtensionPackage",
                    typeof(ChartControlExtensionPackage.ChartControlExtensionPackage))]
    namespace ChartControlExtensionPackage
    {
       …
    
  9. 확장 패키지 클래스에 재정의 UITestExtensionPackage.GetService 속성 공급자는 요청 될 때 속성 공급자 클래스를 반환 합니다.

    internal class ChartControlExtensionPackage : UITestExtensionPackage
    {
        public override object GetService(Type serviceType)
        {
            if (serviceType == typeof(UITestPropertyProvider))
            {
                if (propertyProvider == null)
                {
                    propertyProvider = new ChartControlPropertyProvider();
                }
                return propertyProvider;
            }
            return null;
        }
    
        private UITestPropertyProvider propertyProvider = null;
    }
    
  10. 나머지 추상 메서드 및 속성을 재정의 합니다. UITestExtensionPackage.

    public override void Dispose() { }
    
    public override string PackageDescription
    {
        get { return "Supports coded UI testing of ChartControl"; }
    }
    
    public override string PackageName
    {
        get { return "ChartControl Test Extension"; }
    }
    
    public override string PackageVendor
    {
        get { return "Microsoft (sample)"; }
    }
    
    public override Version PackageVersion
    {
        get { return new Version(1, 0); }
    }
    
    public override Version VSVersion
    {
        get { return new Version(10, 0); }
    }
    
  11. 이진 파일을 빌드 하 고 복사 하려면 %programfiles%\Common\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!참고]

이 확장 패키지 "Text" 형식의 모든 컨트롤에 적용 됩니다.동일한 형식의 여러 컨트롤을 테스트 하는 경우 개별적으로 테스트 하 고 테스트를 기록할 때 확장 패키지 배포를 관리 해야 합니다.

사용자 지정 속성에 액세스 하려면 클래스를 구현 하 여 코드 생성을 지원 합니다.

세션 기록에서 코딩 된 UI 테스트 빌더에서 코드를 생성할 때 사용 하는 UITestControl 컨트롤에 액세스 하는 클래스입니다.

UITestControl uIAText = this.UIItemWindow.UIChartControlWindow.UIAText;
Assert.AreEqual(this.AssertMethod3ExpectedValues.UIATextState, uIAText.GetProperty("State").ToString());

컨트롤의 사용자 지정 속성에 액세스를 제공 하는 속성 공급자를 구현한 경우 생성 된 코드를 간단 하 게 이러한 속성에 액세스 하는 데 사용 되는 특수 클래스를 추가할 수 있습니다.

ControlLegend uIAText = this.UIItemWindow.UIChartControlWindow.UIAText;
Assert.AreEqual(this.AssertMethod3ExpectedValues.UIATextState, uIAText.State);

Hh552522.collapse_all(ko-kr,VS.110).gif컨트롤에 액세스 하는 특수 클래스를 추가 하려면

CUIT_CodeGen

  1. 파생 되는 클래스를 구현 WinControl 컨트롤의 형식 생성자에서 검색 속성 컬렉션에 추가 합니다.

    public class CurveLegend:WinControl 
    {
       public CurveLegend(UITestControl c) : base(c) 
       {
          // The curve legend control is a “text” type of control
          SearchProperties.Add(
             UITestControl.PropertyNames.ControlType, "Text");
       }
    }
    
  2. 컨트롤의 사용자 지정 속성은 클래스의 속성으로 구현 합니다.

    public virtual string State
    {
        get
        {
            return (string)GetProperty("State");
        }
    }
    
  3. 재정의 속성 공급자의 UITestPropertyProvider.GetSpecializedClass 메서드가 범례 자식 컨트롤 곡선에 대 한 새로운 클래스의 형식을 반환 합니다.

    public override Type GetSpecializedClass(UITestControl uiTestControl) 
    { 
       if (uiTestControl.ControlType.NameEquals("Text")) 
       { 
          // This is text type of control. For my control,
          // that means it’s a curve legend control.
          return typeof(CurveLegend); 
       } 
    
       // this is not a curve legend control
       return null;
    }
    
  4. 재정의 속성 공급자의 GetPropertyNamesClassType PropertyNames 메서드는 새 클래스의 형식을 반환 합니다.

    public override Type GetPropertyNamesClassType(UITestControl uiTestControl)
    {
        if (uiTestControl.ControlType.NameEquals("Text"))
        {
          // This is text type of control. For my control,
          // that means it’s a curve legend control.
            return typeof(CurveLegend.PropertyNames);
        }
    
        // this is not a curve legend control
        return null;
    }
    

작업 필터를 구현 하 여 의도 인식 작업을 지원 합니다.

Visual Studio 테스트를 기록할 때 각 마우스 및 키보드 이벤트를 캡처합니다.그러나 경우에 따라 동작의 의도 일련의 마우스 및 키보드 이벤트에 손실 될 수 있습니다.예를 들어, 자동 완성 기능을 지 원하는 컨트롤 테스트를 다른 환경에서 재생 될 때 마우스 및 키보드 이벤트 같은 집합이 다른 값에서 발생할 수 있습니다.단일 작업으로는 일련의 키보드 및 마우스 이벤트를 대체 작업 필터 플러그 인을 추가할 수 있습니다.이런이 식으로 일련의 결과 값으로 값을 설정 하는 단일 작업을 선택에서 하 여 마우스 및 키보드 이벤트를 바꿀 수 있습니다.이러는 코딩 된 UI 테스트 환경이 다른 자동 완성 기능에서 차이를 보호 합니다.

Hh552522.collapse_all(ko-kr,VS.110).gif의도 인식 하는 작업을 지원 하기

CUIT_Actions

  1. 파생 되는 작업 필터 클래스를 구현 합니다. UITestActionFilter, 재정의 속성 ApplyTimeout, Category, Enabled, FilterType, GroupName.

    internal class MyActionFilter : UITestActionFilter
    {
       // If the user actions we are aggregating exceeds the time allowed,
       // this filter is not applied. (The timeout is configured when the
       // test is run.)
       public override bool ApplyTimeout
       {
          get { return true; }
       }
    
       // Gets the category of this filter. Categories of filters
       // are applied in priority order.
       public override UITestActionFilterCategory Category
       {
          get { return UITestActionFilterCategory.PostSimpleToCompoundActionConversion; }
       }
    
       public override bool Enabled
       {
          get { return true; }
       }
    
    
       public override UITestActionFilterType FilterType
       {
          // This action filter operates on a single action
          get { return UITestActionFilterType.Unary; }
       }
    
       // Gets the name of the group to which this filter belongs.
       // A group can be enabled/disabled using configuration file.
       public override string Group
       {
          get { return "ChartControlActionFilters"; }
       }
    
       // Gets the name of this filter.
       public override string Name
       {
          get { return "Convert Double-Click to Single-Click"; }
       }
    
  2. ProcessRule를 재정의합니다.이 예제에서는 여기 realpces를 두 번 클릭 작업을 단일 작업을 클릭 합니다.

    public override bool ProcessRule(IUITestActionStack actionStack)
    {
        if (actionStack.Count > 0)
        {
            MouseAction lastAction = actionStack.Peek() as MouseAction;
            if (lastAction != null)
            {
                if (lastAction.UIElement.ControlTypeName.Equals(
                     ControlType.Text.ToString(),
                     StringComparison.OrdinalIgnoreCase))
                {
                    if(lastAction.ActionType == MouseActionType.DoubleClick)
                    {
                        // Convert to single click
                        lastAction.ActionType = MouseActionType.Click;
                    }
                }
            }
        }
        // Do not stop aggregation
        return false;
    }
    
  3. 작업 필터에 추가 된 GetService 메서드가 확장 패키지의.

    public override object GetService(Type serviceType) 
    { 
       if (serviceType == typeof(UITestPropertyProvider)) 
       { 
          if (propertyProvider == null)
          {
             propertyProvider = new PropertyProvider();
          } 
          return propertyProvider;
       } 
       else if (serviceType == typeof(UITestActionFilter)) 
       { 
          if (actionFilter == null)
          {
             actionFilter = new RadGridViewActionFilter();
          }
          return actionFilter; 
       } 
       return null;
    }
    
  4. 이진 파일을 빌드 하 고 복사 하려면 %programfiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!참고]

작업 필터는 속성 공급자 또는 내게 필요한 옵션 구현에 종속 되지 않습니다.

작업 필터를 속성 공급자 디버깅

로드 되 고 코딩 된 UI 테스트 작성기 응용 프로그램에서 별도 프로세스에서 실행 되는 확장 패키지의 속성 공급자 및 작업 필터 구현.

속성 공급자 또는 작업 필터를 디버깅 하려면

  1. .Pdb 파일과.dll 파일을 확장 패키지 복사본의 디버그 버전 빌드 %programfiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

  2. (하지에서 디버거) 응용 프로그램을 실행 합니다.

  3. 코딩 된 UI 테스트 빌더를 실행 합니다.

    codedUITestBuilder.exe /standalone

  4. CodedUITestBuilder 프로세스에 디버거를 연결 합니다.

  5. 코드에 중단점을 설정 합니다.

  6. 코딩 된 UI 테스트 빌더를 만드는 어설션을 실습 속성 공급자 및 작업 필터를 실행 하는 작업을 기록할 수 있습니다.

외부 리소스

Hh552522.collapse_all(ko-kr,VS.110).gif지침

Visual Studio 2012 2 장 연속 배달 테스트: 단위 테스트: 내부 테스트

참고 항목

참조

AccessibleObject

개념

코딩된 사용자 인터페이스 테스트를 사용하여 코드 확인