kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Visual Studio 2012 Update1で強化されたテストエクスプローラー

これはVisual Studio Advent Calendar 2012の7日目の記事で、Visual Studio 2012 update1で追加された新機能、単体テストのカテゴリー機能を紹介します。まず、Visual Studio単体テストプロジェクトのテストメソッドにはいろいろな属性を付けることができます。よく使いそうな属性はこんな感じでしょうか。
TestCategoryAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
PriorityAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
OwnerAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
WorkItemAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
TimeoutAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
いくつかはちゃんと…といったらあれですが、WorkItemなどのTFSと連携すると便利に使えそうなものがありますね。でも、指定していない人も多くないでしょうか?
Visual Studio 2010ではアセンブリ名前空間といったあらかじめ決められたカテゴリでしか分類できなかったので、上の属性があっても…たとえばOwnerが自分のテストケースのみ抽出、なんてことが標準ではできませんでした。
しかし、Update1で変わります。テストエクスプローラーで右クリックすると、「グループ化」という項目があります。この中の「特徴(英語UIではTrait)」を選択します。

「特徴」を選択すると、Priority,TestCategoly,Owner属性ごとにグループ化されます。Visual Studio 2010ではテストメソッド名を工夫して、たとえば正常終了_条件xx_TestMethod()であれば正常系のテストメソッドである、と人間が識別をして、選択テストしていたかと思います。
このような面倒はVisual Studioが見てくれます。たとえば、こんなテストメソッドを作ったとします(サンプルなので、中身は空です)。

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        [Owner(@"domain\山田")]
        [Priority(1)]
        [TestCategory("正常系")]
        public void TestMethod1()
        {
        }
        [TestMethod]
        [Owner(@"domain\鈴木")]
        [Priority(1)]
        [TestCategory("正常系")]
        public void TestMethod2()
        {
        }
        [TestMethod]
        [Owner(@"domain\鈴木")]
        [Priority(2)]
        [TestCategory("異常系")]
        public void TestMethod3()
        {
        }
    }
}

これをテストエクスプローラーで「特徴」を選択すると、こんな形になります。

先頭のアイコンが水色で表示されているテストメソッドは未実行状態です。

ここでPriorityに1が指定されているものを選択して、右クリックから「選択したテストを実行」すると、選択されたテストが実行されます。Priority[1]に含まれていない、TestMethod3はテストが行われません(グレーアウト状態になっています)。

同様に、テストエクスプローラーからテストの種類を選択して、「選択されたテストのコードカバレッジを分析する」を選択するとテストが実行した範囲のカバレッジ分析が行われます。実際にこんなテストを書いてカバレッジを取得してみましょう。

public class SampleClass
{
    public int CrossDiv(int arg1, int arg2)
    {
        if (arg2 == 0) {
            throw new DivideByZeroException();
	}
        return arg1 / arg2;
    }
}

テストメソッドはこんなの。

[TestMethod]
[Owner(@"domain\山田")]
[Priority(1)]
[TestCategory("正常系")]
public void TestMethod1()
{
    var test = new SampleClass();
    var result = test.CrossDiv(10, 2);
    Assert.AreEqual(5, result);
}

これでテストに加えてカバレッジを取得すると、Visual Studio 2012はこう表示します。


テストで実行された場所が薄い水色、通っていないところが薄いえんじ色です。実際に実行したテストがどのくらいの範囲をカバーしているのか視覚的にわかって助かりますね。今までこのあたりのテスト関係の属性は書いてもテストの区分で選択できなくて書いていなかった人もいるかもしれませんが、Update1では便利になっているので、使ってみてください。