Рубрики
Без рубрики

Утверждение против предположения при написании тестов (JUnit)

Большинство разработчиков знакомы с концепцией утверждения при написании тестов. Утверждение – это p… Помеченный java, junit.

Большинство разработчиков знакомы с концепцией утверждения при написании тестов. Утверждение – это процесс проверки выполнения некоторого условия. В большинстве случаев условие является своего рода проверкой результата тестируемого устройства. Например, массив пуст, переменная заполняется правильным значением. Проверьте этот пример, давайте напишем простой класс калькулятора. Этот класс имеет два метода: add и умножить . Метод add просто добавляет два целых числа и возвращает результат, но метод multiply использует метод add для умножения.

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int multiply(int a, int b) {
        int result = 0;
        for (int i = 0; i < b; i++) {
            result += add(result,a);
        }
        return result;
    }
}

Для метода добавления мой модульный тест будет выглядеть следующим образом:

@Test
public void testAdd() {
    int a = ThreadLocalRandom.current().nextInt();
    int b = ThreadLocalRandom.current().nextInt();
    int result = calculator.add(a, b);

    Assertions.assertEquals(a + b, result);
}

Для любых двух заданных целых чисел результат метода add должен быть равен их сложению. Мой модульный тест для метода multiple будет выглядеть следующим образом:

    @Test
    public void testMultiply() {
        int a = ThreadLocalRandom.current().nextInt();
        int b = ThreadLocalRandom.current().nextInt();

        int multiplicationResult = calculator.multiply(a, b);

        Assertions.assertEquals(a * b, multiplicationResult);
    }

Это работает, но есть кое-что, на что стоит обратить внимание. Мы знаем, что метод multiply в значительной степени зависит от метода add . Если add не работает, нет смысла тестировать multiply . В нашем примере это не сильно повредило бы, но в реальных задачах это может сильно повлиять на время тестирования и ресурсы. Что мы можем сделать? Мы можем использовать Предположение .

@Test
public void testMultiply() {
    int a = ThreadLocalRandom.current().nextInt();
    int b = ThreadLocalRandom.current().nextInt();
    int additionResult = calculator.add(a, b);

    Assumptions.assumeTrue(a + b == additionResult);

    int multiplicationResult = calculator.multiply(a, b);

    Assertions.assertEquals(a * b, multiplicationResult);
}

При предположении вы проверяете предварительные условия теста, если они недоступны или не имеют ожидаемого значения, нет смысла продолжать тест. В приведенном выше примере мы сначала убедимся, что метод add работает правильно.

Почему бы просто не утвердить их? Разница в том, что если утверждение не выполняется, тест завершится неудачей, но если предположение не выполняется, тест будет проигнорирован. Хотя во многих тестах они утверждаются, это не так, как должно быть. Мы не хотим проверять функциональность других методов, но мы хотим быть уверены, что они работают должным образом.

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

Например, если ваш метод добавления не работает должным образом, test Add завершится ошибкой, а testMultiply будет проигнорирован.

Оригинал: “https://dev.to/amaralani/assertion-vs-assumption-when-writing-tests-junit-4m36”