web-dev-qa-db-ja.com

実行中のWindowsサービスの対応するプロセスを取得する機能をどのようにTDDしますか?

目的

昨年以上、私は最近読んだ本を使用して単体テストを学んでいます(== --- ==)The Art of Unit Testingレガシーコードなどで効果的に機能します。ユニットテストやモックフレームワークなども定期的に使用しており、その価値を確実に理解しています。

ただし、状況が主に外部API呼び出しを使用することを余儀なくされているコードを要求するとき、私はまだTDD(TADとは対照的に)を心に抱くのに苦労しています。

解決する問題

サービス名を使用して、Windowsサービスに関連付けられているプロセスを取得します。

例:Function GetProcess(ByVal serviceName As String) As Process

ルール

  • TDD を使用して、プロダクションおよびテストコードの各主要な反復を示します。
    • 実行するために必要な他のコードや構成を確認する必要はありません。インターフェース、具象クラス、テストメソッドに興味があるだけです。
  • C#またはVB.NET
  • サービス/プロセスに関して.Netフレームワークを使用する必要があります(つまり、System.Diagnostics.Process
  • テストフレームワーク:
    • NunitまたはMSTest
  • 分離フレームワーク:
    • Moq、Rhino Mock、またはMicrosoft Moles
  • 真の単体テストを記述する必要があります(統合テストなし)

その他の注意事項

私が知る限り、設計には2つのアプローチがあります。

  1. 制御の反転アプローチを使用し、アダプタやファサードパターンを使用して、プロセスとサービスを処理する基になる.netフレームワークオブジェクトをラップします。
  2. Get Processメソッドを含むクラスに.netフレームワークコードを保持し、 Microsoft Moles を介してコードの迂回(インターセプト)を使用して、テスト中のメソッドからハード依存関係を分離します。
6
Matt

なぜこれをしたいのか理解できません(知的課題への対処は別として)。システムレベルのAPIを直接操作するこの種のコードは、TDDスタイルであるかどうかを問わず、単体テストが非常に困難であり、率直に言って、実際のプロジェクトで試すことはあまり価値がありません。

説明するタスクのほとんどは、適切なパラメーターを使用して適切な低レベルAPIメソッドを呼び出すことです。そして、残りのコード自体は非常に簡単なものかもしれませんが、専用インターフェースやモックオブジェクトなどの導入を必ずしも保証するものではありません。私は、全体が機能することをより高いレベルで検証するための統合テストを持つコンテンツでしょう。しかし、これはちょうど私の2セントです。

私にとってのユニットテストは、ルールブックや厳密な定義に従うことではありません。実際には、テストが「実際の」単体テストであるかどうかは気にしません。私のコードが自動化された繰り返し可能なテストでカバーされている限り、私は元気です。私は実用的なアプローチを好みます。

5
Péter Török

ユニットをシステムリソースから分離できないレベルがあります。 TDDを使用してシステムを開発するときは、その量のコードをできるだけ小さくし、可能な限り抑制します。この場合、IProcessManagerという概念から始めることができます。その概念は、GetProcessおよび必要なその他のプロセス関連のメソッドを定義するインターフェースにすぎません。

interface IProcessManager {
    Process GetProcess(string processName);
}

「なぜインターフェースなのか?」とあなたは尋ねます。インターフェイスはグローバル関数よりもモックしやすいからです。プロセスマネージャをモックする目的は、この関数を使用するすべてのコードが、発生する可能性のあるさまざまなエラー条件で適切に動作するようにすることです。指定された名前のプロセスがない場合はどうなりますか? processNamenullになるとどうなりますか? IProcessManagerのモック実装では、これらの条件を簡単に再現できます。

コインの反対側、期待する動作を実装する実際のプロセスは非常に明確に定義されており、問題は十分に封じ込められています。テストなしで実装を作成するか、少なくとも予測および制御できる条件のテストを作成できます。たとえば、実行時に現在実行中のプロセスの名前を検出できる場合、名前でProcessを見つけるテストを作成できます。また、不正なプロセス名と存在しないものを思い付くことができるはずです。

単に正しくテストできない部分があることを理解してください。あなたは、物事がうまくいかない可能性を制限するためにあなたができることだけをすることができます。

2
Berin Loritsch