トップ回答者
UTによるカバレッジの取得について

質問
-
はじめまして。清水と申します。
現在、Visual Studio 2008 Team System Dev Edtにおいて、開発を行っております。
質問がありますが、上記エディションでは、コードカバレッジを取得できると思いますが、
あくまで取得できるのは、UTコードを実行し、そのUTコードにおいて、通ったパスのカバレッジを測定するというつくりになっています。
そうではなく、たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?
Visual Studioのみの機能に限定しませんが、何か情報ありましたらご教授ください。
よろしくお願いいたします。
回答
-
Koki3 さんからの引用 あくまで取得できるのは、UTコードを実行し、そのUTコードにおいて、通ったパスのカバレッジを測定するというつくりになっています。
そこは、 変えられないんじゃないかと思います。
以下、 VSTS2008 (Dev.) 限定 ってことで。
# 2005 では試していません。Koki3 さんからの引用 たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?
試してみましたか?
その exe のプロジェクトに対するテストプロジェクトを作って、 exe を起動させて待機するだけのテストコードを作ってみたら、 どうなるでしょう?
Code Snippet[TestMethod()]
public void UITest()
{// 対象アプリを起動する
Process proc = Process.Start("foo.exe");// 終了するまで待機 … この間に、 手動で UI をテストする。
while (!proc.HasExited) {
Thread.Sleep(1000);
}
proc.Close();
proc.Dispose();
}サンプルのソリューションをダウンロードできるようにしておきましたので、 よろしければ。
→ http://bluewatersoft.cocolog-nifty.com/blog/2008/05/vs2008_2d79.html -
Koki3 さんからの引用 たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?
「いろいろイベントを起こさせて」 というところを、 手動でテストしたいのだと解釈したのですが。 自動で ( テストコードで ) やりたい場合は、 テストメソッドの中から UI Automation を使えば可能です。
UI Automation を直接使うのは面倒ですが、 John Robbins 氏が MSDN マガジン 2007年 3月号に発表してくれたラッパークラスを使うと楽になります。 → http://msdn.microsoft.com/ja-jp/magazine/cc163465.aspx詳細は MSDN マガジンの記事を読んでいただきたいのですが、 テストコードのイメージはこんなふうになります。
Code Snippetusing System.Windows.Automation;
using System.Windows.Automation.Peers;using Bugslayer.TestTools.GuiAutomation;
// ...略...
[TestMethod()]
public void UITest()
{// 対象アプリを起動する
Process proc = Process.Start("foo.exe");Thread.Sleep(5000); // 本当はループを回して、win1 が取れるようになるのを一定時間まで待つべき。
// AutomationElement クラスをラップした UIWindow を得る ( Bugslayer.TestTools.GuiAutomation )
UIWindow win1 = new UIWindow(proc);// 結果を見たいテキストボックス
UIEditControl resultText = ((UIEditControl)win1.FindChild("textBoxResult"));// 実行ボタンクリック
((UIButton)win1.FindChild("buttonDoExec")).Click();Thread.Sleep(1000); // 本当はループを回して、resultText.Value が変わるのを一定時間まで待つべき。
// 結果を判定
Assert.AreEqual("bar", resultText.Value);// ウィンドウを閉じる
win1.SendKeys("%{F4}");proc.Close();
proc.Dispose();
}
すべての返信
-
Koki3 さんからの引用 あくまで取得できるのは、UTコードを実行し、そのUTコードにおいて、通ったパスのカバレッジを測定するというつくりになっています。
そこは、 変えられないんじゃないかと思います。
以下、 VSTS2008 (Dev.) 限定 ってことで。
# 2005 では試していません。Koki3 さんからの引用 たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?
試してみましたか?
その exe のプロジェクトに対するテストプロジェクトを作って、 exe を起動させて待機するだけのテストコードを作ってみたら、 どうなるでしょう?
Code Snippet[TestMethod()]
public void UITest()
{// 対象アプリを起動する
Process proc = Process.Start("foo.exe");// 終了するまで待機 … この間に、 手動で UI をテストする。
while (!proc.HasExited) {
Thread.Sleep(1000);
}
proc.Close();
proc.Dispose();
}サンプルのソリューションをダウンロードできるようにしておきましたので、 よろしければ。
→ http://bluewatersoft.cocolog-nifty.com/blog/2008/05/vs2008_2d79.html -
Koki3 さんからの引用 たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?
「いろいろイベントを起こさせて」 というところを、 手動でテストしたいのだと解釈したのですが。 自動で ( テストコードで ) やりたい場合は、 テストメソッドの中から UI Automation を使えば可能です。
UI Automation を直接使うのは面倒ですが、 John Robbins 氏が MSDN マガジン 2007年 3月号に発表してくれたラッパークラスを使うと楽になります。 → http://msdn.microsoft.com/ja-jp/magazine/cc163465.aspx詳細は MSDN マガジンの記事を読んでいただきたいのですが、 テストコードのイメージはこんなふうになります。
Code Snippetusing System.Windows.Automation;
using System.Windows.Automation.Peers;using Bugslayer.TestTools.GuiAutomation;
// ...略...
[TestMethod()]
public void UITest()
{// 対象アプリを起動する
Process proc = Process.Start("foo.exe");Thread.Sleep(5000); // 本当はループを回して、win1 が取れるようになるのを一定時間まで待つべき。
// AutomationElement クラスをラップした UIWindow を得る ( Bugslayer.TestTools.GuiAutomation )
UIWindow win1 = new UIWindow(proc);// 結果を見たいテキストボックス
UIEditControl resultText = ((UIEditControl)win1.FindChild("textBoxResult"));// 実行ボタンクリック
((UIButton)win1.FindChild("buttonDoExec")).Click();Thread.Sleep(1000); // 本当はループを回して、resultText.Value が変わるのを一定時間まで待つべき。
// 結果を判定
Assert.AreEqual("bar", resultText.Value);// ウィンドウを閉じる
win1.SendKeys("%{F4}");proc.Close();
proc.Dispose();
} -
こんにちは!フォーラムオペレータの栗原麻里です
Koki3 さん、フォーラムのご利用ありがとうございます。
Koki3 さんの「やりたいこと」にばっちり届いたみたいですね。
ぜひ、回答していただいた方法を試してみてくださいね!biac さん、わかりやすく丁寧な回答ありがとうございました。
また、サンプルのご提供ありがとうございます。フォーラムをご利用の皆様の中にも、同じような方法ができないか探している人がいるかもしれません。
ぜひ他の皆様にも参考にしていただけたらと思ったので、チェックをつけさせていただきました。皆様が有用な情報を見つけやすくなるので、今回のように参考になった場合は
ぜひチェックをつけてくださいね!
それでは、またフォーラムを活用してたくさん情報交換してください!