簡體   English   中英

如何測試鏈表中的刪除元素?

[英]How to test remove element in linked list?

我在下面有一個鏈接列表:

在此處輸入圖片說明

如果我想使用以下代碼刪除元素:

 int a = list1.remove(0);

因此,應包括哪些驗證碼以確保此操作正常進行?

謝謝,希望能盡快收到您的答復。

說明

方法LinkedList#remove(int) 刪除 給定位置的元素(在您的情況下,索引為0 ,因此是第一個元素),這里是其文檔

刪除后,所有其他元素移到最前面 (索引1變為索引0 ,依此類推)。 注意:由於LinkedList的特性,因此無需支付額外費用。


測試

有多種可能性可以測試正確性(例如,對於JUnit Test):

  • 測試該方法是否完全刪除了某些內容
  • 測試方法是否刪除了正確的元素(第一個)
  • 測試其他所有元素是否都移到最前面(索引已更改)
  • 測試方法是否返回移除的元素(根據其文檔)
  • 測試該方法是否正確處理空列表(引發異常)
  • 測試如果該方法為null則該方法是否正確刪除了該元素

例子

這是上述所有情況的一些實現:

@Test
public void testSizeChange() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertEquals(5, list.size());
    list.remove(0);
    Assert.assertEquals(4, list.size());
}

@Test
public void testRemovedCorrectElement() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertTrue(list.contains(1));
    list.remove(0);
    Assert.assertFalse(list.contains(1));
}

@Test
public void testElementsMoved() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    list.remove(0);

    Iterator<Integer> iter = list.iterator();
    for (int i = 2; i <= 5; i++) {
        Assert.assertTrue(iter.hasNext());
        Assert.assertEquals(i, iter.next());
    }
    Assert.assertFalse(iter.hasNext());
}

@Test
public void testReturnRemovedValue() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertEquals(1, list.remove(0));
}

@Test(expected = IndexOutOfBoundsException.class)
public void testHandleEmpty() {
    LinkedList<Integer> list = new LinkedList<>();
    list.remove(0);
}

@Test
public void testRemoveNull() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(null, 2, 3, 4, 5));

    Assert.assertNull(list.remove(0));
}

請注意,如果您的LinkedList不是java.util.LinkedList而是一個自己的實現,則可能需要根據您的文檔和需要對后面的示例進行一些修改。

您應該在以下所有情況下測試您的操作:

  1. 驗證a是否有價值。
  2. 檢查get(-1)以確保導致索引超出范圍的異常。
  3. 檢查get(0)以返回值為21。
  4. 呼叫清單按大小檢查。

希望這會有所幫助。

您只需在鏈表上調用size方法即可對其進行測試。 然后對鏈表的預期大小進行斷言。

assertEquals(EXPECTED_SIZE, list1.size()) 

預期大小將是一個整數值,該值將比初始大小小1個值。

要斷言是否刪除了實際值,您可以斷言包含

assertFalse(list1.contains(65))

65是已刪除的實際值。

其他答案都是正確的-但仍可能創建通過所有這些特定測試的錯誤列表實現-但其中包含一些晦澀的錯誤。

在這種情況下,基於QuickCheck想法的測試框架具有一定的優點。 與其手動編寫各種測試用例,不如指定對QuickCheck進行操作必須符合的規則/合同。 然后,框架創建隨機測試-當它發現違反您的規則的內容時,甚至會將輸入減少到顯示問題所需的“最低”要求。

我並不是說QuickCheck是這里的“更好”解決方案-但這絕對是其他答案所指向的測試類型的良好伴侶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM