コントロールのコード化された UI テストの有効化

コード化された UI テスト フレームワークのサポートを実装している場合は、コントロールをより簡単にテストできます。 サポート レベルを徐々に上げることができます。 記録と再生およびプロパティの検証のサポートから始めることができます。 この最初のサポートに加えて、コード化された UI テスト ビルダーがコントロールのカスタム プロパティを認識し、生成されたコードからそれらのプロパティにアクセスするためのカスタム クラスを提供できるようにすることができます。 また、コード化された UI テスト ビルダーが、記録される操作の目的に近い方法で操作をキャプチャできるようにすることもできます。

このトピックの内容

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

  2. プロパティ プロバイダーの実装によってカスタム プロパティの検証をサポートする

  3. カスタム プロパティにアクセスするためのクラスを実装してコード生成をサポートする

  4. 操作フィルターの実装によって目的に応じた操作をサポートする

    CUIT_Full

アクセシビリティの実装によって記録と再生およびプロパティの検証をサポートする

コード化された UI テスト ビルダーは、記録時に出現したコントロールに関する情報をキャプチャし、そのセッションを再生するコードを生成します。 コントロールがユーザー補助をサポートしていない場合、コード化された UI テスト ビルダーは画面座標を使用して操作 (マウス クリックなど) をキャプチャします。 テストの再生時、生成されたコードは同じ画面座標にそれらのマウス クリックを表示します。 テストの再生時にコントロールが画面上の別の場所に表示される場合、生成されたコードはコントロールに対するその操作の実行に失敗します。 テストが異なる画面構成や異なる環境で再生される場合、または UI レイアウトが変更された後に再生される場合、これは失敗する可能性があります。

CUIT_RecordNoSupport

しかし、ユーザー補助を実装している場合は、コード化された UI テスト ビルダーがテストを記録してコードを生成するときに、コントロールに関する情報をキャプチャするためにそれを使用します。 その後、テストを実行すると、コントロールがユーザー インターフェイスの別の場所にあっても、生成されたコードがコントロールに対してそれらのイベントを再生します。 テストの作成者は、コントロールの基本的なプロパティを使用してアサートを作成することもできます。

CUIT_Record

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. アクセス可能なオブジェクトの RoleStateGetChild、および GetChildCount プロパティおよびメソッドをオーバーライドします。

  3. 子コントロールの別のアクセシビリティ オブジェクトを実装し、そのユーザー補助オブジェクト返すように子コントロールの AccessibilityObject プロパティをオーバーライドします。

  4. 子コントロールのアクセシビリティ オブジェクトの BoundsNameParentRoleStateNavigate、および Select プロパティおよびメソッドをオーバーライドします。

注意

このトピックでは、まずこのプロシージャの AccessibleObject でユーザー補助のサンプルを作成し、それを基に残りのプロシージャで他の要素を作成します。 ユーザー補助サンプルの作業バージョンを作成する場合は、コンソール アプリケーションを作成し、Program.cs のコードをサンプル コードで置き換えます。 アクセシビリティ、System.Drawing、および System.Windows.Forms への参照を追加する必要があります。 ビルド警告を除去するために、アクセシビリティの [相互運用機能型の埋め込み]False に変更してください。 アプリケーションの実行時にコンソール ウィンドウが表示されないように、プロジェクトの出力の種類を [コンソール アプリケーション] から [Windows アプリケーション] に変更できます。

プロパティ プロバイダーの実装によってカスタム プロパティの検証をサポートする

記録と再生およびプロパティの検証の基本的なサポートを実装したら、UITestPropertyProvider プラグインを実装して、コントロールのカスタム プロパティをコード化された UI テストから使用できるようにすることができます。 たとえば、次のプロシージャでは、コード化された UI テストがグラフ コントロールの CurveLegend 子コントロールの State プロパティにアクセスできるようにするプロパティ プロバイダーを作成します。

CUIT_CustomProps

カスタム プロパティの検証をサポートするには

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. クラス ライブラリ プロジェクトを作成し、ユーザー補助、Microsoft.VisualStudio.TestTools.UITesting、Microsoft.VisualStudio.TestTools.UITest.Common、および Microsoft.VisualStudio.TestTools.Extension への参照を追加して、コントロール用の UI テスト拡張パッケージを作成します。 アクセシビリティの [相互運用機能型の埋め込み]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> でプロパティ名とプロパティ記述子を設定して、プロパティ プロバイダーを実装します。

3

  1. アセンブリがコントロールとその子コントロールにコントロール固有のサポートを提供することを示すように、UITestPropertyProvider.GetControlSupportLevel をオーバーライドします。

