1

質問: メソッド名を使用する代わりに、手動でテスト メソッドに名前を付ける方法はありますか?

背景: 私は現在、BizTalk 開発者として活動しており、BizUnit フレームワークを使用してプロジェクトをテストしています。

これらの単体テストを実行するには、c# を使用して Visual Studio でビルドされた単体テスト用の内部機能を使用します。そこから、bizunit フレームワークを呼び出して、実際の (biztalk 固有の) テストを実行します。

これに関する厄介な点は、BizUnit が必要とするテストケースを作成するために、数行の「ボイラープレート」コードが必要なことです。これらのステップを実行する抽象クラスを使用すると、必要な実際の開発が容易になります。さらに、抽象クラスを使用すると、(いくつかのテンプレート メソッドを使用して) ドキュメント構造に関する「内部ポリシー」を適用できます。

抽象基本クラス「IBaseTestScenario」には、「test」と呼ばれる実際のメソッドが含まれています。

 [TestClass]
public abstract class IBaseTestScenario
{
     private enum Phases { describeTestCase, addSetupSteps, addExecuteSteps, addCleanupSteps, persistTestCase, runTestCase };

     private Phases currentPhase
     {
         get;
         set;
     }

     [TestMethod]
     public void test()
     {
         // construct an empty testcase
         TestCase testCase = new TestCase();

         // loop each phase and perform the appropriately actions
         foreach (Phases phase in Enum.GetValues(typeof(Phases)))
         {
             try
             {
                 currentPhase = phase;
                 MethodInfo phaseMethod = this.GetType().GetMethod(currentPhase.ToString());
                 phaseMethod.Invoke(this, new object[] { testCase });
             }
             catch (Exception) { }
         }    
     }
     #endregion

    #region Describe TestCase
    public void describeTestCase(ref TestCase testCase)
    {
        // required descriptions
        testCase.Name = getName();
        testCase.Description = getDescription();
    }
    protected abstract string getName();
    protected abstract string getDescription();
    #endregion

    ...
}

この構造を使用して、ステップが実行される順序を強制できます。適切な名前と説明を提供するように開発者に「思い出させる」ことができます (メソッドは抽象的であるため、情報を提供する必要があります)。テスト (シナリオごとに固有) は定型コードから分割されます。

シナリオを作成する場合は、この基本クラスを拡張して、シナリオ固有の情報を含む抽象メソッドを実装するだけです。

[TestClass]
public class TestTest : IBaseTestScenario
{
    protected override string getName()
    {
        return "TestSCTest: Testing the tests";
    }

    protected override string getDescription()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("This is a test for testing the testinterface.");
        sb.AppendLine("[SETUP]");
        sb.AppendLine("-+-- Add a delay of 1 second");
        sb.AppendLine("[EXECUTE]");
        sb.AppendLine("-+-- Add a delay of 2 second");
        sb.AppendLine("[CLEANUP]");
        sb.AppendLine("-+-- Add a delay of 1 second");
        return sb.ToString();
    }

    protected override void constructSetup(ref TestCase testCase)
    {
        DelayStep delay = new DelayStep
        {
            DelayMilliSeconds = 1000
        };
        add(delay);
    }

    protected override void constructExecute(ref TestCase testCase)
    {
        DelayStep delay = new DelayStep
        {
            DelayMilliSeconds = 2000
        };
        add(delay);
    }

    protected override void constructCleanup(ref TestCase testCase)
    {
        DelayStep delay = new DelayStep
        {
            DelayMilliSeconds = 1000
        };
        add(delay);
    }
}

テストを実行するまで、これはすべてかなりきれいに見えます...

テスト結果ウィンドウでは、すべてのテストは「テスト」と呼ばれ、それらを区別できるように「クラス名」列をビューに追加する必要があります。

この問題を解決する手っ取り早い (そしてやや汚い) 方法は、インターフェースの TestMethod アノテーションを削除し、次の「呼び出し元」をそれぞれの単一の実装に配置することです。

[TestClass]
public class TestTest : IBaseTestScenario
{
    #region Invoker

    [TestMethod]
    public void GiveMeaningfulName()
    {
        test();
    }

    #endregion

    ...
}

テストメソッドの名前を変更する (より良い) 方法を知っている人はいますか? インターフェイスの既存の抽象メソッド「getName()」を使用するのが理想的です...

敬具、

ステイン

4

0 に答える 0