【问题标题】:Testing scenario separation测试场景分离
【发布时间】:2014-10-12 08:14:11
【问题描述】:
@Test
public void addElemenInEmptyList() {
    List<Integer> list = new LinkedList<Integer>();
    int data = 122;
    boolean added = list.add(data);
    assertNotNull("Object not added", added);

    Integer addObj = list.get(0);
    assertNotNull("Object not found", addObj);
    Assert.assertEquals("Fetched value is different", data, addObj.intValue());
}

我已经编写了一个小的 JUnit 测试来测试 Java 的 LinkList(用于学习 JUnits),在上面的 JUnit 中我正在测试三个东西

  1. 列表被修改(assertNotNull("Object not added", added))
  2. 能够获取第一个数据(非空)
  3. 已添加数据,尝试获取它并使用传递的数据对其进行验证。

这个 Junit 可能由于三种不同的原因而失败。这是编写它的正确方法吗? 请您建议任何更好的方法

【问题讨论】:

    标签: java unit-testing junit4


    【解决方案1】:

    我建议拆分方法。我将在一个测试方法中测试方法 api 的各个方面。我会这样做,因为你会从你的测试中得到关于什么有效和什么失败的清晰反馈。例如

    首先看一下你要测试的方法的javadoc。这是合同,测试应始终确保合同得到履行。

    例如List.add(E element) javadoc 说:

    将指定元素附加到此列表的末尾(可选操作)。

    支持此操作的列表可能会限制可以添加到此列表的元素。特别是,一些列表会拒绝添加空元素,而另一些列表则会对可能添加的元素类型施加限制。列表类应在其文档中明确指定对可以添加哪些元素的任何限制。

    如果此集合因调用而更改,则返回 true

    List.add(E element) javadoc 还说此方法的某些方面是由实现定义的。例如,LinkedList javadoc 说

    List 和 Deque 接口的双向链表实现。实现所有可选的列表操作,并允许所有元素(包括 null)。

    因此 add 方法的测试应该涵盖这些方面:

    • null 允许添加值
    • add 将元素追加到列表末尾
    • 如果列表发生变化,则返回true

    所以我的第一个测试实现应该是这样的

    public class LinkedListTest {
    
        /**
         * adding <code>null</code> must be possible.
         */
        @Test
        public void addNullElement() {
            LinkedList<Integer> list = new LinkedList<Integer>();
    
            boolean added = list.add(null);
            assertTrue("expected that null was added", added);
        }
    
        /**
         * adding a not <code>null</code> element must return <code>true</code>.
         */
        @Test
        public void addNotNullElement() {
            LinkedList<Integer> list = new LinkedList<Integer>();
    
            boolean added = list.add(Integer.valueOf(1));
            assertTrue("expected that element was added", added);
        }
    
        /**
         * add must append element to the end of the list
         */
        @Test
        public void addElementToTheEndOfTheList() {
            LinkedList<Integer> list = new LinkedList<Integer>();
            list.add(1);
            list.add(2);
    
            Integer firstElement = list.get(0);
            assertEquals("expected first element to be 1", Integer.valueOf(1),
                    firstElement);
    
            Integer secondElement = list.get(1);
            assertEquals("expected first element to be 2", Integer.valueOf(2),
                    secondElement);
        }
    
    }
    

    但还有更多。 List.add(E element) 扩展了 Collection.add(E element),因为 List 扩展了 Collection。因此,您还必须考虑Collection.add(E element) javadoc。它可能会增加其他方面。尽管如此,您也可以构建测试的层次结构来涵盖这一点。例如。 LinkedListTest 扩展 AbstractListTest 扩展 AbstractCollectionTest。您可以将每个接口的测试方面放在适当的抽象测试类中。

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2018-03-10
      相关资源
      最近更新 更多