Как утверждать, что несколько переменных имеют одинаковое значение?

Я пишу тест JUnit для функции расчета

double calculate(double val1, double val2);

Ожидается, что функция выдаст тот же результат, если входные данные "перевернуты", то есть не должно иметь значения, какой из них стоит первым, и не должно иметь значения, отрицательные они или положительные (при условии, что они имеют одинаковые знаки).

Следующее должно дать одинаковый результат:

calculate(1.5, 4.7);
calculate(4.7, 1.5);
calculate(-1.5, -4.7);
calculate(-4.7, -1.5);

но у этого есть недостаток завершения метода теста, когда один из них терпит неудачу.

Мой текущий тест просто делает 4 отдельных утверждения:

assertEquals( 9.472, result1, 0.001 );
assertEquals( 9.472, result2, 0.001 );
assertEquals( 9.472, result3, 0.001 );
assertEquals( 9.472, result4, 0.001 );

но у этого есть недостаток завершения метода теста, когда один из них терпит неудачу. То же самое касается тестирования с использованием массива:

assertArrayEquals(
        new double[]{9.472, 9.472, 9.472, 9.472},
        new double[]{result1, result2, result3, result4},
        0.001);

Другой вариант, который я придумал, состоял в том, чтобы просто утверждать, что они все равны, используя

assertTrue( result1 == result2 && result2 == result3 && result3 == result4 );

но у этого есть недостаток - не сообщать вам фактические значения, когда он терпит неудачу.

Как лучше всего протестировать что-то подобное?

1 ответ

Решение

Это похоже на то, для чего предназначены параметризованные тесты.

Ваш метод теста будет просто

@Test
public void testCommutativity() {
    assertEquals(calculate(a, b), calculate(b, a), .001);
}

И ваш метод параметров будет что-то вроде

@Parameters
public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] {     
             { 1.5, 4.7 }, { -1.5, -4.7 }
       });
}

Вы даже можете программно изменить ваши параметры (сделать один или оба отрицательных) перед их возвратом.

Другие вопросы по тегам