ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

「UI オートメーションによる自動 UI テスト」を Win32 に適用する

Windows アプリの UI テストを自動化しよう@@IT


少し古い記事だけど、ちょうど UI の自動テストをやりたかったので試してみた。
NUnit も初めてだったのでこの記事もあわせて読んだ。


で、このツールは 「Windowsアプリケーション(Win32)」 でも使えるとのことで試してみた。

やること

Visual Studio 2008 にて MFC アプリケーションを作成し、その UI テストを UI オートメーションと NUnit を使って行う。

今回使ったもの

手順

テストされる側(アプリケーション)の作成

1. Visual Studio 2008 で 「MFC アプリケーション」 プロジェクトを作成し、上記記事と同じ画面を作成する
2. エディットボックスとリストボックスのコントロールクラスを作成する
3. ボタンのイベントハンドラを作成し、下記コードを入れる

void CUITestDlg::OnBnClickedButton1()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	UpdateData( TRUE );

	m_list.InsertString( -1, m_strInput );
	m_strInput = "";

	UpdateData( FALSE );
}

4. 実行する
5. UISpy を起動(スタート|プログラム|Microsoft Windows SDK|Tools|UISpy)し、実行したアプリケーションを探す
6. アプリケーションが見つかったらツリーを展開し、ボタン、エディット、リストの「AutomationId」を探す


テストする側(テストクラス)の作成

1. Visual Studio で 「Visual C# | Windows | クラスライブラリ」を選択しプロジェクトを作成する
2. 上記記事のテストコードをコピペする
3. UIAutomationClient、UIAutomationTypes、nunit.framework を参照として追加する
4. SetUp() および AddTwoItem() を MFC アプリ用に修正(@@@の部分)

        [SetUp]
        public void SetUp()
        {
            // テスト対象のアプリケーションを起動
//            Process app = Process.Start( @"..\..\..\UIAutomation\bin\Debug\UIAutomation.exe" );
            Process app = Process.Start( @"..\..\..\Debug\UITest.exe" );  // @@@ テストするアプリケーションのパス
            Thread.Sleep( 1000 );

            // フォームへの参照を
            // AutomationElementオブジェクトとして取得
            aeForm = AutomationElement.FromHandle( app.MainWindowHandle );
        }

        [Test]
        public void AddTwoItem()
        {
            // 操作対象のコントロールへの参照を
            // AutomationElementオブジェクトとして取得
            //AutomationElement txtInput = FindElement( aeForm, "txtInput" );
            //AutomationElement btnAdd = FindElement( aeForm, "btnAdd" );
            //AutomationElement lstResults = FindElement( aeForm, "lstResults" );
            AutomationElement btnAdd = FindElement( aeForm, "1000" );         // @@@ UISpy で探した AutomationId
            AutomationElement txtInput = FindElement( aeForm, "1001" );       // @@@ UISpy で探した AutomationId
            AutomationElement lstResults = FindElement( aeForm, "1002" );     // @@@ UISpy で探した AutomationId

            // 操作対象のコントロール・パターンを取得
            ValuePattern vpTxtInput = (ValuePattern)txtInput.GetCurrentPattern( ValuePattern.Pattern );
            InvokePattern ipBtnAdd = (InvokePattern)btnAdd.GetCurrentPattern( InvokePattern.Pattern );
            ・
            ・
            ・
        }

5. テストクラスをコンパイル
6. NUnit を起動し、「File|Open Project」から 5 で作った DLL を選択する
7. 「Run」 ボタンを押すと実行される

まとめ

MFC の場合の手順が少し煩雑だけど、環境さえ作ればこれは便利!!といのが率直なところ。
UI のテストは何かとめんどくさいので、こういうツールで少しでも楽になればウレシイなぁ。。。