Подтвердить что ты не робот

Написание тестов Java с поставщиками данных

В настоящее время я делаю свой первый проект Java и люблю полностью его TDD. Я использую JUnit для написания тестов. По-видимому, JUnit не предоставляет поддержку поставщикам данных, что делает его довольно раздражающим для тестирования того же метода с 20 различными версиями аргумента. Какой самый популярный/стандартный инструмент тестирования для Java, который поддерживает поставщиков данных? Я наткнулся на TestNG, но понятия не имею, насколько популярен этот, или как он сравнивается с альтернативами.

Если есть способ получить это поведение, это хороший способ использования JUnit, тогда это также может работать.

4b9b3361

Ответ 1

JUnit 4 имеет параметризованный тест, который делает то же самое, что и поставщики данных php

@RunWith(Parameterized.class)
public class MyTest{ 
     @Parameters
    public static Collection<Object[]> data() {
           /*create and return a Collection
             of Objects arrays here. 
             Each element in each array is 
             a parameter to your constructor.
            */

    }

    private int a,b,c;


    public MyTest(int a, int b, int c) {
            this.a= a;
            this.b = b;
            this.c = c;
    }

    @Test
    public void test() {
          //do your test with a,b
    }

    @Test
    public void testC(){
        //you can have multiple tests 
        //which all will run

        //...test c
    }
}

Ответ 2

Сотрудники моей компании написали свободно доступный DataProvider в стиле TestNG для JUnit, который вы можете найти в github (https://github.com/TNG/junit-dataprovider).

Мы используем его в очень больших проектах, и он отлично подходит для нас. Он имеет некоторые преимущества перед JUnit Parameterized, поскольку это уменьшит накладные расходы отдельных классов, и вы также можете выполнить одиночные тесты.

Пример выглядит примерно так:

@DataProvider
public static Object[][] provideStringAndExpectedLength() {
    return new Object[][] {
        { "Hello World", 11 },
        { "Foo", 3 }
    };
}

@Test
@UseDataProvider( "provideStringAndExpectedLength" )
public void testCalculateLength( String input, int expectedLength ) {
    assertThat( calculateLength( input ) ).isEqualTo( expectedLength );
}

Изменить: Начиная с версии v.1.7, он также поддерживает другие способы предоставления данных (строки, списки) и может встроить провайдера, чтобы отдельный метод не требовался.

Полный рабочий пример можно найти на странице руководства github. Он также имеет еще несколько функций, таких как сбор провайдеров в классах и доступ к ним из других классов и т.д. На странице руководства очень подробно, я уверен, вы найдете ответы на любые вопросы.

Ответ 3

В зависимости от ваших потребностей в гибкости и читаемости вы можете выбрать Parameterized - junit, встроенный в опцию, описанный dkatzel. Другие опции - внешние junit-бегуны, предоставляемые внешними библиотеками, такими как zohhak, которые позволяют:

 @TestWith({
        "clerk,      45'000 USD, GOLD",
        "supervisor, 60'000 GBP, PLATINUM"
    })
    public void canAcceptDebit(Employee employee, Money money, ClientType clientType) {
        assertTrue(   employee.canAcceptDebit(money, clientType)   );
    }

или junitParams с немного другой функциональностью. просто выберите то, что вам больше всего подходит