63

.NET Framework: 2.0 推奨言語: C#

TDD(テスト駆動開発)初心者です。

まず、Windows サービスの単体テストは可能ですか?

Windows サービス クラスは、オーバーライド可能なメソッドを持つ ServiceBase から派生しています。

  1. OnStart
  2. オンストップ

単体テストがこれらのメソッドを適切な順序で呼び出す実際のサービスであるかのように、これらのメソッドが呼び出されるようにするにはどうすればよいですか?

この時点で、単体テストを行っていますか? または統合テスト?

私は WCF サービスの質問を見てきましたが、WCF サービスを扱ったことがないので意味がありませんでした。

4

7 に答える 7

90

Windows サービスの "OnStart" および "OnStop" オーバーライドがクラス ライブラリ アセンブリのメソッドを呼び出すだけになるように、アプリを設計することをお勧めします。こうすることで、クラス ライブラリ メソッドに対する単体テストを自動化できます。また、設計によって、Windows サービスの実装からビジネス ロジックが抽象化されます。

このシナリオでは、"OnStart" および "OnStop" メソッド自体を Windows サービス コンテキストでテストすることは、自動化するものではなく、統合テストになります。

于 2008-09-03T17:33:08.027 に答える
35

サービスを直接テストするのではなく、サービスの機能をテストすることで、Windows サービスの単体テストを行いました。

通常、サービス用にアセンブリを 1 つ作成し、サービスの機能用に別のアセンブリを作成します。次に、2 番目のアセンブリに対して単体テストを作成します。

このアプローチの良いところは、サービスが非常に薄いことです。基本的には、メソッドを呼び出して適切なタイミングで適切な作業を行うだけです。他のアセンブリには、サービスが実行しようとしているすべての作業が含まれています。これにより、テストが非常に簡単になり、必要に応じて再利用または変更が容易になります。

于 2008-09-03T17:33:43.983 に答える
10

ここから始めます。C# でサービスを開始および停止する方法を示します。

開始するサンプルは次のとおりです

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

また、主にコンソール アプリを使用してサービスをテストし、サービスが何をするかをシミュレートしました。そうすれば、単体テストは完全に自動化されます。

于 2008-09-03T17:32:03.847 に答える
6

実際のシステムへのプロキシのような Windows サービス クラス (サービスの開始/停止時に実行するクラス) を使用します。あなたのサービスの背後にあるコードが他のプログラミングとどう違うべきかわかりません。onStart メソッドと onStop メソッドは、GUI でボタンを押すのと同じように、発生する単なるイベントです。

したがって、Windows サービス クラスは非常に薄いクラスであり、Windows フォームに匹敵します。ビジネスロジック/ドメインロジックを呼び出し、それが本来の目的を実行します。あなたがしなければならないことは、onStart と onStop で呼び出しているメソッドが想定どおりに機能していることを確認することだけです。少なくともそれは私がすることです;-)

于 2008-09-03T17:34:33.467 に答える
3

テスト用に設計することは良い戦略です。多くの回答が、ドメイン オブジェクトに委譲することによってメソッドOnStartとメソッドを非常に薄く保つことを推奨することで指摘しているためです。OnStop

ただし、何らかの理由でテストでサービス メソッドを実行する必要がある場合は、次のようなコードを使用して、テスト メソッド内からサービス メソッドを呼び出すことができます (OnStartこの例では呼び出しています)。

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});
于 2015-11-24T18:35:40.043 に答える
0

自動電源オフ、シャットダウン状態でのテスト ウィンドウ サービス ネットワークの切断、接続時のテスト ウィンドウ サービス テスト ウィンドウ サービス オプションの自動開始、手動など

于 2010-03-30T07:13:40.763 に答える
-1

ガイはおそらく最良の答えです。

とにかく、本当にしたい場合は、 MSDN ドキュメントで説明されているように、単体テストでこれら 2 つのメソッドを呼び出すことができますが、これらは保護されているため、リフレクションを使用する必要があります。

于 2011-05-18T08:59:21.127 に答える