web-dev-qa-db-ja.com

WCF単体テスト

WCFサービスを単体テストする方法は?サードパーティ製のツールはありますか?

38
user11039

Akuが言うように、サービスメソッド(つまりコードの動作)をテストしている場合は、それを直接単体テストしてWCFインフラストラクチャをバイパスできます。もちろん、コードがWCFコンテキストクラス(OperationContextなど)に依存している場合は、ASP.NET MVCがHttpContextに対して行うようにラッパーを導入することをお勧めします。

接続をテストする場合、設定したエンドポイントのタイプによって異なります。場合によっては(WCF Windowsサービスの場合と同様に)単体テスト内でWCFサービスをセルフホストして、それをテストできます。

ただし、これらのホスティング環境(SSL、認証方法など)に固有のWCF動作をテストする場合は、ASP.NET開発WebサーバーまたはIISを起動する必要がある場合があります。)これはトリッキーになりますそして、全員の開発マシンとビルドサーバーの構成に要求を出すことができますが、実行可能です。

26

私は最善のアプローチはすべての懸念を個別にテストすることだと思います。接続、クライアントライブラリ(プロキシ)、サービスメソッド呼び出しをテストします。モッキングと依存関係の注入は、接続とサービスの動作を個別にテストするための良い方法ですが、ミドルウェア依存のエンドポイントテストを回避できるとは思えません。

テスト(セルフホスト)でサービスホストを作成し、サービスをロードできます。エンドポイントを設定したら、クライアントプロキシを使用してエンドポイントに接続できます。これは単純なHTTPとWSHTTPで動作するはずです。単体テストでは、サービスへのサービス参照を作成する必要があります。次に、ホストを作成し、クライアントをテストホストに接続します。 「WCFサービスホスト」、つまりWcfSvcHostを使用したテストは回避しようと思います。 (これは、一部の人々がVisual Studioユーティリティを参照したためにのみ言及しています。これは、IDEからテストを実行する場合にのみ機能します。)

特別なミドルウェアを使用するエキゾチックな認証シナリオまたはエンドポイントをチェックする必要がある場合は、ミドルウェアを使用してテストを作成する必要があります。単純な健全性チェックなどには、セルフホスティングを使用するだけで十分です。ビルドサーバーを使用している場合、ミドルウェアに依存するテストにより、テストデプロイメントの問題が発生することがあります。

ミドルウェアに依存するエンドポイントとは、たとえばMOM(MSMQ、RabbitMQなど)または実際にエキゾチックなプロトコルなどを使用しているエンドポイントを意味します。おそらく、自己ホスト型モックを使用してクライアントプロキシをテストし、エキゾチックなエンドポイントを個別にテストする方法です。

依存性注入を使用する場合は、モックサービスなどを注入できる「サービス抽象化」機能を提供するかなり洗練されたフレームワークがいくつかあります。WCFでSpring.NETを数回使用しました。キャッスルウィンザーにはWCF施設もあります。

セルフホストテストの例:

    ServiceHost serviceHost = null;

    try
    {
        var baseAddress = new Uri("http://localhost:8000/TestService");
        serviceHost = new ServiceHost(typeof (ServiceClass), baseAddress);
        Binding binding = new WSHttpBinding();
        var address = new EndpointAddress("http://localhost:8000/TestService/MyService");
        var endpoint = serviceHost
            .AddServiceEndpoint(typeof (IServiceContract), binding, address.Uri);

        var smb = new ServiceMetadataBehavior {HttpGetEnabled = true};
        serviceHost.Description.Behaviors.Add(smb);

        using (var client = new ProxyClient(endpoint.Name, endpoint.Address))
        {
            endpoint.Name = client.Endpoint.Name;

            serviceHost.Open();

            // ... magic happens 
        }

        serviceHost.Close();
    }
    catch (Exception ex)
    {
        // ... tests
    }
    finally
    {
        if (serviceHost != null)
        {
            ((IDisposable) serviceHost).Dispose();
        }
    }

機能テストツールは単体テストツールと同じではないことを指摘しておきます。ユニットテストは、テストを一連の独立したテストに分解することです。一方、機能テストは、主にワークフローをエンドツーエンドでテストすることです。

22
Jeno Laszlo

正確に何をテストしたいですか?接続またはサービス方法?

WCFのすばらしい点は、インターフェイス(エラー、コントラクト)を定義して、通常のコードとしてテストできることです。次に、それらがWCFでサポートされている任意の接続タイプを介して機能すると想定できます。

接続は、UTまたは開発用Webサーバーでサービスを直接ホストすることでテストできます。

ツールについては、NUnit、Visual Studioの組み込みテスト、xUnitなどの多数の単体テストフレームワークがあります。

" Visual Studio 2008 and .NET Framework 3.5 Training Kit "と " 。NET Framework 3.5 Enhancements Training Kit "をダウンロードすると、WCF単体テストのサンプルが正しくあったことがわかります

12
aku

WCFサービスを実際にテストしたい場合は、実際にクライアント/サーバー接続の部分を実行する統合テストを行うのが最善です。

5
cruizer

実際に実行中のサービスをテストしたい場合、 SoapUI は無料で、いくつかの優れた機能を備えています。唯一の注意点は、私がBasic HTTPバインディングでしか試していないことです。

4
Thomas Bratt

Typemock Isolatorはユニットテスト wcf services などのツールです...

2
Brian

Typemock Isolatorを使用してそれを行うことができます。 クライアント側 、および サーバー側 のテストに関する問題についての投稿をいくつか示します。構成ファイルを含め、依存関係なしでそれを行うことができます。

ギルジルバーフェルドタイプモック

2
Gil Zilberfeld

WCFサービスのパフォーマンステストとスケーラビリティテストを評価するために SOAテスト が使用されているのを見たことがあります(これがあなたの求めるものである場合)。コストやライセンスに関する情報はありません。

この例では、自動テストを実行するために、UIからメッセージをキャプチャしました。

0
Berkshire