我正在创建一个 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
中清楚地看到只创建了一个数组,并且测试一直在运行检查该数组,但我认为每次都会创建一个随机数组,但显然并非如此。
所以我的问题是为什么只创建一个数组,我猜每次assertArrayEquals(toSort, sorted)
运行时都会重新开始。
我相信这与全局变量有关,但我不太确定......
你在测试方法中循环。设置方法将在测试方法之前调用一次,但不会在每次循环迭代开始时自动运行。你期望它是什么?
每次从头开始运行测试时,它都应该创建一个不同的随机数组,但是该测试运行中的 20000 次迭代都将处理相同的数组,因为没有任何东西可以重新创建它。如果你想在你的测试方法中发生一些事情,你需要自己编写。
如果您希望此代码按预期方式运行,请在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
}
}
toSort 数组只填充一次。在 setUp() 方法中,该方法仅在 itWorksRepeatably 方法之前执行一次。因此,itWorksRepeatably 方法使用相同的数组"测试",即 20000 次。
您将需要移动生成数组的逻辑(即 setUp 方法中的代码位于 itWorksRepeatly 方法的 for 循环中,以便您每次都能看到不同的数组。
不完全确定我是否理解...但在 JUnit 中,@Before 方法在每个@Test方法之前执行一次。如果在 @Test 方法中进行循环,则不会调用 @Before。由于 @Before 方法是使用随机值重新初始化数组的地方,因此每个测试仅创建一次。
此外,您不能通过 Arrays.toString() 确定数组的创建,因为具有相同元素的两个数组将显示相同的内容,即使它们是两个单独的数组。
您正在使用@before注释在 setUp 方法中创建随机数组,每个测试方法只会调用一次此设置方法。由于您只有一个测试方法,因此每次只创建一个数组并重复使用。移动代码以在测试方法中从设置创建随机数组到 for 循环。希望这有帮助