2014年9月18日木曜日

UI オートメーションで自動テスト その1

UI オートメーションを使うと、UI の自動テストができるらしい。

それってスゴイ便利じゃん!
ってことで調べてみました。

UI オートメーションには、4つのコンポーネントがあるみたいです。

  • UIAutomationClient
  • UIAutomationClientsideProviders
  • UIAutomationProvider
  • UIAutomationTypes

今回は、UIAutomationClient と UIAutomationTypes を参照設定に追加して始めます。

テストターゲットプロジェクトの作成

初めにテスト対象の WPF アプリケーション プロジェクトを作成します。
MainWindow に Name プロパティを追加しておきます。

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Name="mainWindow">
    <Grid>
    </Grid>
</Window>

テストプロジェクトの作成

次にテストを行う クラス ライブラリ プロジェクトを作成します。
ここでは、MainWindow のテストクラスを作成します。
起動するアプリケーションの名前、MainWindow の名前、今回のキモとなるテスト対象の UI オートメーション要素を定義しておきます。
単体テストは、NUnit を使用します。

[TestFixture]
public class MainWindowTest
{
    private string applicationName;

    private string windowName;

    private AutomationElement targetElement;

    [TestFixtureSetUp]
    public void TestFixtureSetUp()
    {
        this.applicationName = Properties.Resources.ApplicationName;
        this.windowName = Properties.Resources.WindowName;
    }
}

UI オートメーション要素の取得

テスト対象のアプリケーションを操作するために、対象の UI オートメーション要素を取得します。
今回は UI オートメーション要素を Name プロパティの値から取得するヘルパー関数を作成しました。

public static class AutomationHelper
{
    public static AutomationElement FindElementById(AutomationElement element, string automationId, TreeScope treeScope = TreeScope.Element | TreeScope.Descendants)
    {
        var target = element.FindFirst(
            treeScope,
            new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
        return target;
    }
}

テストの準備

最後にアプリケーションを起動して、UI オートメーション要素を取得する処理を実装します。
今回は、アプリケーションを起動して、10秒経っても UI オートメーション要素が取得できないときはテスト失敗にしました。
ここはテスト対象のアプリケーションによって修正すればいいと思います。

[TestFixture]
public class MainWindowTest
{
    [SetUp]
    public void SetUp()
    {
        var p = Process.Start(this.applicationName);

        AutomationElement desktopElement = null;
        desktopElement = AutomationElement.RootElement;

        if (desktopElement == null)
        {
            Assert.Fail();
        }

        this.targetElement = null;
        var waitCount = 0;

        do
        {
            this.targetElement = AutomationHelper.FindElementById(desktopElement, this.windowName, TreeScope.Children);
            waitCount++;
            Thread.Sleep(200);
        }
        while (this.targetElement == null && waitCount < 50);

        if (this.targetElement == null)
        {
            Assert.Fail();
        }
    }
}

まだテストの準備段階ですが、今回はここまで。


頑張りすぎず脱力系でいこうと思います。
以上。

0 件のコメント:

コメントを投稿