Написание тестов Java с поставщиками данных
В настоящее время я делаю свой первый проект Java и люблю полностью его TDD. Я использую JUnit для написания тестов. По-видимому, JUnit не предоставляет поддержку поставщикам данных, что делает его довольно раздражающим для тестирования того же метода с 20 различными версиями аргумента. Какой самый популярный/стандартный инструмент тестирования для Java, который поддерживает поставщиков данных? Я наткнулся на TestNG, но понятия не имею, насколько популярен этот, или как он сравнивается с альтернативами.
Если есть способ получить это поведение, это хороший способ использования JUnit, тогда это также может работать.
Ответы
Ответ 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 с немного другой функциональностью. просто выберите то, что вам больше всего подходит