Compartilhar via


【VSTS|TIPS】単体テストを用いたパフォーマンスのテスト

さて、今日は Team System の単体テストの活用方法のひとつをご紹介します。単体テストでは、通常、メソッドの結果と期待する結果の値を見比べることで、テストの成否(OK/NG)を評価します。要するに、「仕様に沿った実装がなされていて、結果が正しいかどうか」を確認できるわけです(具体例は、下記の「よくある単体テストのテストメソッド」をご覧ください)。

単体テスト機能(単体テスト フレームワーク)では、テストをコードとして記述しますので、いつもプログラミングで使用しているクラスを利用することができます。

それを利用することで、タイトルにあるような、テスト対象のメソッドのパフォーマンスをチェックすることもできます。もう少しわかりやすく、具体的にいうと、テスト対象のメソッドの実行の前後の時間を記録することで、そのメソッド実行にどれくらいの時間がかかったのかを計測する。それが期待していた時間以内かどうかでテストの成否(OK/NG)を判断する・・・ことで、パフォーマンステストとする。ということです。

まず、以下に、よくある単体テストのテストメソッド(要するにテスト用のプログラムコードです)を載せておきます:

----- よくある単体テストのテストメソッド -----
using Fabrikam;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
(省略)
/// <summary>
/// SayHello のテスト
///</summary>
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\Fabrikam", "/")]
[UrlToTest("https://localhost/")]
public void SayHello_日本語ロケールの場合はこんにちは()
{
Translation target = new Translation();
string culture = "ja-JP";
string expected = "こんにちは";
string actual;

actual = target.SayHello(culture);

Assert.AreEqual<string>(expected, actual);
    //Assert.Inconclusive("このテストメソッドの正確性を確認します。");
}
----- よくある単体テストのテストメソッド -----

ちなみに、この単体テストの環境は ASP.NET でテストは ASP.NET 開発サーバー上で実行される設定になっています。そのあたりの属性の設定については別途投稿します。

この例では、expected に想定している結果(SayHelloメソッドの戻り値)を定義し、actual に SayHello メソッドの戻り値が格納されています。Assert.AreEqual でこの expected と actual を評価して、等しければテストが成功、等しくなければテストが失敗となるわけです。

では、このテストメソッドに変更を加えることで、この SayHello メソッドのパフォーマンスを評価するようにしてみましょう。

----- パフォーマンスを評価するテストメソッド -----
using Fabrikam;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
using System; // 追加

(省略)
/// <summary>
/// SayHello のテスト
///</summary>
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\Fabrikam", "/")]
[UrlToTest("https://localhost/")]
public void SayHello_日本語ロケールの場合はこんにちはのパフォーマンス()
{
Translation target = new Translation();
string culture = "ja-JP";
string expected = "こんにちは";
string actual;

DateTime before = DateTime.Now; // 追加
actual = target.SayHello(culture);
DateTime after = DateTime.Now;   // 追加

Assert.AreEqual<string>(expected, actual);  // 削除
TimeSpan duration = after - before;   // 追加
Assert.IsTure(duration.TotalMilliseconds < 2000); // 追加
//Assert.Inconclusive("このテストメソッドの正確性を確認します。");
}
----- パフォーマンスを評価するテストメソッド-----

追加した行を太字にしてあります。このように、テスト対象のメソッドの実行前後の時間を記録して、引き算すれば実行にかかった時間が割り出せるわけですね。それを Assert.IsTrue で評価することで、パフォーマンスについてのテストを行うことができます。

この方法の利点は、パフォーマンスを成否(OK/NG)で単純明快に評価できる点です。明確なパフォーマンス要件が定められている場合に限定して利用するとよいでしょう。

実は、これ、Tech・Ed でも、先のアイネタジャパンとの共催の勉強会でも実施しようと思っていたのです・・・が、時間がなくってできませんでした。 Microsoft On では、このあたりも実際にご覧いただく時間がありますので、デモを実施しながら説明しようと思っています。

Microsoft On では、現在 11月, 12月開催分のお申し込みを今週いっぱい(10/5 17:00まで!)受け付けていますので、ご興味のある方は応募要件をご覧の上お申し込みください(無償です)。

ながさわ

Comments

  • Anonymous
    October 01, 2007
    PingBack from http://www.artofbam.com/wordpress/?p=4429

  • Anonymous
    October 04, 2007
    こんにちは。先日の 【VSTS|TIPS】単体テストを用いたパフォーマンスのテスト という投稿において、 ちなみに、この単体テストの環境は ASP.NET でテストは ASP.NET 開発サーバー上で実行される設定になっています。そのあたりの属性の設定については別途投稿します。

  • Anonymous
    December 08, 2007
    MSDN オフラインセミナー 全国ツアー <チーム開発編>にご参加いただきありがとうございました。 このページでは、セミナーでご覧いただいたデモンストレーションでのオペレーションやテクニックについて主に、過去、そしてこれからこのブログに投稿する(した)ものを紹介する形でご紹介いたします。