Можно ли писать Assert на уровне main, а не test

Assertions should not be used in production code
Стоит ли использовать JUnit Asserts в ветке классов main, если по определению они должны быть в test.
image
К примеру, писать следующий метод:

public void verifyNameField(String name) {
    Assert.assertEquals(name, $("#ID").text());
}

вместо того, чтобы написать get-метод и применить Assert уже при его вызове на уровне test.
Ищу доступное объяснение, почему так не следует делать, или почему следует, или это не имеет значения.

Этот совет относится к нормальным проектам, в которых содержится и код, и тесты. Соответственно,

  1. в папке src/main/java - продакшн код, и в нём действительно не нужны ассерты.
  2. В папке src/test/java - тесты, и только там должны быть ассерты.

А если у вас типичный “проект автоматизации”, в котором нет продакшн кода, а есть только автотесты, то там везде можно использовать ассерты. Там вообще разделение на main/test не имеет смысла.

4 лайка

Спасибо :slight_smile:

Тут ещё зависит, как Вы запускаете проект.
Если через тест раннер - в main можно вообще ничего, кроме пары заглушек, не писать, а всё писать в test.
Если же через Java runner - то у Вас будут проблемы, тогда придётся как-то хитрить.

1 лайк

Вообще, assert’ы встречаются и в продакшен-коде. Сам довольно часто их встречал внрутри многих библиотек в том числе.

  1. What are assertions in Java and when should they be used? - Stack Overflow

  2. Assert in production code? Yes, please! | Method Park by UL

  3. Programming With Assertions

1 лайк

Да, когда-то эта идея была популярна. В алгоритмах был такой термин “инвариант” - по сути промежуточный ассерт где-то посреди продакшин кода.

Но кажется, идея не пустила корни. Возможно, как раз из-за возникновения юнит-тестов как более эффективной альтернативы.

2 лайка