gpt4 book ai didi

java - 测试场景分离

转载 作者:行者123 更新时间:2023-11-30 03:43:22 24 4
gpt4 key购买 nike

@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(用于学习 JUnit),在上面的 JUnit 中我正在测试三件事

  1. 列表被修改(assertNotNull(“未添加对象”,添加))
  2. 能够获取第一个数据(不为空)
  3. 已添加数据,正在尝试获取它并使用传递的数据进行验证。

此 Junit 可能会因三个不同的原因而失败。这是正确的写作方法吗?请您提出更好的方法

最佳答案

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

enter image description here

首先看一下你要测试的方法的javadoc。这是契约(Contract),测试应始终确保该契约(Contract)得到履行。

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

Appends the specified element to the end of this list (optional operation).

Lists that support this operation may place limitations on what elements may be added to this list. In particular, some lists will refuse to add null elements, and others will impose restrictions on the type of elements that may be added. List classes should clearly specify in their documentation any restrictions on what elements may be added.

Returns true if this collection changed as a result of the call

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

Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including 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,而 AbstractListTest 扩展了 AbstractCollectionTest。您可以将每个接口(interface)的测试方面放在适当的抽象测试类中。

关于java - 测试场景分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com