首页 > 解决方案 > JUnit 参数化 @BeforeAll

问题描述

我是JUnit的初学者,在学习的时候遇到了问题。我做了很多搜索,但仍然找不到答案。

我使用的 JUnit Jupiter 版本是 5.3.0-M1。


我正在对一些排序算法进行测试。我想测试它们是否正确,以及不同长度的不同数组的性能。这是我的解决方案。

@BeforeAll
生成了一个随机的未排序数组source,以及一个target已排序的数组。

@BeforeEach
将未排序的内容复制source到一个新数组以inputs供测试。

每个@Test 方法都会对inputs数组进行排序并将其与 进行比较target,因此我知道它是否正确,IDE 会告诉我它花费了多少时间。


问题length是:我每次都必须手动更改,然后再次测试。

我想知道是否有办法设置测试,所以它会针对我设置的每个不同长度运行。
例如,传递一个像 [16, 32, 64, ...] 这样的数组作为我想要测试的不同长度。

我知道我可以将参数传递给@Test 方法,但是我必须在每个@Test 中生成source多次target

(对不起我的英语不好,我希望我已经足够清楚地解释了这个问题。)

这是我的测试类的样子:

class SortingTest {

    static int length = 512;    // manually change every time.
//  static int length = 1024;
//  static int length = 2048;
//  static int length = 4096;

    static int[] source;
    static int[] target;
    static int[] inputs;

    @BeforeAll
    static void beforeAllSort() {
        source = MintArray.generateIntArray(length);
        target = new int[length];
        inputs = new int[length];
        System.arraycopy(source, 0, target, 0, source.length);
        Arrays.sort(target);
        System.out.println("[SORT] Array Length : [" + length + "]");
        System.out.println("[SORT] Source Array : " + Arrays.toString(source));
        System.out.println("[SORT] Target Array : " + Arrays.toString(target));
    }

    @BeforeEach
    void beforeEachSort() {
        System.arraycopy(source, 0, inputs, 0, source.length);
        System.out.println();
    }

    @Test
    @DisplayName("Bubble Sort")
    void bubbleSort() {
        System.out.println("[SORT] Bubble Sort");
        inputs = new BubbleSort().bubbleSort(inputs);
        assertArrayEquals(inputs, target);
    }

    @Test
    @DisplayName("Insertion Sort")
    void insertionSort() {
        System.out.println("[SORT] Insertion Sort");
        inputs = new InsertionSort().insertionSort(inputs);
        assertArrayEquals(inputs, target);
    }

    @Test
    .......more sort
}

标签: unit-testingtestingjunitjunit5

解决方案


推荐阅读