2016-07-27 22 views
2

我們只是在玩變異測試,有一件事我不明白。爲什麼它總是嘗試應用了「否定的條件賦值函數」在我的for-each循環像這樣的:突變測試 - 在for-each循環上否定條件?

for (final Order order : orders) 

如果我看一看的突變(http://pitest.org/quickstart/mutators/#NEGATE_CONDITIONALS)的描述,那麼它應該只是變異如!===<>=。所以我不太明白爲什麼在那裏使用它,爲什麼它有時會失敗,有時不會。

請問有人可以向我解釋一下嗎?

+0

它取決於'orders'是一個數組還是一個迭代?在後一種情況下,沒有二元運算符可以否定。 –

+0

訂單是一個名單<> – Feroc

回答

3

這是PIT突變字節碼而不是源的結果。

的每個循環中的字節碼看起來像

INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; 
ASTORE 2 
L2 
ALOAD 2 
INVOKEINTERFACE java/util/Iterator.hasNext()Z 
IFEQ L3 
ALOAD 2 
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object; 
<contents of the loop> 
GOTO L2 
L3 

所以基本上在幕後是創建一個迭代器和檢查hasNext的價值。雖然它是真的,但它通過跳到L2來執行循環。

條件變化是IFEQ L3調用,它檢查hasNext的返回碼以退出循環。

如果PIT可以檢測由每個循環產生的條件語句,那將會很好。我不確定我是否曾經看過這種特殊情況,但通常區分語言特性產生的字節碼和直接映射回開發人員編寫的代碼的字節碼要麼是困難的,要麼是不可能的。

更新 - 自1.2.5 pitest應該避免突變每個循環的條件。

+0

在這裏也謝謝。 :) – Feroc