2015-07-28 2 views
3

Я хочу сделать тест партии, как в следующем, однако, если есть ошибка, это не говорит мне, какое значение i происходит ошибка.Как выполнить те же тесты с несколькими входами?

@Test 
public void simpleMovingAverageBatch() { 
    for (int i = 1; i < 61; ++i) { 
     simpleMovingAverage(i); 
    } 
} 

public void simpleMovingAverage(int days) { 
    double sma = -1; 
    int size = stock.getCloses().size(); 

    stock.calcSMA(days); // <- code that I'm testing 

    // first days should be -1 
    for (int index = size - 1; index >= size - days + 1; --index) { 
     assertEquals(-1, stock.getSMA(days, index), 0.001); 
    } 

    for (int index = size - days - 1; index >= 0; --index) { 
     sma = 0.0; 
     for (int i = 0; i < days; ++i) { 
      sma += stock.getCloses().get(index + i); 
     } 
     sma /= days; 
     assertEquals(sma, stock.getSMA(days, index), 0.001); 
    } 
} 

Это пример того, что произойдет, если я запустить код как:

Not what I want!

Это пример того, что я хочу, чтобы произошло:

Something like this!

Я ознакомился с параметризованными тестами in this tutorial, однако я не знаю, должен ли это маршрут, который я хочу принять.

Любые советы?


Я не думаю, что этот вопрос является дубликатом из них:

Running the same JUnit test case multiple time with different data

Java unit test for different input data

+0

Как ваш вопрос отличается от первой с которым вы связались? – Jeffrey

+0

Почему вы просто не используете assertEquals с сообщением перед ним? Он не произведет изображение, которое вы хотите, но сообщит вам, какая «я» произвела ошибку. Например: assertEquals («Это i:« + ​​i, -1, stock.getSMA (дни, индекс), 0,001); – ap0calypt1c

+0

Возможный дубликат [не допускать остановки теста при сбое] (http://stackoverflow.com/questions/30729112/dont-let-test-stop-on-failure) – kryger

ответ

1

Правильный способ сделать этот тест, чтобы использовать параметризованные тест, как вы описываете в вашем вопросе. Однако вы сказали, что не хотите этого делать. Поэтому вместо этого вы всегда можете использовать аргумент сообщения String для сообщения об ошибке.

Похоже, что Вы используете assertEquals(double, expected, double actual, double delta) в этой строке:

assertEquals(-1, stock.getSMA(days, index), 0.001); 

Вместо этого, вы можете использовать assertEquals(String message, double expected, double actual, double delta), чтобы дать себе сообщение более информативное об ошибке, например

assertEquals(String.format("For index %d,", index), -1, stock.getSMA(days, index), 0.001); 

Это даст вам сообщение об ошибке, например:

java.lang.AssertionError: For index 15, expected:<-1.0> but was:<0.0> 
+0

Downvoter, я уверен, что вы давно прошло, но почему? – durron597

+0

Это похоже на хорошее решение, но что, если я хочу иметь что-то похожее на второе изображение? Должен ли я использовать параметризованные тесты? –

+0

@budi Да, вам придется использовать параметризованные тесты. – durron597

2

ответ Дюррон приводит к параметризованным тестам JUnit с помощью @Parameters. Это отличный ответ и идеально подходит к вопросу. Тем не менее, я был на этой дороге и нашел, что это создало сложные и трудночитаемые тесты.

Теория является альтернативой в JUnit: junit.org/apidocs/org/junit/experimental/theories/Theories.html

Если вы готовы отклониться от JUnit, TestNG dataproviders является довольно гибок testng.org/doc/documentation-main.html#parameters-dataproviders

2

Попробуйте JUnitParams. Ваш тест будет выглядеть так:

@RunWith(JUnitParamsRunner.class) 
public class ExampleTest { 

    // this method provides parameters for simpleMovingAverage 
    public static Iterable<Integer> parametersForSimpleMovingAverage() { 
     return IntStream.rangeClosed(1, 61).boxed().collect(Collectors.toList()); 
    } 

    @Parameters 
    @Test 
    public void simpleMovingAverage(int days) { 
     double sma = -1; 
     int size = stock.getCloses().size(); 

     stock.calcSMA(days); // <- code that I'm testing 

     // first days should be -1 
     for (int index = size - 1; index >= size - days + 1; --index) { 
      assertEquals(-1, stock.getSMA(days, index), 0.001); 
     } 

     for (int index = size - days - 1; index >= 0; --index) { 
      sma = 0.0; 
      for (int i = 0; i < days; ++i) { 
       sma += stock.getCloses().get(index + i); 
      } 
      sma /= days; 
      assertEquals(sma, stock.getSMA(days, index), 0.001); 
     } 
    } 

И когда вы запустите тест, у вас будет отчет, как вы хотели. Еще лучше, в отличие от стандартного JUnit Parametrized runner. Отчет JUnitPramsRunner будет содержать не только индекс тестового случая, но и параметр для каждого случая (извините, у меня недостаточно репутации, чтобы опубликовать снимок экрана).

Примечание: вам нужно будет добавить зависимость:

  • Gradle:

    testCompile 'pl.pragmatists:JUnitParams:1.0.2' 
    
  • Maven:

    <dependency> 
        <groupId>pl.pragmatists</groupId> 
        <artifactId>JUnitParams</artifactId> 
        <version>1.0.4</version> 
        <scope>test</scope> 
    </dependency> 
    
Смежные вопросы