2016-07-27 2 views
2

우리는 단지 돌연변이 테스트로 조금 놀고 있으며 이해할 수없는 한가지가 있습니다.돌연변이 테스트 - for-each 루프에서 조건부를 부정합니다?

for (final Order order : orders) 

내가 뮤 테이터 (http://pitest.org/quickstart/mutators/#NEGATE_CONDITIONALS)의 설명을 살펴 경우, 그냥 변이한다 : 왜 항상이 같은 내를위한 각 루프에서 "부정적인 (negated) 조건부 뮤 테이터"를 적용하려고 != ~ == 또는 < ~ >=과 같은 조건. 그래서 나는 왜 그것이 그곳에서 사용되는지, 왜 때때로 실패하고 때로는 이해하지 않는지 이해하지 못합니다.

누군가 나에게 설명해 주시겠습니까?

+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