コントロールのコード化された UI テストの有効化Enable Coded UI Testing of Your Controls

コード化された UI テスト フレームワークのサポートを実装している場合は、コントロールをより簡単にテストできます。Your control can be more easily tested if you implement support for the coded UI testing framework. サポート レベルを徐々に上げることができます。You can add increasing levels of support incrementally. 記録と再生およびプロパティの検証のサポートから始めることができます。You can start by supporting record and playback and property validation. この最初のサポートに加えて、コード化された UI テスト ビルダーがコントロールのカスタム プロパティを認識し、生成されたコードからそれらのプロパティにアクセスするためのカスタム クラスを提供できるようにすることができます。You can build on that to allow the coded UI test builder to recognize your control's custom properties, and 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.

このトピックの内容In this topic:

  1. アクセシビリティの実装によって記録と再生およびプロパティの検証をサポートするSupport Record and Playback and Property Validation by implementing Accessibility

  2. プロパティ プロバイダーの実装によってカスタム プロパティの検証をサポートするSupport Custom Property Validation by implementing a Property Provider

  3. カスタム プロパティにアクセスするためのクラスを実装してコード生成をサポートするSupport Code Generation by implementing a Class to Access Custom Properties

  4. 操作フィルターの実装によって目的に応じた操作をサポートするSupport Intent-Aware Actions by implementing an Action Filter

    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 will capture actions (like mouse clicks) using screen coordinates. テストの再生時、生成されたコードは同じ画面座標にそれらのマウス クリックを表示します。When the test is played back, the generated code will issue those mouse clicks 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 that action on your control. テストが異なる画面構成や異なる環境で再生される場合、または UI レイアウトが変更された後に再生される場合、これは失敗する可能性があります。This can result in failures if the test is played back on different screen configurations, in different environments, or after there have been changes to the UI layout.

CUIT_RecordNoSupportCUIT_RecordNoSupport

しかし、ユーザー補助を実装している場合は、コード化された UI テスト ビルダーがテストを記録してコードを生成するときに、コントロールに関する情報をキャプチャするためにそれを使用します。If you implement accessibility, though, the coded UI test builder will use that to capture information about your control when it records a test and generates code. その後、テストを実行すると、コントロールがユーザー インターフェイスの別の場所にあっても、生成されたコードがコントロールに対してそれらのイベントを再生します。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 will also be able create asserts using the basic properties of your control.

CUIT_RecordCUIT_Record

Windows フォーム コントロールの記録と再生、プロパティの検証、およびナビゲーションをサポートするには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. アクセス可能なオブジェクトの RoleStateGetChild、および GetChildCount プロパティおよびメソッドをオーバーライドします。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 that accessibility object.

  4. 子コントロールのアクセシビリティ オブジェクトの BoundsNameParentRoleStateNavigate、および Select プロパティおよびメソッドをオーバーライドします。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 in this procedure, and then builds on that 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. アクセシビリティ、System.Drawing、および System.Windows.Forms への参照を追加する必要があります。You'll need to add references to Accessibility, System.Drawing, and System.Windows.Forms. ビルド警告を除去するために、アクセシビリティの [相互運用機能型の埋め込み]False に変更してください。You should change the Embed Interop Types for Accessibility to False to eliminate a build warning. アプリケーションの実行時にコンソール ウィンドウが表示されないように、プロジェクトの出力の種類を [コンソール アプリケーション] から [Windows アプリケーション] に変更できます。You can change the project's output type to 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

記録と再生およびプロパティの検証の基本的なサポートを実装したら、<xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider> プラグインを実装して、コントロールのカスタム プロパティをコード化された UI テストから使用できるようにすることができます。Once you've implemented 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 <xref:Microsoft.VisualStudio.TestTools.UITesting.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, separated from the main description (and each other if you are implementing multiple properties) by 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. クラス ライブラリ プロジェクトを作成し、ユーザー補助、Microsoft.VisualStudio.TestTools.UITesting、Microsoft.VisualStudio.TestTools.UITest.Common、および Microsoft.VisualStudio.TestTools.Extension への参照を追加して、コントロール用の UI テスト拡張パッケージを作成します。Create a UI test extension package for your control by creating a class library project and add references to Accessibility, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common, and Microsoft.VisualStudio.TestTools.Extension. アクセシビリティの [相互運用機能型の埋め込み]False に変更します。Change the Embed Interop Types for Accessibility to False.

  3. <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider> から派生したプロパティのプロバイダー クラスを追加します。Add a property provider class that's derived from <xref:Microsoft.VisualStudio.TestTools.UITesting.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>.

33

  1. アセンブリがコントロールとその子コントロールにコントロール固有のサポートを提供することを示すように、<xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetControlSupportLevel%2A?displayProperty=fullName> をオーバーライドします。Override <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetControlSupportLevel%2A?displayProperty=fullName> to indicate that your assembly provides control-specific support for your control and its children.

44

  1. <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider?displayProperty=fullName> の残りの抽象メソッドをオーバーライドします。Override the remaining abstract methods of <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider?displayProperty=fullName>.

