如何继承测试以避免在定义测试数据时出现冗余?

时间:2012-08-30 10:21:55

标签: java unit-testing junit

最初,我编写了一个类(我称之为RangeSet),它以ArrayList个间隔运行(由我定义的间隔类为两个Long值)。该列表是间隔的集合,有一个void add(Range range)方法,用于检查列表中已有间隔是否存在重叠,覆盖,包含或邻接。重点是保持非重叠间隔列表。

我为该课程设计并编写了大量测试,检查可能发生的各种情况。 这就是我所说的很多代码。

现在事实证明(无论出于什么原因)我必须将该类拆分为两个单独的类 - RangeSet将是一个抽象类,其中包含一些有用的方法并从中继承 - ArrayRangeSet (持有ArrayList)和TreeRangeSet中的区间集合(将区间集合保存在TreeSet中)。 add(Range range)方法的实现在这两者之间存在很大差异。

如何继承测试以避免在定义测试数据时出现冗余?

示例测试如下所示:

@Test
void testCase4(){
    RangeSet set = new RangeSet();
    Range r1 = new Range(4, 5);
    Range r2 = new Range(13, 15);
    Range r3 = new Range(19, 22);
    set.add(r1);
    set.add(r2);
    set.add(r3);

    Range testRange = new Range(11,100);
    set.add(testRange);

    assertEquals(2,set.iterator().size());
    assertEquals(new Range(4,5),set.iterator().getAt(0));
    assertEquals(new Range(11,100),set.iterator().getAt(1));
}

我不知道我是否清楚:有很多测试数据定义,这两个类的测试看起来是一样的。我该如何解决?

编辑:有没有办法将这些断言语句传递给继承的测试类?毕竟,那些add方法应该实现相同的目标,尽管是通过不同的操作。

3 个答案:

答案 0 :(得分:1)

您可以使用夹具方法,例如JUnit @Before。或者您可以将其保存在单独的fixture class中。或者您可能希望将其保存在属性文件中,如果它适合那里。我的意思是有多种选择。

这种夹具对我来说听起来不像是父母。我的意思是夹具和测试类之间没有is a关系。顺便说一句,让基类处理两个测试类之间的共性是没有害处的。如果您决定使用基类,则可以使用setup或说/@Before方法,在单个位置准备数据。

答案 1 :(得分:0)

将共享测试数据放入一个不可变的常量类,如RangeSetTestData,保存测试运行所需的所有内容。针对RangeSetTreeRangeSetArrayRangeSet实施三项测试,根据常量测试数据测试功能。

编辑:这样您就不必处理任何属性文件/测试资源的序列化和反序列化,并且常量测试数据类可以很好地维护。

答案 2 :(得分:0)

我会为RangeSet编写一个测试类,它提供测试数据并让ArrayRangeSetTreeRangeSet的测试继承。如果您提供了在基本测试中创建ArrayRangeSetTreeRangeSet实例的机制(例如抽象的“工厂”方法),则可以将所有应该具有相同行为的方法的测试放在一起在两个班级进入基础考试。测试类ArrayRangeSetTreeRangeSet仅包含“特定”方法的测试。