Параметризация как класса, так и тестов в JUnit 5

Есть ли способ параметризации обоих тестовых классов (как вы могли бы сделать с Parameterized а также @Parameters в JUnit 4) и методы тестирования (как вы могли бы сделать с JUnitParams в JUnit 4 или с @ParameterizedTest в Юнит 5)? Мне нужно получить декартово произведение параметров в конце.

В TestNG я бы сделал следующее:

public class ExampleTest {

    private final String classParameter;

    @Factory(dataProvider = "classParameters")
    public ExampleTest(String classParameter) {
        this.classParameter = classParameter;
    }

    @DataProvider
    public static Object[][] classParameters() {
        return new Object[][] {
                {"classParam1"},
                {"classParam2"},
        };
    }

    @Test(dataProvider = "testParameters")
    public void test(String testParameter) {
        System.out.println(classParameter + " " + testParameter);
    }

    @DataProvider
    public static Object[][] testParameters() {
        return new Object[][] {
                {"testParam1"},
                {"testParam2"},
        };
    }

}

Это производит:

classParam1 testParam1
classParam1 testParam2
classParam2 testParam1
classParam2 testParam2

Мы думаем о переходе на JUnit 5 из TestNG, но мы часто используем такие вещи. Один примечательный пример - для тестирования различных процессоров двоичных данных, где конструктор теста будет принимать аргумент порядка байтов / битов, и мы запускаем каждый тест как для Big Endian, так и для Little Endian.

Я думал о создании расширения для этого, а затем использовать ExtendWith, но, может быть, есть существующее расширение или что-то, что работает из коробки, что я пропустил?

0 ответов

Вы можете объединить несколько источников, например, в @MethodSource, Основываясь на вашем примере TestNG:

class ExampleTest {

    @ParameterizedTest
    @MethodSource("args")
    void test(String classParameter, String testParameter) {
        System.out.println(classParameter + " " + testParameter);
    }

    static Stream<Arguments> args() {
        return classParameters().flatMap(
                classParameter -> testParameters().map(
                        testParameter -> Arguments.of(classParameter, testParameter)));
    }

    static Stream<String> classParameters() {
        return Stream.of("classParam1", "classParam2");
    }

    static Stream<String> testParameters() {
        return Stream.of("testParam1", "testParam2");
    }

}

Это производит:

classParam1 testParam1
classParam1 testParam2
classParam2 testParam1
classParam2 testParam2

РЕДАКТИРОВАТЬ: ОП запросил "пример по крайней мере с двумя методами испытаний с различным набором параметров":

class ExampleTest {

    static Stream<String> classParams() {
        return Stream.of("classParam1", "classParam2", "classParam3");
    }

    static Stream<Arguments> withClassParams(List<?> methodParams) {
        return classParams().flatMap(
                classParam -> methodParams.stream().map(
                        methodParam -> Arguments.of(classParam, methodParam)));
    }

    @ParameterizedTest
    @MethodSource
    void booleanParams(String classParam, boolean booleanParam) {
        System.out.println(classParam + " " + booleanParam);
    }

    static Stream<Arguments> booleanParams() {
        return withClassParams(List.of(false, true));
    }

    @ParameterizedTest
    @MethodSource
    void integerParams(String classParam, int integerParam) {
        System.out.println(classParam + " " + integerParam);
    }

    static Stream<Arguments> integerParams() {
        return withClassParams(List.of(1, 2, 3, 4, 5, 6));
    }

    @ParameterizedTest
    @MethodSource
    void objectParams(String classParam, Object objectParam) {
        System.out.println(classParam + " " + objectParam);
    }

    static Stream<Arguments> objectParams() {
        return withClassParams(List.of(new Object()));
    }

}

3 параметра класса плюс 3 различных параметра метода с различными типами и размерами, что дает следующий результат:

classParam1 java.lang.Object@35cabb2a
classParam2 java.lang.Object@35cabb2a
classParam3 java.lang.Object@35cabb2a
classParam1 1
classParam1 2
classParam1 3
classParam1 4
classParam1 5
classParam1 6
classParam2 1
classParam2 2
classParam2 3
classParam2 4
classParam2 5
classParam2 6
classParam3 1
classParam3 2
classParam3 3
classParam3 4
classParam3 5
classParam3 6
classParam1 false
classParam1 true
classParam2 false
classParam2 true
classParam3 false
classParam3 true
Другие вопросы по тегам