none
UTによるカバレッジの取得について RRS feed

  • 質問

  •  

    はじめまして。清水と申します。

    現在、Visual Studio 2008 Team System Dev Edtにおいて、開発を行っております。

     

    質問がありますが、上記エディションでは、コードカバレッジを取得できると思いますが、

    あくまで取得できるのは、UTコードを実行し、そのUTコードにおいて、通ったパスのカバレッジを測定するというつくりになっています。

    そうではなく、たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?

     

    Visual Studioのみの機能に限定しませんが、何か情報ありましたらご教授ください。

    よろしくお願いいたします。

     

     

    2008年5月9日 4:11

回答

  •  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

    2008年5月12日 3:57
  •  Koki3 さんからの引用

    たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?

    「いろいろイベントを起こさせて」 というところを、 手動でテストしたいのだと解釈したのですが。 自動で ( テストコードで ) やりたい場合は、 テストメソッドの中から UI Automation を使えば可能です。
     UI Automation を直接使うのは面倒ですが、 John Robbins 氏が MSDN マガジン 2007年 3月号に発表してくれたラッパークラスを使うと楽になります。 → http://msdn.microsoft.com/ja-jp/magazine/cc163465.aspx

     

    詳細は MSDN マガジンの記事を読んでいただきたいのですが、 テストコードのイメージはこんなふうになります。

     

    Code Snippet

    using 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();
      }

     

     

    2008年5月15日 1:26

すべての返信

  •  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

    2008年5月12日 3:57
  •  Koki3 さんからの引用

    たとえば、GUIアプリにおいて、exeを起動させ、いろいろイベントを起こさせて、その結果のカバレッジを測る、というやり方はできるのでしょうか?

    「いろいろイベントを起こさせて」 というところを、 手動でテストしたいのだと解釈したのですが。 自動で ( テストコードで ) やりたい場合は、 テストメソッドの中から UI Automation を使えば可能です。
     UI Automation を直接使うのは面倒ですが、 John Robbins 氏が MSDN マガジン 2007年 3月号に発表してくれたラッパークラスを使うと楽になります。 → http://msdn.microsoft.com/ja-jp/magazine/cc163465.aspx

     

    詳細は MSDN マガジンの記事を読んでいただきたいのですが、 テストコードのイメージはこんなふうになります。

     

    Code Snippet

    using 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();
      }

     

     

    2008年5月15日 1:26
  •  

    biac

     

    ご返信ありがとうございます。

     

    私のやりたいことと一致していました。

    非常に参考になりました。

     

    また何かの機会でご縁があれば、よろしくお願いいたします。

     

    Best Regards.

    清水

    2008年5月23日 2:05
  • こんにちは!フォーラムオペレータの栗原麻里です

     

    Koki3 さん、フォーラムのご利用ありがとうございます。
    Koki3 さんの「やりたいこと」にばっちり届いたみたいですね。
    ぜひ、回答していただいた方法を試してみてくださいね!

     

    biac さん、わかりやすく丁寧な回答ありがとうございました。
    また、サンプルのご提供ありがとうございます。

     

    フォーラムをご利用の皆様の中にも、同じような方法ができないか探している人がいるかもしれません。
    ぜひ他の皆様にも参考にしていただけたらと思ったので、チェックをつけさせていただきました。

     

    皆様が有用な情報を見つけやすくなるので、今回のように参考になった場合は

    ぜひチェックをつけてくださいね!

     

    それでは、またフォーラムを活用してたくさん情報交換してください!

     

    2008年6月2日 9:12