2013-03-14 7 views
0

여기 New, 안녕하세요. 나는 이것에 관한 약간의 정보를 이미 둘러 보았고 아무 것도 찾지 못했다. 그러나 나는 그것이 빠져있는 것이 단순한 것이라고 확신한다. 산술 연산을하기 위해 연결된리스트 번호를 사용하는 테스트하려는 간단한 프로그램이 있습니다. 내 테스트 케이스는 무작위 int 값을 생성하고 프리미티브 덧셈, 뺄셈, 곱셈을 사용하여 답을 확인합니다. 지금보고있는 문제는 반복적으로 테스트를 실행하면 기본 연산이 잘못된 결과를 반환하지만 연결 목록 번호 산술이 올바른 것입니다. 반복 junit 테스트 케이스 실행 사이에 정리되지 않는 변수가 메모리에 존재할 수 있습니까? 때로는 제대로 작동하고 때로는 작동하지 않습니다.java junit 테스트 케이스가 일치하지 않습니다.

BTW Eclipse와 JUnit 4를 사용하고 있습니다. 여기에 내 테스트 코드가 있습니다. 어떤 도움을 주셔서 감사합니다!

The first number is -504267212 
The second number is 454054464 
The primitive sum is -50212748 
The Number sum is -50212748 

The first number is 1820929887 
The second number is -1488686395 
The primitive diff is -985351014 
The Number diff is 3309616282 
+0

Number 클래스의 문제를 나타내지 않으세요? –

+1

나는 btw 테스트에서 무작위로 생성 된 숫자를 사용하지 않을 것입니다. 문제를 추적하는 것이 매우 어렵습니다. 예 : 오버플로 조건을 유발하는 숫자의 조합을 가질 수 있으며 디버거에서 후속 실행에서 반복 할 수 없습니다. –

+0

안녕하세요, Brian, 논평 해 주셔서 감사합니다. 나는 그렇게 생각하지 않는다. 샘플 출력의 실패는 기본 java, i - j에 의해 수행되는 빼기 연산입니다. 제가 계산할 때, 1820929887 - (-1488686395) = 3309616282입니다. 이것은 Number 클래스가 나온 결과입니다. 1820929887 - (-1488686395) = -985351014 Java 계산 방법을 이해할 수 없습니다. 결과는 왼쪽 필드에서 완전히 벗어난 것처럼 보입니다. 그렇게 생각하지 않아? 다시 한번 감사드립니다. – user2170433

답변

2

당신의 숫자가 범람하고 있다는 사실 외에, 당신은 같은 테스트를 실행하는 JUnit을의 Parameterized 클래스에서 볼 수도 있습니다 :

import static org.junit.Assert.*; 
import java.util.Random; 

import org.junit.Test; 

public class NumberTest { 

@Test 
public void testRandomIntAddition1() { 
    Random generator = new Random(); 
    int i = generator.nextInt(); 
    int j = generator.nextInt(); 
    Number a = new Number(""+i); 
    Number b = new Number(""+j); 
    Number sum = a.add(b); 
    System.out.printf("The first number is %d\n", i); 
    System.out.printf("The second number is %d\n", j); 
    System.out.printf("The primative sum is %d\n", i + j); 
    System.out.printf("The Number sum is %s\n\n", sum.toString()); 
    assertEquals(sum.toString(),""+ (i+j)); 
} 

@Test 
public void testRandomIntSubtraction1() { 
    Random generator = new Random(); 
    int i = generator.nextInt(); 
    int j = generator.nextInt(); 
    int k = i - j; 
    Number a = new Number(""+i); 
    Number b = new Number(""+j); 
    Number diff = a.subtract(b); 
    System.out.printf("The first number is %d\n", i); 
    System.out.printf("The second number is %d\n", j); 
    System.out.printf("The primative diff is %d\n", k); 
    System.out.printf("The Number diff is %s\n\n", diff.toString()); 
    assertEquals(diff.toString(),"" + k); 
} 
} 

여기에 기본 공제에 대한 잘못된 결과를 보여줍니다 샘플 출력입니다 이. 그렇게하면 난수 쌍의 목록을 생성하고이를 더하기 및 빼기 테스트에 사용할 수 있습니다. 또한 테스트 수를 쉽게 변경하고 단일 테스트 대신 개별 테스트를 수행 할 수 있습니다.

@RunWith(Parameterized.class) 
public class NumberTest { 
    static int trials = 100; 
    static int MAX_VALUE = 1 << 30; // To prevent overflow 

    @Parameters 
    public static Collection<Object[]> randomVals() { 
     Random rnd = new Random();    
     List<Object[]> stuff = new LinkedList<>(); 
     for(int a = 0; a < trials; a++) { 
      stuff.add(new Object[] {rnd.nextInt(MAX_VALUE), rnd.nextInt(MAX_VALUE)}); 
     } 
     return stuff; 
    } 

    int i, j; 

    public Number(int i, int j) { 
     this.i = i; this.j = j;  
    } 

    // Your tests here, using i and j above. 

}