说,我们有以下
public interface IStack
{
bool IsEmpty { get; }
}
public class StackImpl1 : IStack
{
public StackImpl1(int size)
{
IsEmpty = true;
}
public bool IsEmpty { get; }
}
public class StackImpl2 : IStack
{
public StackImpl2(int size)
{
IsEmpty = true;
}
public bool IsEmpty { get; }
}
而且我们希望实现从OP的IsEmpty_OnCreation()
测试。我们可以做一个普通的测试,并添加多个invokers(每个执行测试一个)。问题在于缩放。
对于每个新功能是将待测试我们需要添加
1)测试实施
2)一个调用每个实现的被测试。
对于每一个新的实现我们介绍,我们需要添加一个调用每一个现有的测试。
有可能使用继承来完成大部分的工作,为我们
public abstract class StackTest
{
protected abstract IStack Create(int size);
[TestMethod]
public void IsEmpty_NoElements()
{
var myStack = Create(10);
var exp = true;
var act = myStack.IsEmpty;
Assert.AreEqual(exp, act);
}
}
[TestClass]
public class StackImp1Fixture : StackTest
{
protected override IStack Create(int size)
{
return new StackImpl1(size);
}
}
[TestClass]
public class StackImp2Fixture : StackTest
{
protected override IStack Create(int size)
{
return new StackImpl2(size);
}
}
测试在每个派生夹具产生。
如果我们要添加一个新的测试中,我们将它添加到StackTest
类,它会自动包含在每个派生夹具。
如果我们添加IStack
的第三个实现,我们只需添加一个衍生自StackTest
的新测试装置并重写create方法。
注:
如果被测类有默认的构造函数,相同的形状可以用通用StackTest被用作基本
public class GenStackTest<TStack> where TStack : IStack, new()
{
[TestMethod]
public void IsEmpty_NoElements()
{
var myStack = new TStack();
var exp = true;
var act = myStack.IsEmpty;
Assert.AreEqual(exp, act);
}
}
[TestClass]
public class GenStack1Fixture : GenStackTest<StackImpl1>
{
}
[TestClass]
public class GenStack2Fixture : GenStackTest<StackImpl2>
{
}
与属于任何其他代码,你应该重构代码这两种情况都变成了一个自己的类,所以它可以用在不同的用例中。所以,当你已经有*测试用例1的实现时,将行为重构为它自己的类,并在两个测试中使用实例。 – HimBromBeere