将一个测试应用于两个单独的类

时间:2009-11-16 10:04:49

标签: c# java unit-testing design-patterns junit

我有两个不同的类共享一个公共接口。虽然功能相同但内部工作方式却截然不同。所以我很自然地想要测试它们。

  

我能想到的最好的例子;一世   序列化某个文件,一个   class将其序列化为纯文本   另外xml。数据(应该)看起来   之前和之后相同   序列化无论方法如何   使用

以同样的方式测试这两个类的最佳方法是什么?测试仅在实例化不同类的方式上有所不同。我不想复制整个测试,重命名并更改一行。

测试目前在JUnit中,但我还是要将它们移植到NUnit,因此代码并不重要。我正在寻找适用于此测试套件的设计模式。

4 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分: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() }
}

这不是完全正确的OO设计,因为TextImplementationTest不是XmlImplementationTest。但通常你不需要关心它。

或者readdress测试方法调用一些常见的实用程序类。这将涉及更多代码,而不是在测试报告中显示正确的测试类,但可能更容易调试。

答案 2 :(得分:1)

我倾向于避免测试类之间的任何关系。我喜欢尽可能保持测试用例(或类)的原子性。在这里使用继承的好处并没有超过你通过它获得的强耦合。

我想如果你可以分享两个类的结果验证(假设blackbox测试)会有所帮助。如果这两个类都能够让你设置一个输出流,那么你可以验证这一点,而类本身会写入PrintWriter或FileWriter(或者你需要的任何内容)。

此外,我会避免在单元测试期间创建文件,因为它可能需要花费太多时间(+它可能无法在构建计算机上运行),因此会延迟构建。

答案 3 :(得分: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>();
}