0

我是新来的,大家好。我已经四处寻找有关此的一些信息,但没有找到任何东西,但我确信这是我缺少的一些简单的东西。我有一个简单的程序,我正在尝试测试它使用链表数字来执行算术。我的测试用例生成随机 int 值并使用原始加法、减法、乘法检查答案。我现在看到的问题是,当我重复运行测试时,原始操作返回不正确的结果,但我的链表数算术是正确的。内存中是否有可能在重复 junit 测试用例运行之间没有被清理的变量?有时它可以正常工作,有时却不能。

顺便说一句,我正在使用 Eclipse 和 JUnit 4。这是我的测试代码。谢谢你的帮助!

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 回答