說,我們有以下
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