0

私はここで新しいです、みなさん、こんにちは。私はすでにこれに関するいくつかの情報を探しましたが、何も見つかりませんでしたが、私が見逃しているのは単純なことだと確信しています。リンクリスト番号を使用して算術演算を実行する、テストしようとしている単純なプログラムがあります。私のテストケースはランダムなint値を生成し、プリミティブな加算、減算、乗算を使用して答えをチェックします。私が今見ている問題は、テストを繰り返し実行すると、プリミティブ演算が誤った結果を返すことですが、リンクリストの数値演算は正しいです。junitテストケースを繰り返し実行する間にクリーンアップされない変数がメモリ内にある可能性はありますか?正しく動作する場合と動作しない場合があります。

ところで、私はEclipseとJUnit4を使用しています。これが私のテストコードです。助けてくれてありがとう!

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);
}
}

プリミティブ減算の誤った結果を示すサンプル出力は次のとおりです。

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
4

1 に答える 1

2

数値がオーバーフローしているという事実に加えて、JUnit のParameterizedクラスを調べて、このようなテストを実行することをお勧めします。そうすれば、乱数のペアのリストを生成し、加算と減算の両方のテストに使用できます。また、テストの数を簡単に変更して、単一のエラーではなく個別のエラーを発生させることもできます。

@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.

}
于 2013-03-14T15:53:31.483 に答える