normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Visual Studioのテストツール辺りの備忘録

自分の備忘録を含めて軽くメモ。知ってる人も多いと思いますが、簡単に書いてみます。知っていると結構便利です。
タイムアウト処理と例外発生処理のテストを行う場合、ExpectedException属性やTimeout属性を使用したテストが出来ます。判定用のクラスはAssert機能以外にも、StringAssertクラスやCollectionAssertクラスが存在します。
上記の属性、クラスを知っているだけでも単体テスト効率が上がるので、一応ちょこっと書いてみます。

例外処理用の属性

例外が発生するロジックのテストも容易です。いちいち「try〜catch」を書く必要は有りません(こっちは地味ですが相当便利だと思います)。

        /// <summary>
        /// ExpectedExceptionの引数と同じ例外じゃないとダメ ⇒ このテストは失敗する
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(Exception))]
        public void ExpectedExceptionTest01()
        {
            throw new ArgumentOutOfRangeException("自前で投げてみた");

            //以下の処理を書かなくて良い!
            //try
            //{
            //    //ホゲホゲ処理
            //}
            //catch (ArgumentOutOfRangeException ex)
            //{
            //}
        }

        /// <summary>
        /// ExpectedExceptionの引数と同じ例外じゃないとダメ ⇒ このテストは成功する
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentOutOfRangeException))]
        public void ExpectedExceptionTest02()
        {
            throw new ArgumentOutOfRangeException("自前で投げてみた");
        }

タイムアウト処理用の属性

属性を使ってタイムアウト時間を判定したテストを実施できます。重い処理に対する性能をテストしたい場合にお勧め。

        /// <summary>
        /// 2秒以内に終わらないとダメ ⇒ このテストは失敗する
        ///</summary>
        [TestMethod()]
        [Timeout(2)]
        public void TimeoutAttributeTest01()
        {
            //System.Diagnostics.Stopwatchを使って同様の処理を書けないことは無いですが、
            //こっちの方がスマート
            Thread.Sleep(TimeSpan.FromSeconds(3.1));
        }

        /// <summary>
        /// 2秒以内に終わらないとダメ ⇒ このテストは成功する
        ///</summary>
        [TestMethod()]
        [Timeout(2)]
        public void TimeoutAttributeTest02()
        {
            //当然こっちのテストは成功する
        }

文字列やコレクションのAssert処理

StringAssertやCollectionAssertというクラスを用いると、文字列やコレクションの判定が非常に容易です。ちょっと調べるのが力尽きましたが、メソッド一発で良い感じに判定してくれるメソッドが多いです。

        [TestMethod()]
        public void AssertTest01()
        {
            //文字列処理用のAssertクラス
            StringAssert.Contains("巨乳", "乳");
            StringAssert.StartsWith("私は決して変態ではない", "私は");
            StringAssert.EndsWith("shibayanは変態", "変態");
            StringAssert.Matches("ちっちちっち、おっぱーい。ぼいんぼいーん",
                new System.Text.RegularExpressions.Regex("おっぱ"));
            StringAssert.DoesNotMatch("ちっちちっち、おっぱーい。ぼいんぼいーん",
                new System.Text.RegularExpressions.Regex("おしりおしり"));
            
            //調べるのが力尽きた…orz
            //CollectionAssert.AllItemsAreNotNull
            //CollectionAssert.AllItemsAreInstancesOfType
            //CollectionAssert.IsSubsetOf
        }