4

  1. Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider の残りの抽象メソッドをオーバーライドします。

5

  1. UITestExtensionPackage から派生した拡張パッケージ クラスを追加します。

6

  1. アセンブリの UITestExtensionPackage 属性を定義します。

7

  1. 拡張パッケージ クラスで、プロパティ プロバイダーが要求されたときにプロパティ プロバイダー クラスを返すように UITestExtensionPackage.GetService をオーバーライドします。

8

  1. UITestExtensionPackage の残りの抽象メソッドと抽象プロパティをオーバーライドします。

9

  1. バイナリをビルドし、%ProgramFiles%\Common\Microsoft Shared\VSTT\10.0\UITestExtensionPackages にコピーします。
注意

この拡張パッケージは、"Text" 型であるすべてのコントロールに適用されます。 同じ種類の複数のコントロールをテストしている場合は、別々にテストし、テストを記録するときにどの拡張パッケージが配置されているかを管理する必要があります。

カスタム プロパティにアクセスするためのクラスを実装してコード生成をサポートする

コード化された UI テスト ビルダーはセッションの記録からコードを生成するとき、UITestControl クラスを使用してコントロールにアクセスします。

10
コントロールのカスタム プロパティへのアクセスを提供するためにプロパティ プロバイダーを実装している場合は、生成されるコードが簡略化されるように、これらのプロパティへのアクセスに使用する特別なクラスを追加できます。

11

特殊なクラスを追加してコントロールにアクセスするには

CUIT_CodeGen

  1. WinControl から派生したクラスを実装し、コンストラクターの検索プロパティのコレクションにコントロールの型を追加します。

12

  1. クラスのプロパティとして、コントロールのカスタム プロパティを実装します。

13

  1. 曲線の凡例の子コントロールの新しいクラスの型を返すように、プロパティ プロバイダーの UITestPropertyProvider.GetSpecializedClass メソッドをオーバーライドします。

14

  1. 新しいクラスの PropertyNames メソッドの型を返すように、プロパティ プロバイダーの GetPropertyNamesClassType メソッドをオーバーライドします。

15

操作フィルターの実装によって目的に応じた操作をサポートする

Visual Studio はテストを記録するとき、各マウス イベントとキーボード イベントをキャプチャします。 ただし、一連のマウス イベントとキーボード イベントで操作の目的が失われる場合があります。 たとえば、コントロールがオートコンプリートをサポートしている場合は、テストを別の環境で再生すると、同じマウス イベントとキーボード イベントのセットで別の値になることがあります。 一連のキーボード イベントとマウス イベントを単一の操作に置き換える操作フィルター プラグインを追加できます。 こうすることで、結果として値を選択することになる一連のマウス イベントとキーボード イベントを、値を設定する単一の操作に置き換えることができます。 これによって、コード化された UI テストは環境の違いによるオートコンプリートの結果の違いから保護されます。

目的に応じた操作をサポートするには

CUIT_Actions

  1. UITestActionFilter から派生した操作フィルター クラスを実装して、ApplyTimeoutCategoryEnabledFilterTypeGroup、および Name プロパティをオーバーライドします。

16

  1. ProcessRule をオーバーライドします。 次の例では、ダブルクリック操作をシングルクリック操作に置き換えています。

17

  1. 拡張パッケージの GetService メソッドに操作フィルターを追加します。

18

  1. バイナリをビルドし、%ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages にコピーします。
注意

操作フィルターは、ユーザー補助の実装またはプロパティ プロバイダーに依存しません。

プロパティ プロバイダーまたは操作フィルターをデバッグする

プロパティ プロバイダーと操作フィルターは、アプリケーションとは別のプロセスで、コード化された UI テスト ビルダーによって読み込まれて実行される拡張パッケージで実装されます。

プロパティ プロバイダーまたは操作フィルターをデバッグするには

  1. 拡張パッケージのデバッグ バージョンをビルドし、.dll ファイルと .pdb ファイルを %ProgramFiles%\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages にコピーします。

  2. アプリケーションを実行します (デバッガーの外部で)。

  3. コード化された UI テスト ビルダーを実行します。

    codedUITestBuilder.exe /standalone

  4. codedUITestBuilder プロセスにデバッガーをアタッチします。

  5. コード内にブレークポイントを設定します。

  6. コード化された UI テスト ビルダーで、プロパティ プロバイダーを実行するためのアサートを作成し、操作フィルターを実行するための操作を記録します。

外部リソース

ガイダンス

Visual Studio 2012 を使用した継続的配信のためのテスト - 第 2 章: 単体テスト: 内部のテスト

関連項目

AccessibleObject
UI オートメーションを使用してコードをテストする