컨트롤의 코딩된 UI 테스트 사용
코딩 된 UI 테스트 프레임 워크에 대 한 지원을 구현 하는 경우 컨트롤을 보다 쉽게 테스트할 수 있습니다.지원 수준을 증가 점진적으로 추가할 수 있습니다.레코드와 재생 및 속성 유효성 검사를 지원 하 여 작업을 시작할 수 있습니다.에 코딩 된 UI 테스트 빌더 컨트롤의 사용자 지정 속성을 인식할 수 있도록 빌드 및 생성 된 코드에서 해당 속성에 액세스 하는 사용자 지정 클래스를 제공 합니다.코딩 된 UI 테스트 작성기 캡처 작업에 기록 되는 작업의 의도에 가까운 방식으로 도움이 됩니다.
항목 내용
내게 필요한 옵션을 구현 하 여 레코드 및 재생 및 속성 유효성 검사 지원
코딩 된 UI 테스트 빌더에서 기록 하는 동안 발생 한 후 해당 세션을 재생 하는 코드를 생성 하는 컨트롤에 대 한 정보를 캡처합니다.컨트롤이 내게 필요한 옵션을 지원 하지 않으면 코딩 된 UI 테스트 빌더 화면 좌표를 사용 하 여 작업을 (마우스 클릭 등)를 캡처합니다.테스트 재생 될 때 생성 되는 코드는 동일한 화면 좌표에서 마우스 클릭 발급 합니다.테스트를 재생할 때 컨트롤 화면의 다른 위치에 나타나면 생성 된 코드 컨트롤에서 작업을 수행할 수 없습니다.테스트 후 UI 레이아웃 변경 또는 다른 환경에서 다른 화면 구성에서 재생 될 경우이 오류가 발생할 수 있습니다.
내게 필요한 옵션을 구현 하는 경우 그러나 코딩 된 UI 테스트 빌더는 테스트를 기록 하 고 코드를 생성 하는 경우 컨트롤에 대 한 정보를 캡처하기 위해 사용 합니다.그런 다음 테스트를 실행할 때 사용자 인터페이스에서 어딘가에 되지 않더라도 생성 된 코드를 이러한 이벤트를 컨트롤에 대해 재생 되지.테스트 작성자도도 없게 만들 컨트롤의 기본 속성을 사용 하 여 어설션 합니다.
녹음 및 재생을 지원 하기 위해 속성 유효성 검사, 탐색을 위한 Windows 폼 및 컨트롤
다음 절차에 따라 컨트롤에 대해 액세스 가능성을 구현 하 고에 자세히 설명 AccessibleObject.
파생 되는 클래스를 구현 합니다. 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; } } }
액세스 가능 개체의 재정의 Role, State, GetChild 및 GetChildCount 속성 및 메서드.
자식 컨트롤에 대 한 다른 액세스 가능성 개체를 구현 하 고 자식 컨트롤의 재정의 AccessibilityObject 해당 액세스 가능성 개체를 반환 하는 속성입니다.
재정의 된 Bounds, Name, Parent, Role, State, Navigate, 및 Select 속성 및 메서드는 자식 컨트롤의 내게 필요한 옵션 지원 개체에 대 한.
[!참고]
이 항목에서는 내게 필요한 옵션 샘플에서 시작 AccessibleObject 이 절차 및 나머지 절차에서에 다음 빌드.작업 버전의 내게 필요한 옵션 샘플을 만들려면 콘솔 응용 프로그램을 만들고 Program.cs에서 코드를 샘플 코드로 바꿉니다.내게 필요한 옵션, System.Drawing 및 System.windows.forms에 대 한 참조를 추가 해야 합니다.변경 하면의 Interop 형식 포함 빌드 경고를 제거 하려면 내게 필요한 옵션을 False입니다.응용 프로그램을 실행할 때 콘솔 창이 나타나지 않도록 콘솔 응용 프로그램을 Windows 응용 프로그램에서 프로젝트의 출력 형식으로 변경할 수 있습니다.
속성 공급자를 구현 하 여 사용자 지정 속성의 유효성 검사를 지원 합니다.
레코드 및 재생 및 속성 유효성 검사에 대 한 기본 지원을 구현한 후 컨트롤의 사용자 지정 속성 사용할 수 있는 코딩 된 UI 테스트를 구현 하 여 수 있는 UITestPropertyProvider 플러그 인입니다.예를 들어, 다음은 허용 상태 차트 컨트롤의 CurveLegend 자식 컨트롤의 속성에 액세스 하는 코딩 된 UI 테스트 속성 공급자를 만듭니다.
사용자 지정 속성의 유효성 검사를 지원.
재정의 곡선 범례 액세스할 수 있는 개체의 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(); } } }
클래스 라이브러리 프로젝트를 만들어 컨트롤에 대해 UI 테스트 확장 패키지 만들기 및 내게 필요한 옵션, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common, 및 Microsoft.visualstudio.testtools.extension에 대 한 참조를 추가 합니다.변경 된 Interop 형식 포함 의 내게 필요한 옵션을 false로.
추가 속성 공급자 클래스에서 파생 된 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 { } }
속성 공급자 속성 이름과 속성 설명자를 배치 하 여 구현 된 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(); }
재정의 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; }
나머지 추상 메서드 재정의 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(); }
파생 되는 확장 패키지 클래스 추가 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 { } }
정의 UITestExtensionPackage 어셈블리에 대 한 특성입니다.
[assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage( "ChartControlExtensionPackage", typeof(ChartControlExtensionPackage.ChartControlExtensionPackage))] namespace ChartControlExtensionPackage { …
확장 패키지 클래스에 재정의 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; }
나머지 추상 메서드 및 속성을 재정의 합니다. 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); } }
이진 파일을 빌드 하 고 복사 하려면 %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);
컨트롤에 액세스 하는 특수 클래스를 추가 하려면
파생 되는 클래스를 구현 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"); } }
컨트롤의 사용자 지정 속성은 클래스의 속성으로 구현 합니다.
public virtual string State { get { return (string)GetProperty("State"); } }
재정의 속성 공급자의 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; }
재정의 속성 공급자의 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 테스트 환경이 다른 자동 완성 기능에서 차이를 보호 합니다.
의도 인식 하는 작업을 지원 하기
파생 되는 작업 필터 클래스를 구현 합니다. UITestActionFilter, 재정의 속성 ApplyTimeout, Category, Enabled, FilterType, Group 및 Name.
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"; } }
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; }
작업 필터에 추가 된 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; }
이진 파일을 빌드 하 고 복사 하려면 %programfiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.
[!참고]
작업 필터는 속성 공급자 또는 내게 필요한 옵션 구현에 종속 되지 않습니다.
작업 필터를 속성 공급자 디버깅
로드 되 고 코딩 된 UI 테스트 작성기 응용 프로그램에서 별도 프로세스에서 실행 되는 확장 패키지의 속성 공급자 및 작업 필터 구현.
속성 공급자 또는 작업 필터를 디버깅 하려면
.Pdb 파일과.dll 파일을 확장 패키지 복사본의 디버그 버전 빌드 %programfiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.
(하지에서 디버거) 응용 프로그램을 실행 합니다.
코딩 된 UI 테스트 빌더를 실행 합니다.
codedUITestBuilder.exe /standalone
CodedUITestBuilder 프로세스에 디버거를 연결 합니다.
코드에 중단점을 설정 합니다.
코딩 된 UI 테스트 빌더를 만드는 어설션을 실습 속성 공급자 및 작업 필터를 실행 하는 작업을 기록할 수 있습니다.
외부 리소스
지침
Visual Studio 2012 2 장 연속 배달 테스트: 단위 테스트: 내부 테스트