Тест с разными параметрами

У меня есть следующие сценарии для тестирования. Я хотел бы знать, какая среда тестирования лучше всего соответствует моему требованию.

Сценарий 1) Параметр1, Параметр2, Параметр3, Параметр4, Параметр5

Я передам вышеуказанные параметры с параметром Number 1, 2, 3.. до 20.

Для каждого числа (от 1 до 20) будет создан файл, который является тестовыми выходными данными. Эти выходные данные мне нужно сравнить с ожидаемыми данными (которые также являются файлом), и в соответствии с результатом будет сгенерировано значение True, если оба файла (тестовый выходной файл и файл ожидаемых данных) одинаковы, и false в противном случае.

Входные данные для теста следующие: Param1, Param2, Param3, Param4, Param5, Number, Expected Data File (с которым будут сравниваться выходные данные теста)

Сценарий 2) param1, param2, param3, param4, param5

Здесь вышеуказанным переменным будут присвоены разные значения, и снова они будут переданы в тест 20 раз, и каждый раз будет генерироваться другой тестовый выходной файл (всего 20 выходных файлов), а затем они будут сравниваться с ожидаемым файлом данных. (также есть 20 файлов для ожидаемых данных.)

У меня таких 15 сценариев. какой тестовый фреймворк здесь лучше всего подойдет? подойдет ли параметризованный Junit? Также предоставьте некоторые рекомендации, чтобы использовать рекомендуемую структуру.


person Ragini    schedule 19.01.2018    source источник
comment
проверьте Spock (на основе groovy) Тестирование на основе данных — намного лучше, чем JUnit spock/docs/1.1/data_driven_testing.html   -  person Maddy    schedule 19.01.2018
comment
Я думаю, что @Parameterized бегун JUnit также может удовлетворить ваши потребности.   -  person Stefan Birkner    schedule 19.01.2018


Ответы (3)


В качестве примера теста Спока, где все параметры и числа могут быть разными:

@Unroll
def "scenario with different parameters"() {
    given:
    def service = new MyService()

    when:
    def actualDataFile = service.doSomething(param1, param2, param3, param4, param5, number)

    then:
    readFileAsString(actualDataFile) == readFileAsString(expectedDataFileName)

    where:
    param1 | param2 | param3 | param4 | param5 | number | expectedDataFileName
    'any'  | 'aaa'  | 'any'  | 'any'  | 'any'  | 1      | 'expectedA.txt'
    'any'  | 'aay'  | '0ny'  | 'any'  | 'any'  | 2      | 'expectedB.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 3      | 'expectedC.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 4      | 'expectedD.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 5      | 'expectedE.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 6      | 'expectedF.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 7      | 'expectedG.txt'
    'any'  | 'ady'  | '3ny'  | 'a__'  | 'a3y'  | 8      | 'expectedH.txt'
    // etc
}
person Dmytro Maslenko    schedule 20.01.2018

1. Какая тестовая среда лучше всего подходит для этого?
Ответ: Параметризованный класс

2.Подойдет ли параметризованный Junit?
Ответ: Да, вы правы.

3.Пожалуйста, предоставьте некоторые рекомендации, чтобы использовать рекомендуемую структуру.
Ответ: для утверждения фактического и ожидаемого результата.
Предположим, вы хотите проверить содержимое файла char с помощью char , вы можете использовать FileUtils.contentEquals(file1, file2) commons apache io

Давайте посмотрим на этот пример:

public class Calc{

    public static int add(int a, int b) {
        return a + b;
    }

}

Юнит

@RunWith(value = Parameterized.class)
public class ParameterizedTest {

    private int numberA;
    private int numberB;
    private int expected;

    // Inject via constructor
    // for {8, 2, 10}, numberA = 8, numberB = 2, expected = 10
    public ParameterizedTest(int numberA, int numberB, int expected) {
        this.numberA = numberA;
        this.numberB = numberB;
        this.expected = expected;
    }

    // name attribute is optional, provide an unique name for test
    // multiple parameters, uses Collection<Object[]>
    @Parameters(name = "{index}: testAdd({0}+{1}) = {2}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {1, 1, 2},
                {2, 2, 4},
                {8, 2, 10},
                {4, 5, 9},
                {5, 5, 10}
        });
    }

    @Test
    public void test_addTwoNumbes() {
        assertThat(Calc.add(numberA, numberB), is(expected));
    }

}

Справочник

person VeKe    schedule 20.01.2018

Комбинируя параметризованные тесты Junit с парсингом YAML, я могу создавать удобочитаемые таблицы параметров. Каждая строка таблицы будет преобразована в карту, а каждое значение будет проанализировано с помощью синтаксического анализатора yaml. Таким образом, каждая карта содержит типизированные экземпляры. Даже списки, как в этом случае.

@RunWith(Parameterized.class)
public class AnotherParameterizedTest {

    private final HashMap row;

    @Parameterized.Parameters(name="Reverse Lists Tests # {index}:")
    public static List<Map<String, Object>> data() {
        final TestData testData = new TestData(""+
             "|   ID   |       List         |  Expected   |                \n"+
             "|   0    |    [1, 2, 3]       |  [3, 2, 1]  |                \n"+
             "|   1    |    [2, 3, 5]       |  [5, 3, 2]  |                \n"+
             "|   2    |    [5, 6, 7]       |  [ 7, 6, 5] |                \n"
        );
        // parsing each row using simple YAML parser and create map per row
        return testData.getDataTable();
    }

    public AnotherParameterizedTest(HashMap obj) {
        this.row = obj;
    }

    @Test
    public void test() throws Exception {
        List orgListReversed = new ArrayList((List) row.get("List"));
        Collections.reverse(orgListReversed);
        assertEquals((List) row.get("Expected"), orgListReversed);
    }

}

Результаты тестирования Junit

person Dieter    schedule 10.07.2018