重命名抽象测试方法(Visual Studio / c#)

时间:2012-06-20 09:30:39

标签: c# visual-studio unit-testing abstract-methods method-names

问题: 有没有办法手动命名测试方法而不是采用方法名?

背景: 我目前是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);
    }
}

在你运行测试之前,这一切看起来都很整洁......

在测试结果窗口中,所有测试都称为“test”,您需要将“Class name”列添加到视图中,以便能够区分它们。

解决这个问题的快速(而且相当肮脏的方法)是删除界面中的TestMethod-annotation,并在每个单独的实现中添加以下“invoker”

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

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

    #endregion

    ...
}

有没有人知道更好的方法来更改测试方法的名称? 使用接口的现有抽象方法“getName()”将是理想的......

亲切的问候,

斯泰恩

0 个答案:

没有答案