0

我正在创建一个 JUnit,它应该每次都生成一个随机大小的数组,其中包含随机整数。然后制作数组的副本,并将原始数组作为参数输入到我的合并排序数组中并进行排序,而数组的副本则使用该Arrays.sort()方法进行排序。然后比较这两个数组,看它们是否相同。

这是代码:

import java.util.Arrays;
import java.util.Random;
import static org.junit.Assert.assertArrayEquals;
import org.junit.Before;
import org.junit.Test;

public class Mergesort_3wayTest {

    private int[] toSort;
    private static int SIZE;
    private static int MAX;
    private static int tests = 20000;

    @Before
    public void setUp() throws Exception {
        Random generator = new Random();
        SIZE = generator.nextInt(30) + 1;
        MAX = generator.nextInt(30) + 1;
        toSort = new int[SIZE];
        for (int i = 0; i < toSort.length; i++) {
            toSort[i] = generator.nextInt(MAX);
        }
    }

    @Test
    public void itWorksRepeatably() {
        for (int i = 0; i < tests; i++) {
            System.out.println("1 - " + Arrays.toString(toSort));
            int[] sorted = new int[toSort.length];
            System.arraycopy(toSort, 0, sorted, 0, toSort.length);
            Arrays.sort(sorted);

            Mergesort_3way.mergesort(toSort);

            System.out.println("2 - " + Arrays.toString(toSort));

            assertArrayEquals(toSort, sorted);
        }
    }
}

我可以从println我插入的 's 中清楚地看到,只创建了一个数组,并且测试正在不断地检查那个数组,但我认为它每次都会创建一个随机数组,但显然不是这样。

所以我的问题是为什么只创建一个数组,我猜每次assertArrayEquals(toSort, sorted)运行它都会重新开始。

我相信它与全局变量有关,但我不太确定......

4

5 回答 5

2

在你的测试方法中循环。setup 方法将在您的测试方法之前调用一次,但它不会在每次循环迭代开始时自动运行。你希望它是怎样的?

每次从头开始运行测试时,它应该创建一个不同的随机数组,但是该测试运行中的 20000 次迭代将处理同一个数组,因为没有什么可以重新创建它。如果您希望在您的测试方法中发生某些事情,您需要自己编写。

于 2012-05-24T15:48:24.197 回答
1

toSort 数组仅填充一次。在 itWorksRepeatably 方法之前只执行一次的 setUp() 方法中。因此,itWorksRepeatably 方法使用相同的数组“测试”,即 20000 次。

您将需要移动生成数组的逻辑(即 setUp 方法中的代码在 itWorksRepeatably 方法中的 for 循环内,以便您每次看到不同的数组。

于 2012-05-24T15:51:15.647 回答
1

如果您希望此代码按照您预期的方式运行,请在您的setup函数中获取代码并将其转换为在每个循环开始时调用的新私有方法,如下所示:

private void magic()
{
Random generator = new Random();
        SIZE = generator.nextInt(30) + 1;
        MAX = generator.nextInt(30) + 1;
        toSort = new int[SIZE];
        for (int i = 0; i < toSort.length; i++) {
            toSort[i] = generator.nextInt(MAX);
        }

}

其次是:

@Test
    public void itWorksRepeatably() {
        for (int i = 0; i < tests; i++) {
           magic();  
           //rest of code  
}
}
于 2012-05-24T15:52:12.507 回答
0

不完全确定我理解......但在 JUnit 中,@Before 方法在每个 @Test 方法之前执行一次。如果您在 @Test 方法中循环,则不会调用 @Before。由于 @Before 方法是您使用随机值重新初始化数组的地方,因此每次测试仅创建一次。

此外,您无法通过 Arrays.toString() 确定数组创建,因为两个具有相同元素的数组将显示相同,即使它们是两个单独的数组。

于 2012-05-24T15:50:36.047 回答
0

您正在使用 @before 注释在 setUp 方法中创建一个随机数组,每个测试方法只会调用此设置方法一次。由于您只有一个测试方法,因此每次只创建和重用一个数组。移动代码以在测试方法中从设置创建随机数组到 for 循环。希望这可以帮助

于 2012-05-24T15:52:50.847 回答