※現在は、サポート終了しています。
Windows Forms や WPF、UWP などのデスクトップアプリの画面 UI 操作を自動化し、E2Eテストのコード作成と実行ができるフレームワークです。
Visual Studio 2010 Ultimate ~ Visual Studio 2019 Enterprise のみ、テストコード作成とテスト実行が可能です。
Visual Studio 2010 から Visual Studio 2019 まで、かつ、エディションが Ultimate / Enterprise 版のみで、CUIT (Coded UI Test) フレームワークを用いた テストコード作成 と E2Eテスト実行 が可能です。

まずは、冪乗(累乗)を計算するだけの簡易的な WinForms アプリを、サクッと開発してみました。

using System;
using System.Numerics;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
/// <summary>
/// フォーム画面 (WinForms .NET Framework 4.7.2)
/// </summary>
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
=> InitializeComponent();
/// <summary>
/// 「=」ボタン押下時のイベントハンドラ
/// </summary>
/// <param name="sender">イベント発生元</param>
/// <param name="e">イベント引数</param>
private void Btn_Calc_Click(object sender, EventArgs e)
{
// 底
var baseNum = (int)this.Num_Base.Value;
// 冪指数
var exponentNum = (int)this.Num_Exponent.Value;
// 冪乗(塁乗)を計算
var answerNum = CalcPower(baseNum, exponentNum);
// 答え(冪)を桁区切りで表示
this.Num_Power.Text = answerNum.ToString("N0");
}
/// <summary>
/// 冪乗(塁乗)を計算する
/// </summary>
/// <param name="baseNum">底</param>
/// <param name="exponentNum">冪指数</param>
/// <returns>冪</returns>
private BigInteger CalcPower(int baseNum, int exponentNum)
{
var answerNum = new BigInteger(baseNum);
if (exponentNum > 0)
for (var i = 1; i < exponentNum; i++)
answerNum *= baseNum;
else
answerNum = 1;
return answerNum;
}
}
}
「コード化された UI テストプロジェクト」テンプレートから、CUIT プロジェクトを作成します。


プロジェクトを作成した後、すぐに CUIT の作成方法が問われます。
ここでは、「操作の記録、UIマップの編集、またはアサーションの追加」を選びます。

テストビルダーの「記録の開始」ボタンを押下すると、アプリ画面のUI操作が記録開始されます。

ここでは、各コントロールをクリックしていってみます。

テストビルダーの「記録の一時停止」ボタンを押下します。
記録された操作を一覧で見ることができます(Delキーで操作を削除することもできます)。

テストビルダーの「コードの生成」ボタンを押下します。
今回、画面UIを操作した記録をメソッドとしてコードが自動生成されます。
メソッド名と、C#DocのSummaryコメントを入力し、「追加と生成」ボタンを押下します。

すると、UIMapクラス内に、先ほど記録した画面UI操作が、コードとして自動生成されます。

続いて、画面UI操作した結果が、期待結果どおり、正しいかどうかを アサート(検証) するテストコードを自動生成していきます。
テストメソッド内で、先ほどの画面UI自動操作コードを呼び出している箇所の下で右クリックして、コンテキストメニューから「コード化されたUIテストのコードの生成」→「コード化されたUIテストビルダーの使用」を選びます。

テストビルダーの、左から3番目のボタンを押下し、「アサーションの追加」ウィンドウを開き、検証対象のUI部品を選び(青色の枠が非常されます)、検証対象のプロパティを選択した状態で「アサーションの追加」ボタンを押下します。

期待結果を入力します。

テストビルダーの「コードの生成」ボタンを押下します。
今回、追加したアサート(検証)をメソッドとしてコードが自動生成されます。
メソッド名と、C#DocのSummaryコメントを入力し、「追加と生成」ボタンを押下します。


すると、UIMapクラス内に、先ほど追加したアサーションが、コードとして自動生成されます。

では、テストエクスプローラから、テストを実行します。

アプリの画面UIがリアルタイムに自動操作され、期待結果どおりかどうかのE2Eテストが自動で行われます。

期待結果通りのテスト結果が得られなかったパターンも見てみます。
たとえば、(正しくは n ^ 0 = 1 ですが) n ^ 0 = 0 と誤った答えを出すPGコードへと(わざと)変更してみます。

この状態で、先ほどのテストを自動実行してみると、次のような結果となります。
期待結果どおりとならなかった場合、テスト結果の詳細を確認することができ、またそのときの画面スクリーンショットも自動で採取されます。

データドリブン(データ駆動)型の 画面UIテスト も、作成・実行することができます。
まずは CSV ファイルで、テストの入力データと、期待結果を用意します。

BaseNum,ExponentNum,AnswerNum
0,0,"1"
1,0,"1"
1,1,"1"
2,2,"4"
10,2,"100"
2,9,"512"
5,5,"3,125"
10,4,"10,000"
8,8,"16,777,216"
99,9,"913,517,247,483,640,899"
999,9,"991,035,916,125,874,083,964,008,999"
9999,9,"999,100,359,916,012,598,740,083,996,400,089,999"
テストクラスのテストメソッド内にて、テスト入力データを基に、各種コントロールへセットし、期待結果どおりかをアサートするコードへと手修正していきます。

DataSource 属性 と、 DeploymentItem 属性 を付与します。
// 入力するデータの取り込み手段
[DataSource(
// ADO.NET や ODBC などのプロバイダを指定
// ※ CSV の場合 ・・・ "Microsoft.VisualStudio.TestTools.DataSource.CSV"
// ※ Excel の場合 ・・・ "System.Data.Odbc"
// ※ XML の場合 ・・・ "Microsoft.VisualStudio.TestTools.DataSource.XML"
// ※ SQL Server の場合 ・・・ "System.Data.SqlClient"
providerInvariantName: "Microsoft.VisualStudio.TestTools.DataSource.CSV",
// 接続文字列
connectionString: "|DataDirectory|\\TestData.csv",
// テーブル名
tableName: "TestData#csv",
// データアクセス方法
dataAccessMethod: DataAccessMethod.Sequential)]
// 入力ファイルの相対パス・ファイル名
[DeploymentItem("TestData.csv")]
先の UIMap クラスで生成された自動コード内の各コントロール名を参考に、テスト入力データをセットしていきます。
// 「底」の NumericUpDown コントロール の Text プロパティ へと、テスト入力データの "BaseNum" 列 の 値 を代入
this.UIMap.UIWinFormsNETFrameworkWindow.UINumericUpDownSpinner.UINumericUpDownEdit1.Text
= TestContext.DataRow["BaseNum"].ToString();
Assert メソッド を、テストデータの 期待結果 と評価するように、手修正します。
// ======== テストメソッド側 (呼び出し側) ========
// テスト入力データの "AnswerNum" 列 の 値 で Assert するように、その値を渡して呼び出す
this.UIMap.AssertMethod2(TestContext.DataRow["AnswerNum"].ToString());
// ======== UIMap側 (呼び出され側) ========
// 渡された 値 (期待結果) と、画面UI部品の値とが一緒かどうかを評価する
public void AssertMethod2(string expectedValue)
{
Assert.AreEqual(expectedValue, uINum_PowerEdit1.Text);
}
では、テストエクスプローラから、テストを実行します。
※ 今回は、12 パターン の テストデータ を用意してあります。
順番にデータが自動入力され、それぞれ期待結果とアサーションされていきます。

また、各テストパターンごとに、スクリーンショット画像も 証跡 として自動採取されます。

{
pages {
search (query: "TechMemo/VisualStudio") {
results {
id
path
title
}
}
}
}