2010-12-29 2 views
22

Я гугл для испытания JUnit случае, и он приходит с чем-то, что выглядит намного сложнее реализовать - где вы должны создать новый класс, расширяющий тест, который затем называют:Есть ли эквивалент JUnit для атрибута тестового теста NUnit?

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?

+2

JUnit имеет два стиля: 3 версии, которые у вас есть в вашем примере, и версию 4, которая использует аннотацию. Вы действительно хотите узнать о версии 3? – Raedwald

+0

А .. Нет ... Я хочу знать о 4.5 ... – Steph

+1

Я думаю, что я мог бы искать Параметрированные тесты. Но даже это выглядит немного подробным и немного случайным ... http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/ – Steph

ответ

2

Это глупо, но вот обходной путь, который у меня есть, в конце. Используйте только 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); 
} 
6

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

+0

Это похоже на ответ, наиболее близкий к требованиям. –

10

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

JUnit параметризованные тесты и теории (как указано здесь и в JUnit - How to test a method with different values?), оба могут выполнить свою работу, но нигде почти так же чисто. Они, к сожалению, сложно писать, и их трудно читать.

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

+0

Lambdas, вероятно, не нужны, как правильные дженерики, но это только предположение. Аннотации/Атрибуты вообще не зависят от анонимных функций. – Joey

11

2017 обновление: JUnit 5 будет включать параметризованные тесты через расширение junit-jupiter-params. Некоторые примеры из documentation:

один параметр примитивных типов (@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, см. documentation.


Оригинальный ответ:

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 для деталей.

5

Вы можете иметь 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); 
    } 
} 
+0

Это еще лучше, чем новая функция '@ ValueSource' от JUnit 5. – urig