Есть ли 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 ...
}
Другие вопросы по тегам