Есть ли JUnit, эквивалентный атрибуту тестового случая NUnit?
Я гуглил тестовый пример JUnit, и он предлагает кое-что, что выглядит гораздо более сложным для реализации - где вам нужно создать новый класс, который расширяет тестовый пример, который вы затем вызываете:
public class MathTest extends TestCase {
protected double fValue1;
protected double fValue2;
protected void setUp() {
fValue1= 2.0;
fValue2= 3.0;
}
}
public void testAdd() {
double result= fValue1 + fValue2;
assertTrue(result == 5.0);
}
но я хочу кое-что действительно простое, как тестовые случаи NUnit
[TestCase(1,2)]
[TestCase(3,4)]
public void testAdd(int fValue1, int fValue2)
{
double result= fValue1 + fValue2;
assertIsTrue(result == 5.0);
}
Есть ли способ сделать это в JUnit?
6 ответов
Обновление 2017 года: JUnit 5 будет включать параметризованные тесты через junit-jupiter-params
расширение. Некоторые примеры из документации:
Единственный параметр примитивных типов (@ValueSource
):
@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
assertNotNull(argument);
}
Значения через запятую (@CsvSource
) позволяет указать несколько параметров, аналогичных JUnitParams ниже:
@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
assertNotNull(first);
assertNotEquals(0, second);
}
Другие аннотации источника включают @EnumSource
, @MethodSource
, @ArgumentsSource
а также @CsvFileSource
подробности смотрите в документации.
Оригинальный ответ:
JUnitParams ( https://github.com/Pragmatists/JUnitParams) кажется достойной альтернативой. Это позволяет вам указывать параметры теста в виде строк, например:
@RunWith(JUnitParamsRunner.class)
public class MyTestSuite {
@Test
@Parameters({"1,2", "3,4"})
public testAdd(int fValue1, int fValue2) {
...
}
}
Вы также можете указать параметры с помощью отдельных методов, классов или файлов, для получения подробной информации обратитесь к документации API JUnitParamsRunner.
Видимо, правильный ответ: "Нет, эквивалента нет". И это грустно.
Параметризованные тесты и теории JUnit (как упомянуто здесь и в JUnit - Как протестировать метод с различными значениями?) Оба могут выполнить работу, но нигде не так чисто. К сожалению, их сложно писать, и их трудно читать.
Я надеюсь, что однажды JUnit сможет добавить более простой, похожий на NUnit синтаксис. Похоже, это не должно быть так сложно; хотя возможно лямбды нужны?
Возможно, стоит проверить JUnit-теории и точки данных. Они позволяют вам параметризовать тесты, но запускают комбинацию типов всех пар на ваших входах.
Вы можете иметь джунит с параметрами, используя zohhak
Пример использования:
@RunWith(ZohhakRunner.class)
public class HelloWorldTest {
@TestWith({
"2, 1, 3",
"3, 5, 8"
})
public void should_add_numbers(int addend1, int addend2, int result) {
assertThat(addend1 + addend2).isEqualTo(result);
}
}
Это глупо, но вот обходной путь, который у меня есть в конце. Используйте 4 строки вместо одной строки.
@Test
public void testAdd1() {
testAdd(1,2);
}
@Test
public void testAdd2() {
testAdd(3,4);
}
private void testAdd(int fValue1, int fValue2)
{
double result= fValue1 + fValue2;
assertIsTrue(result == 5.0);
}
Я использовал удерживающий класс для хранения моих тестовых примеров следующим образом:
class FlexiTest {
String var1;
String var2;
double var3;
String var4;
MyObject var5;
double expected;
public FlexiTest(String var1, String var2, double var3, String var4, MyObject var5, double expected) {
super();
this.var1;
this.var2;
this.var3;
this.var4;
this.var5;
this.expected = expected;
}
Затем настройте
stream
из моих объектов тестового класса, например:
static Stream<FlexiTest> provider(){
FlexiTest ft1 = new FlexiTest("1", "2", 3, "4", MyObject.A, 1.1);
FlexiTest ft2 = new FlexiTest("10", "20", 30, "40", MyObject.B, 11);
FlexiTest ft3 = new FlexiTest("100", "200", 300, "400", MyObject.C, 110);
return Stream.of(ft1, ft2, ft3);
}
Затем аннотировал метод Test с помощью @ParameterizedTest и @MethodSource с именем метода потока объектов. Также нулевые и пустые проверки:
@ParameterizedTest
@MethodSource("provider")
@NullSource
@EmptySource
public void ClientTest(FlexiTest ft)
{
... my test code ...
}