55

  1. <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage> から派生した拡張パッケージ クラスを追加します。Add an extension package class that's derived from <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage>.

66

  1. アセンブリの UITestExtensionPackage 属性を定義します。Define the UITestExtensionPackage attribute for the assembly.

77

  1. 拡張パッケージ クラスで、プロパティ プロバイダーが要求されたときにプロパティ プロバイダー クラスを返すように <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage.GetService%2A?displayProperty=fullName> をオーバーライドします。In the extension package class, override <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage.GetService%2A?displayProperty=fullName> to return the property provider class when a property provider is requested.

88

  1. <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage> の残りの抽象メソッドと抽象プロパティをオーバーライドします。Override the remaining abstract methods and properties of <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage>.

99

  1. バイナリをビルドし、%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 will be applied to any control that is of type "Text". 同じ種類の複数のコントロールをテストしている場合は、別々にテストし、テストを記録するときにどの拡張パッケージが配置されているかを管理する必要があります。If you're testing multiple controls of the same type, you'll need to test them separately and manage which extension packages are deployed when you record the tests.

カスタム プロパティにアクセスするためのクラスを実装してコード生成をサポートするSupport Code Generation by implementing a Class to Access Custom Properties

コード化された UI テスト ビルダーはセッションの記録からコードを生成するとき、<xref:Microsoft.VisualStudio.TestTools.UITesting.UITestControl> クラスを使用してコントロールにアクセスします。When the coded UI test builder generates code from a session recording, it uses the <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestControl> class to access your controls.

1010
コントロールのカスタム プロパティへのアクセスを提供するためにプロパティ プロバイダーを実装している場合は、生成されるコードが簡略化されるように、これらのプロパティへのアクセスに使用する特別なクラスを追加できます。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 so that the generated code is simplified.

1111

特殊なクラスを追加してコントロールにアクセスするにはTo add a specialized class to access your control

CUIT_CodeGenCUIT_CodeGen

  1. <xref:Microsoft.VisualStudio.TestTools.UITesting.WinControls.WinControl> から派生したクラスを実装し、コンストラクターの検索プロパティのコレクションにコントロールの型を追加します。Implement a class that's derived from <xref:Microsoft.VisualStudio.TestTools.UITesting.WinControls.WinControl> and add the control's type to the search properties collection in the constructor.

1212

  1. クラスのプロパティとして、コントロールのカスタム プロパティを実装します。Implement your control's custom properties as properties of the class.

1313

  1. 曲線の凡例の子コントロールの新しいクラスの型を返すように、プロパティ プロバイダーの <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetSpecializedClass%2A?displayProperty=fullName> メソッドをオーバーライドします。Override your property provider's <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetSpecializedClass%2A?displayProperty=fullName> method to return the type of the new class for the curve legend child controls.

1414

  1. 新しいクラスの PropertyNames メソッドの型を返すように、プロパティ プロバイダーの <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetPropertyNamesClassType%2A> メソッドをオーバーライドします。Override your property provider's <xref:Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.GetPropertyNamesClassType%2A> method to return the type of the new class' PropertyNames method.

1515

操作フィルターの実装によって目的に応じた操作をサポートする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 resulting in the selection of 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. <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter> から派生した操作フィルター クラスを実装して、<xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.ApplyTimeout%2A>、<xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Category%2A>、<xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Enabled%2A>、<xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.FilterType%2A>、<xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Group%2A>、および <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Name%2A> プロパティをオーバーライドします。Implement an action filter class that's derived from <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter>, overriding the properties <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.ApplyTimeout%2A>, <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Category%2A>, <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Enabled%2A>, <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.FilterType%2A>, <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Group%2A> and <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.Name%2A>.

1616

  1. <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.ProcessRule%2A> をオーバーライドします。Override <xref:Microsoft.VisualStudio.TestTools.UITest.Common.UITestActionFilter.ProcessRule%2A>. 次の例では、ダブルクリック操作をシングルクリック操作に置き換えています。The example here realpces a double-click action with a single click action.

1717

  1. 拡張パッケージの <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage.GetService%2A> メソッドに操作フィルターを追加します。Add the action filter to the <xref:Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage.GetService%2A> method of your extension package.

1818

  1. バイナリをビルドし、%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

プロパティ プロバイダーと操作フィルターは、アプリケーションとは別のプロセスで、コード化された UI テスト ビルダーによって読み込まれて実行される拡張パッケージで実装されます。Your property provider and action filter are implemented in an extension package that is loaded and run by the coded UI test builder in a process separate 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.

外部リソースExternal resources

ガイダンスGuidance

Visual Studio 2012 を使用した継続的配信のためのテスト - 第 2 章: 単体テスト: 内部のテストTesting for Continuous Delivery with Visual Studio 2012 - Chapter 2: Unit Testing: Testing the Inside

関連項目See Also

AccessibleObjectAccessibleObject
UI オートメーションを使用してコードをテストするUse UI Automation To Test Your Code