2

TL;DR突然変異は殺されるべきだと思いますが、生き残りました。それが起こっている理由と、次の 2 つのことを修正する方法を探しています: (1) タイムアウト (2) 突然変異が生き残った。

詳細springWeb アプリケーションがあり、を使用してテストしてtestngいます。コードの関連部分を抽出しました。この質問のコードを抽出する際に問題が発生した場合は、申し訳ありません。callFunction が 8 回呼び出されることを検証する合格テスト ケースがあります。これは piTest レポートを使用して検証されverify(a, atLeast(8)).called();ます.callFunctiona.called();

ソースから削除callFunctionして確認しましたが、テスト ケースは失敗します。セクションModified1 Rat.javaを参照してください。

また、を削除して確認しましたがforEach、テスト ケースは失敗します。Modified2 を参照してくださいRat.java

Modified3セクションにRat.java示されているように、テキストの (書式設定) 場所のみを変更すると、レポートが変更されたというさらに興味深いことがあります。 Rat.javapiTest

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 

);
4

1 に答える 1