2009-11-16 33 views
2

我有兩個不同的類共享一個通用接口。雖然功能相同,但它們在內部工作方式非常不同。所以很自然我想要對它們進行測試。對兩個獨立的類應用一個測試

我能拿出最好的例子;我將 序列化到一個文件中,其中一個 類將其序列化爲明文,其他的爲 其他爲xml。數據(應該)看起來 在 序列化之前和之後相同,而不管使用的方法 。

什麼是測試這兩個類相同的方式,最好的方法?測試僅在實例化不同類時的方式不同。我不想複製整個測試,重命名並更改一行。

測試是目前在JUnit的,但我要去它們移植到NUnit的反正這樣的代碼並不真正重要。我更期待應用於這個測試套件的設計模式。

回答

4

爲測試創建一個通用的抽象基礎測試類。

abstract class BaseTest{ 

@Test 
public void featureX(){ 
    Type t = createInstance(); 
    // do something with t 
} 

abstract Type createInstance(); 
} 

ConcreteTest extends BaseTest{ 

    Type createInstace(){ 
     return //instantiate concrete type here. 
    } 
} 
+0

很好的選擇,但你也需要標記'BaseTest'忽視,爲了不的xUnit試圖運行它。 – 2009-11-16 10:22:49

+0

取決於跑步者。有或多或少的智能。前者看到該類是抽象的,後者可以配置爲根據模式忽略該類。 – 2009-11-16 10:33:21

1

我想重複使用繼承或聚合的代碼。

要具有最短的代碼,我一個測試實例創建移動到,比方說,XmlImplementationTest類工廠方法,並繼承它TextImplementationTest:

XmlImplementationTest extends TestCase 
{ 
    Interface tested = null 
    Interface createTested() { return new XmlImplementation() } 
    ... 
    void setUp() { tested = createTested(); } 
} 

TextImplementationTest extends XmlImplementationTest 
{ 
    override Interface createTested() { return new TextImplementation() } 
} 

這並不完全正確的面向對象設計,因爲它的TextImplementationTest不是XmlImplementationTest。但通常你不需要關心它。

或者將測試方法調用讀取到某些常用工具類中。這將涉及更多的代碼,並且不會在測試報告中顯示正確的測試類,但可能更易於調試。

0

在C#中,我會使用一個通用的輔助方法來測試這兩種情況下,是這樣的:

internal static void SerializationTestHelper<T>() where T : IMySerialize 
{ 
    T serialize = new T(); 
    // do some testing 
} 

[TestMethod] 
public void XmlTest() 
{ 
    SerializationTestHelper<XmlSerialize>(); 
} 

[TestMethod] 
public void PlainTextTest() 
{ 
    SerializationTestHelper<PlainTextSerialize>(); 
} 
1

我傾向於避免測試類之間的任何關係。我喜歡將測試用例(或類)保持原子化。這裏使用繼承的好處並不等於你獲得的強大耦合。

我想這將是有益的,如果你能分享這兩個類(假設黑箱測試)的結果的驗證。如果兩個類都可以讓你設置一個輸出流,你可以驗證,而這些類本身寫入PrintWriter或FileWriter(或者你需要的任何東西)。

而且我會避免在單元測試中創建文件,因爲它可能會花費太多時間(+它可能不是構建機器上工作),因此耽誤您的構建。

+0

確實非常有效,但將它們完全分開意味着像1000行(接近)相同的代碼。當更新兩個測試時,更改界面或它的工作原理似乎有點像一堆蠕蟲。但是也許你是對的,也許這就是當你用相似的邏輯寫兩個類時得到的東西。 – Mizipzor 2009-11-16 14:59:45

+0

而且你在編寫測試之前編寫了課程* 也許這會教你一個教訓。 ; -----) – pimpf0r 2009-11-16 15:50:55