问题:有没有办法手动命名测试方法而不是使用方法名?
背景:我目前是 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()”将是理想的......
亲切的问候,
斯蒂金