作業では、多くのテストを作成する必要があります。 これをすばやく行うには、
CodeRushテンプレートを使用します。 この記事では、テスト用のカスタムテンプレートを作成する方法を説明します。 例として、保護されたクラスメソッドの呼び出しの正しい順序をテストするために、次のタスクを取りましょう。
NMockなどのライブラリを使用せずに、
NUnitのみを使用し
ます 。
テストするオブジェクト
それでは、実験的なオブジェクトから始めましょう。 いくつかのメソッドを含み、呼び出しの特定の順序を持つ単純なクラスを作成します。
public class SimpleClass { public void DoAction() { BeforeAction(); try { DoActionCore(); } finally { AfterAction(); } } protected virtual void BeforeAction() { } protected virtual void AfterAction() { } protected virtual void DoActionCore() { } }
このクラスでは、
DoActionメソッドを呼び出した結果、
BeforeAction 、
DoActionCore 、および
AfterActionメソッド
が 、目的の順序と必要な回数で実行されること
が保証されていることを確認する必要があります。
テストは、
SimpleClassクラスの子孫の記述に基づき
ます。SimpleClassクラスは、特定のメソッドを呼び出すと、このメソッドが呼び出されたことを記録します。 簡単にするために、通常の文字列をトレースオブジェクトとして使用し、そこに呼び出されたメソッドの名前を追加します。 テストでは、結果の文字列と期待される結果を検証します。
TestClassNameなどのクラスの命名規則を定義します。 これにより、テスト用のテンプレートの記述が簡単になります。
テンプレートのカスタマイズ
CodeRush
テンプレートについて簡単に説明すると、名前の置換、フォーマットなどの特定のルールに従って、頻繁に使用されるコードスニペットをエディターにすばやく挿入できます。 これらはコードスニペットに似ていますが、高度なインテリジェンスが異なり、アプリケーションコンテキスト、既存のコードを分析する機能、コマンドの存在、ラインプロバイダー、フィールド、リンクなどの多くの利点を提供します。
次に、トレース文字列を含むクラスの相続人用の独自のテンプレートの作成を開始します。 設定ウィンドウを開き、NUnitのオプションのグループである[エディター]-> [テンプレート]グループに移動します。 CodeRushには、NUnitテストを作成するためのテンプレートの定義済みセットが既に含まれていますが、別のテンプレートを作成する必要があることに注意してください。
図1-NUnitの新しいテンプレートの作成
テンプレートに短い名前、たとえば
stu (スタブクラスから)を付け、テンプレートの本文を記述します。 テンプレートをアクティブ化すると、ソースクラスの名前がクリップボードに保存され、貼り付け後に、名前に対して上記で定義されたルールを反映するコードが作成されるようにテンプレートを設計します。
#region Test«Paste» (stub class) public class Test«Paste» :«Paste» { string trace = string.Empty; public Test«Paste»(«Caret») : base() { } public string Trace { get { return trace; } set { trace = value; } } } #endregion
図 2-定義済みコマンドを使用してテンプレートの本文を作成する
テンプレートを作成するとき、定義済みのコマンドセットを使用して、リストから選択します。 このようなチームは、「貼り付け」と「キャレット」です。
ここで、このテンプレートを実行できる場所を示すことが重要です。 これを行うには、必要な値を設定して使用パラメーターを使用を構成します。 Line.OnEmptyLineパラメーターを指定します。
図 3-テンプレートの使用領域の定義
最初と同様に、メソッドにトレース文字列を追加する
atr (トレース追加)テンプレートを作成します。
trace += "->«Member»"; «Caret»
この場合、現在のメソッドの名前は、テンプレートがアクティブになったときに自動的に挿入され、最初にクリップボードにコピーする必要はありません。 テンプレートの使用領域をInClass、InMethodとして定義しましょう
図 4-トレース文字列を挿入するためのテンプレート
テンプレートの準備ができました。 自己作成したものを含むテンプレートをxmlファイルにエクスポートできると言われるべきです。 また、必要に応じて、以前に作成したファイルからインポートして再利用します。これにより、手動で再入力する必要がなくなります。
テストをすばやく書く
どのように機能しますか? SimpleClassのテストを作成してみましょう。
テストには継承クラスが必要です。 SimpleClassの名前をクリップボードにコピーして、stuと入力します。 Traceプロパティを含む継承クラスのテンプレートがカーソル位置に挿入されます。
図 5-テンプレートのアクティブ化とコード挿入
次に、関心のある各メソッドのトレース情報を追加します。 これを行うには、これらのメソッドをやり直します。 Visual Studioで「over」と入力し、スペースバーを押してドロップダウンリストから目的のメソッド名を選択します。IntelliSenseに名前を痛々しいほど思い出す必要はありません。 その結果、必要なメソッドはすべてオーバーライドされ、これまでのところ、基本メソッドが呼び出されます。
今が
atrテンプレートを含めるときです。 これらのメソッドを実行して、トレース文字列を挿入するためのテンプレートをアクティブにしましょう。 その結果、呼び出し後にTraceプロパティに名前を追加するメソッドを取得します。
#region TestSimpleClass (stub class) public class TestSimpleClass : SimpleClass { string trace = string.Empty; public TestSimpleClass() : base() { } public string Trace { get { return trace; } set { trace = value; } } protected override void BeforeAction() { base.BeforeAction(); trace += "->BeforeAction"; } protected override void AfterAction() { base.AfterAction(); trace += "->AfterAction"; } protected override void DoActionCore() { base.DoActionCore(); trace += "->DoActionCore"; } } #endregion
名前に加えて、呼び出しに関連する他の情報、たとえば呼び出しパラメーターなどをトレースオブジェクトに追加できます。
テストに直接戻ります。 クラスのテストグループのTextFixtureを作成します。 ところで、作成を高速化するために、SetUpおよびTearDownのメソッドを含む独自のテンプレートを作成することもできます。 子孫クラスのインスタンスを宣言し、初期化して、
DoActionメソッドのテストを記述し
ます 。 このテストでは、メソッドを呼び出した後の後続クラスのTraceプロパティと、クラスの保護されたメソッドの正しい呼び出しシーケンスを反映する期待される結果を比較します。
#region SimpleClassTests [TestFixture] public class SimpleClassTests { TestSimpleClass testClass; [SetUp] public void Setup() { testClass = new TestSimpleClass(); } [TearDown] public void Teardown() { testClass = null; } [Test] public void DoActionMethod() { testClass.Trace = string.Empty; testClass.DoAction(); string expectedTrace = "->BeforeAction->DoActionCore->AfterAction"; Assert.AreEqual(expectedTrace, testClass.Trace); } } #endregion
テストを実行します。 結果が達成されました-クラス内のすべてが正常に機能することを確認しました。
結論として、トレース文字列を使用するアプローチの欠点の1つは、ソースクラスのコードとそれらの呼び出しの順序を変更するときに、テストまたは参照文字列を変更する必要があることです。 したがって、すべてが適度に良好であり、あなたはあなた自身がそのような実践をどこでいつ適用するかを決定します。
便利なテストパターンを作成してください。