TL;DR突然変異は殺されるべきだと思いますが、生き残りました。それが起こっている理由と、次の 2 つのことを修正する方法を探しています: (1) タイムアウト (2) 突然変異が生き残った。
詳細spring
Web アプリケーションがあり、を使用してテストしてtestng
います。コードの関連部分を抽出しました。この質問のコードを抽出する際に問題が発生した場合は、申し訳ありません。callFunction が 8 回呼び出されることを検証する合格テスト ケースがあります。これは piTest レポートを使用して検証されverify(a, atLeast(8)).called();
ます.callFunction
a.called();
ソースから削除callFunction
して確認しましたが、テスト ケースは失敗します。セクションModified1 Rat.java
を参照してください。
また、を削除して確認しましたがforEach
、テスト ケースは失敗します。Modified2 を参照してくださいRat.java
。
Modified3セクションにRat.java
示されているように、テキストの (書式設定) 場所のみを変更すると、レポートが変更されたというさらに興味深いことがあります。 Rat.java
piTest
Type.java
package lab.rat;
public class Type {
}
アクション.java
package lab.rat;
import org.springframework.stereotype.Component;
@Component public class Action {
public void called() {}
}
Rat.java
package lab.rat;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component public class Rat {
@Autowired private Action a;
public void testee() {
Map<Type, Integer> properties = new HashMap<>();
IntStream
.range(0, 8)
.forEach(index -> properties.put(new Type(), index));
properties
.entrySet()
.stream()
通知フォローライン
.forEach(entry -> callFunction()); // removed call to lab/rat/Rat::callFunction ? TIMED_OUT
// removed call to java/util/stream/Stream::forEach ? SURVIVED
}
private void callFunction() {
a.called();
}
}
RatTest.java
package lab.rat;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import lab.rat.config.SpringConfigurationForTest;
public class RatTest extends SpringConfigurationForTest {
@InjectMocks Rat rat;
@Mock Action a;
@BeforeMethod public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test public void testTestee() {
rat.testee();
verify(a, atLeast(8)).called();
}
}
Modified1 Rat.java -- テスト失敗
.stream()
.forEach(entry -> {});
Modified2 Rat.java -- テスト失敗
.stream();
Modified3 Rat.java -- もう 1 つのミューテーションが作成されました
.stream()
.forEach( // removed call to java/util/stream/Stream::forEach ? SURVIVED
// removed call to lab/rat/Rat::callFunction ? TIMED_OUT
entry -> callFunction() // replaced return of integer sized value with (x == 0 ? 1 : 0) ? KILLED
);