簡體   English   中英

如何用N個不同的路徑測試功能?

[英]How to test a function with N distinct paths?

我有一個驗證模型類的函數,在該模型類中,它必須檢查類的每個成員(如果為String)為非空或非空。

這個is_complete函數的邏輯是這樣的:

def is_complete(profile):
    if profile.first_name in (None, ''):
        return False
    elif profile.last_name in (None, ''):
        return False
    elif profile.dob is None:
        return False
    .
    .
    .# and checks so on for all members of the profile instance
    .
    .

    return True

我的問題是,由於執行可能采用的可能路徑數量很大,並且與要檢查的profile的成員變量數量成比例地增加,因此如何可靠地為所有可能的路徑編寫測試?

現在,我有兩個簡單的測試用例:

  1. 僅設置一些成員並檢查assertFalse(is_complete(foo))
  2. 設置所有成員並檢查assertTrue(is_complete(foo))

但是我感覺這可能還不夠。

我不確定使用MxN路徑意味着什么。 在發布的代碼中,路徑的數量與字段+ 1相同。

創建一個輔助方法,該方法創建一個完整的profile並傳遞is_complete

添加一個測試方法來驗證is_complete(profile)是否為True完整profile

為每個字段添加一種測試方法,包括以下步驟:

  • 調用helper方法以創建一個完整的配置文件,我們知道該配置文件將通過is_complete
  • 打破被測領域
  • 驗證is_complete返回False

您將擁有與字段+ 1一樣多的測試方法。

順便說一句,代替這個:

 if profile.first_name in (None, ''): 

您可以寫得更簡單:

if not profile.first_name:

您可以使用隨機測試:

  • 編寫一個函數,該函數創建一個隨機的Profile對象,並填充所有字段(可以是隨機的,但有效)。
  • 將一個或多個字段隨機更改為無或為空
  • 將對象傳遞給is_complete()函數。

我只能使用Qala Datagen在Java中顯示這一點 我假設您對否定路徑感興趣,因此它看起來像這樣:

@Test void profileIsNotComplete_ifAtLeastOneFieldIsBlank() {
    Profile p = Profile.random();
    callOneOrMore(
        () -> profile.setName(nullOrEmpty()),
        () -> profile.setLastName(nullOrEmpty()),
        ...);
    assertFalse(profile.isComplete();
}

請注意,該代碼實際上會測試更多-它還會檢查設置為null / empty的字段的組合。 如果在Python中沒有此類庫,則可以自己編寫一些實用程序方法。

注意 :每執行一次將僅測試一條路徑。 您可以運行多次(一千次?)以確保所有路徑都通過。 然后,在CI中,如果這不是關鍵任務功能,並且您不擔心它會經常中斷,則只能運行一次。

否則,如果您真的希望每次調用都覆蓋100%的代碼 ,則可以違反一些良好做法,並將所有這些測試組合為一個(否則,太多的測試會使閱讀它們變得復雜):

@Test void profileIsNotComplete_ifOneFieldIsBlank() {
    assertFalse(Profile.random().setName(null).isComplete());
    assertFalse(Profile.random().setName("").isComplete());

    assertFalse(Profile.random().setLastName(null).isComplete());
    assertFalse(Profile.random().setLastName("").isComplete());
    ...
}

雖然這不會測試組合,但是您可以組合兩種方法。 在這兩種方法中,肯定的情況都很容易:

@Test void profileIsComplete_ifAllFieldsAreFilled() {
    assertTrue(Profile.random());
}

更多關於隨機測試的信息在這里

暫無
暫無

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

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