[英]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
的成員變量數量成比例地增加,因此如何可靠地為所有可能的路徑編寫測試?
現在,我有兩個簡單的測試用例:
assertFalse(is_complete(foo))
assertTrue(is_complete(foo))
但是我感覺這可能還不夠。
我不確定使用MxN
路徑意味着什么。 在發布的代碼中,路徑的數量與字段+ 1相同。
創建一個輔助方法,該方法創建一個完整的profile
並傳遞is_complete
。
添加一個測試方法來驗證is_complete(profile)
是否為True
完整profile
。
為每個字段添加一種測試方法,包括以下步驟:
is_complete
is_complete
返回False
您將擁有與字段+ 1一樣多的測試方法。
順便說一句,代替這個:
if profile.first_name in (None, ''):
您可以寫得更簡單:
if not profile.first_name:
您可以使用隨機測試:
我只能使用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.