locked
Silverlight4の単体テストについて

    全般的な情報交換

  • Visual Studio 2010のProfessional版を利用することを前提にSilverlight4を評価していますが、単体テストの方法について悩んでいます。単体テストの対象はMVVMパターンを使用した場合のVM(View Model)を想定しています。

    私が認識している問題点は3つあります。
    1)MSTestによるテストが正式サポートされていない
    2)Silverlight Unit Test Frameworkでは期待した単体テストを行えず、またドキュメント(情報)が少ないため使いにくい
    3)WCF RIA Serviceを使った場合にDomainContextをモック化しづらい

    これらの問題点(特に1と2)をこの場で議論させていただいて、必要であればMicrosoftConnectへ提案したいと考えています。以下、それぞれの問題点の詳細を述べます。


    1)「MSTestによるテストが正式サポートされていない」について

    Silverlight4は、MSTestによるテストを正式にサポートしていないため、MSTestのプロジェクトからSilverlightのプロジェクトを参照すると警告が表示されます。
    MicrosoftConnectでの回答を見ると、これは意図した動作のようです。
    https://connect.microsoft.com/VisualStudioJapan/feedback/details/534744/silverlight-4

    ある程度の制約を受けれいれればMSTestによるテストによるテストは可能なのですが、不便に感じられます。以下のURLでは、MSTestを利用する方法が紹介されています。この記事ではSilverlight3とVisual Studio 2010のbetaを使用していますが、Silverlight4とVisual Studio 2010 Professionalの正式版を使用しても同じでした。
    http://www.tdd-net.jp/2009/12/vs2010b2j-mstes.html


    2)「Silverlight Unit Test Frameworkでは期待した単体テストを行えず、またドキュメントが少ないため使いにくい」について

    Silverlight Toolkitに含まれるSilverlight Unit Test Framework(http://code.msdn.microsoft.com/silverlightut)というツールを利用することも検討しましたが、このツールはブラウザ上でテストが実行され結果もブラウザ上に表示されます。私が期待している単体テストは、通常のMSTestによる単体テストと同じようにVisual Studio内で実行されテスト結果もVisual Studio内に表示されるものです。
    また、Silverlight Unit Test Frameworkはドキュメント(情報)が少ないため使いづらいとも感じています。もしMicrosoftがSilverlight Unit Test Frameworkを推奨するのであれば、このあたりの状況を改善していただきたいです。


    3)「WCF RIA Serviceを使った場合にDomainContextをモック化しづらい」について

    System.ServiceModel.DomainServices.Client.DomainContextには、LoadメソッドやSubmitChangesメソッドなどがvirtualとして定義されています。一見、ここをオーバーライドすればテスト用のデータを簡単に返せると思ったのですが、それらのメソッドの戻り値の型がLoadOperationやSubmitOperationクラスであり、これらのクラスのコンストラクタがinternalです。そのため、自分でインスタンス化できません。

    私が調べた限り、System.ServiceModel.DomainServices.Client.DomainClientを基底クラスとしたモック用のDomainClientを作成し、このインスタンスをDomainContextのコンストラクタに渡すのが唯一のモック化の方法に見えます。ここでのモック化とは、サーバーにはアクセスせず、クライアント側でテストに期待されるデータを返すことを言っています。この方法でやりたいことは実現できるのですが、もしほかに良い方法があれば情報共有させてください。


    以上です。皆さんはどのようにお考えでしょうか?よろしくお願いします。
    2010年9月4日 8:23

