Есть ли в JUnit эквивалент атрибута testcase NUnit?

Я искал в Google тестовый пример 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?


person Steph    schedule 29.12.2010    source источник
comment
В JUnit есть два стиля: версия 3, которая используется в вашем примере, и версия 4, в которой используются аннотации. Вы действительно хотите узнать о версии 3?   -  person Raedwald    schedule 29.12.2010
comment
Ах .. Нет ... Я хочу знать про 4.5 ...   -  person Steph    schedule 29.12.2010
comment
Я думаю, что я могу искать параметризованные тесты. Но даже это выглядит немного многословным и немного случайным ... mkyong.com/unittest/junit-4-tutorial-6-parameterized-test   -  person Steph    schedule 29.12.2010
comment
похоже, у вас может быть только 1 параметризованный тест на класс. Дерьмо что ли?   -  person Steph    schedule 29.12.2010
comment
вы можете использовать kentbeck.github.com/junit / javadoc / latest / org / junit / experimental /, чтобы поместить несколько тестовых классов в один, что позволит вам иметь несколько параметризованных тестов для каждого класса.   -  person NamshubWriter    schedule 02.01.2011
comment
@Steph У вас может быть несколько методов тестирования, которые принимают одни и те же параметры. Если вам нужен другой набор параметров, вам нужен новый тестовый класс.   -  person Jeanne Boyarsky    schedule 23.01.2011
comment
NUnit является производным от JUnit, и теперь он намного продвинулся, чем JUnit. TestCase - лишь один из примеров, который упрощает использование NUnit.   -  person Kenneth Xu    schedule 04.06.2012
comment
Угу, я ответил на этот вопрос 3 года назад, но только сейчас заметил, что 1 + 2! = 5, и 3 + 4   -  person Gonen I    schedule 06.11.2016


Ответы (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) {
       ...
    }
}

Вы также можете указать параметры с помощью отдельных методов, классов или файлов, см. JUnitParamsRunner api docs для получения дополнительной информации.

person Soulman    schedule 10.07.2013

Видимо правильный ответ - «Нет, эквивалента нет». И это печально.

Параметризованные тесты и теории JUnit (как указано здесь и в JUnit - How проверить метод с разными значениями?) оба могут выполнить свою работу, но нигде не так чисто. К сожалению, их сложно писать и трудно читать.

Я надеюсь, что однажды JUnit сможет добавить более простой синтаксис, подобный NUnit. Похоже, это не должно быть так сложно; хотя, может быть, лямбды нужны?

person Allan    schedule 08.04.2013
comment
Лямбды, вероятно, не так нужны, как настоящие дженерики, но это только предположение. Аннотации / Атрибуты вообще не зависят от анонимных функций. - person Joey; 10.09.2013

Возможно, стоит также ознакомиться с Теориями и точками данных JUnit. Они позволяют параметризовать тесты, но запускают комбинацию типов всех пар для ваших входных данных.

person Gonen I    schedule 09.09.2012
comment
Это похоже на ответ, наиболее близкий к требованиям. - person David G; 16.10.2015

Вы можете получить 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);
    }
}
person Denis Bakharev    schedule 02.08.2014
comment
Это даже лучше, чем новая @ValueSource функция JUnit 5. - person urig; 25.10.2017

Это глупо, но вот обходной путь, который у меня в конце концов есть. Используйте 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);
}
person Kenneth Xu    schedule 03.06.2012
comment
Мне нравится ваш обходной путь. Сегодня мы должны использовать @ParameterizedTest аннотация - person rupweb; 18.02.2021

Я использовал удерживающий класс для хранения моих тестовых примеров следующим образом:

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 ...
}
person rupweb    schedule 19.02.2021