2009-11-16 36 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