すべての返信

  • 私もViewModelをSilverlightで作ったものの、単体テストしづらいなぁ・・・と思っています。
    公式に単体テストがサポートされていないという問題もありますし、DomainContextをモック化しづらいという点については常々感じています。

    DomainClientのやり方も、決して万人に可能というほどやりやすいものでもないので、公式にモック用のDomainClientの実装を用意してくれるか、その他のモック化の方法を提供してくれるといいと思っています。


    かずき Blog:http://blogs.wankuma.com/kazuki/
    2010年9月6日 13:17
  • ご意見ありがとうございます。

    やっぱり単体テストしづらいですよね。
    今のままですと、実質的に打鍵テスト以外の選択肢が難しいのではないかと感じています。
    「DomainClientのやり方も、決して万人に可能というほどやりやすいものでもない」というのは確かに私もそう思います。

    個人的には、新しい技術はテスト手法とセットで出してもらえたらなぁと思います。SilverlightやWCF RIA Services以外のEntity Frameworkなどについても。
    2010年9月7日 10:14
  • まだ、殆ど試せていませんが、コンソールからテストを実行出来る StatLight というツールがありましたよ。

    http://statlight.codeplex.com/

    Visual Studio 上での実行では無いですが、Wish List を見る限りテストの自動化に対しても力を入れてそうです。

    ご参考までに。

    2010年9月7日 12:46
  • statlightは

    2)「Silverlight Unit Test Framework

    をコンソールで動かしました!!みたいなものですね。裏で独自のWebサーバーをホストしてコンソールの中でテスト結果を表示します。

    Visual StudioにStatlightのテスト結果を表示するSilverlight Unit Test Result Viewerなんて拡張ものもありますけれど、実行にはVisual Studioを管理者権限で起動する必要があってちょっと微妙です。

    http://visualstudiogallery.msdn.microsoft.com/ja-jp/feeb23d4-9295-4d79-be59-8c12a6f0d79b

     

    Statlightを自動ビルドなんかに組み込んで使うのは嬉しですね。

    一応SilverlightのUnitTestに関して計画はあるっぽいので、こんな機能が欲しい!!とConnectあたりにフィードバックしてみるのはいいかもしれません。

    2010年9月8日 1:23
  • おださん、かるあさん、情報ありがとうございます。
    StatLight試してみたいと思います。

    かるあさんが言及されているSilverlightのUnitTestに関しての計画にとても興味あるのですが、もしよろしければ情報元のURLなど詳細な情報を入手できるところを教えていただけないでしょうか?VisualStudioに組み込まれるのか、いつころのリリースを予定しているのか、自動テストしやすいものなのかなどが気になります。

    ちょっと話は変わって単体テストではないのですが、Visual Studio 2010 Premium および Visual Studio 2010 Ultimateで提供されているコード化された UI テストの機能はSilverlightにも対応してほしいなぁと思います。今日、以下のURLのブログでホワイトペーパーの存在を知って読んだのですがSilverlightが対象になっていませんでした。残念です。。。
    http://blogs.msdn.com/b/kkondo/archive/2010/09/06/codedui.aspx
    2010年9月8日 13:00
  • Silverlight の UnitTestに関しては、公式にホームページで出たというのは聞いたことはありません。

    MSの社員に話を聞いたときにそんな開発もやっている程度で、いつ出るかもわかりません。

     

    SilverlightのUIオートメーションによるテストに関しても噂だけでは聞こえてきます。

    UI層のテストはおそらくLoadTestがらみで需要がある。(というか、僕も待っています。)ので、もしコネクトにフィードバックを出すなら、こっちもあわせてフィードバックしたいですね。

    2010年9月9日 2:14
  • まだ詳細な情報はないのですね。了解しました。

    SilverlightのUIオートメーションによるテストもぜひ対応してほしいですね。

    コネクトは、このスレッドでの議論が一段落したところで、Silverlightのテスト全般をテーマに要望として提出したいと考えています。

    ところで、StatLight使ってみました。思っていたよりも使えるかもしれないという印象を持ちました。
    まず、Silverlight Unit Test Frameworkを直接使うよりも起動が早いことが気に入りました。それと-cオプションでxapがビルドしなおされるたびに自動でテストしてくれるのもいいですね。
    使いにくい点は、管理者権限が必要、毎回Windowが表示される、コマンドラインなのでメソッド名を指定しづらいといったところです。

    Unit Test Result Viewer for Silverlightも使ってみました。
    こちらはメソッドごとの実行ができるのが利点ですね。
    使いにくい点は、管理者権限が必要、テストで例外がスローされても表示されない、テスト実行前に勝手にビルドしてくれない、StatLightの配置ディレクトリが固定などです。あと、Reshaperのテスト実行機能と連携してくれるとうれしいのですけどね。
    現時点では使いやすくはないですが、将来に期待できるツールではないかと感じました。

    2010年9月9日 4:49
  • みなさん、ご意見ありがとうございました。Microsoft Connectへフィードバックしました。

    Silverlight4のテストを強力にサポートしてほしい

     

    賛同いただける方、voteをよろしくお願いします。

    2010年9月18日 23:01