UIオートメーションも、WCFと同じくマイクロソフトがサポートするUI操作手段の1つである。UIオートメーションの詳細に関しては「UIオートメーションによる自動UIテストの実践」などを参照願いたい。
この手法のメリットは、テスト対象プロセスに変更が必要ないということである。そのため、レガシー・コードにも比較的適用しやすい。また、WCFは.NETアプリを対象にしたものであるが、この手法はネイティブ・アプリにも適用可能である。
しかし、可能なことはGUI操作を使ったことに限定される。また、操作によっては実装の難易度も高い。さらに、GUIとビジネス・ロジックが自然と分離されるようなメリットには寄与しない、などのデメリットも挙げられる。
次のコードは、UIオートメーションを使ってManagementSystemクラスを操作するためのAPI(=EmployeeManagementAppクラス)の実装例である(先ほどのWCFの場合と同様にクラス・ライブラリのプロジェクト内に実装する)。
using System;
using EmployeeManagement;
using System.Diagnostics;
using System.IO;
using System.Windows.Automation;
using System.Threading;
namespace EmployeeManagementAPI
{
public class EmployeeManagementApp : IDisposable
{
// 開始。
public static EmployeeManagementApp Start()
{
#if DEBUG
string path = Path.GetFullPath("../../bin/Debug/EmployeeManagement.exe");
#else
string path = Path.GetFullPath("../../bin/Release/EmployeeManagement.exe");
#endif
return new EmployeeManagementApp(Process.Start(path));
}
AutomationElement mainForm;
int processId;
ValuePattern textBoxName;
ValuePattern textBoxAge;
ValuePattern textBoxPosition;
InvokePattern buttonAdd;
InvokePattern buttonFind;
// コンストラクタ。
public EmployeeManagementApp(Process process)
{
while (process.MainWindowHandle == IntPtr.Zero)
{
Thread.Sleep(10);
}
processId = process.Id;
// GUIマッピング。
mainForm = AutomationElement.FromHandle(process.MainWindowHandle);
textBoxName = (ValuePattern)GetPattern("textBoxName", ValuePattern.Pattern);
textBoxAge = (ValuePattern)GetPattern("textBoxAge", ValuePattern.Pattern);
textBoxPosition = (ValuePattern)GetPattern("textBoxPosition", ValuePattern.Pattern);
buttonAdd = (InvokePattern)GetPattern("buttonAdd", InvokePattern.Pattern);
buttonFind = (InvokePattern)GetPattern("buttonFind", InvokePattern.Pattern);
}
// 終了。
public void Dispose()
{
Process.GetProcessById(processId).CloseMainWindow();
}
// 登録。
public bool Add(string name, string age, string post)
{
textBoxName.SetValue(name);
textBoxAge.SetValue(age);
textBoxPosition.SetValue(post);
buttonAdd.Invoke();
return string.IsNullOrEmpty(textBoxName.Current.Value);
}
// 検索。
public EmployeeData Find(string name)
{
// 検索。
textBoxName.SetValue(name);
buttonFind.Invoke();
// データ作成。
if (string.IsNullOrEmpty(textBoxName.Current.Value))
{
return null;
}
return new EmployeeData(textBoxName.Current.Value,
int.Parse(textBoxAge.Current.Value),
textBoxPosition.Current.Value);
}
// パターンの取得。
private object GetPattern(string name, AutomationPattern pattern)
{
AutomationElement textElement = mainForm.FindFirst(
TreeScope.Element | TreeScope.Descendants,
new PropertyCondition(
AutomationElement.AutomationIdProperty,
name));
return textElement.GetCurrentPattern(pattern);
}
}
}
あとは、WCFの場合と全く同じ単体テスト・プロジェクトを使ってテストを実行すると、受け入れテストが実施される。
次にCodeer.Friendlyを使う方法を説明しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.