Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Когда тест в junit считается успешным.  [new]
da17
Member

Откуда:
Сообщений: 448
Добрый день, только вот начинаю осваивать этот фреймворк и возник вопрос по поводу того, что такое успешный тест. Столкнулся с тем, что у меня во время работы кода бывает выкидываются исключения и assertEquals не вызывается, а тест все равно пишет что он ок. Просто я изначально полагал, что тест успешный, когда обязательно выполняется условие assertEquals, а что делать в случае когда до выполнения этой проверки что-то отваливается? Вот например гипотетический кусок кода, где все может свалиться до assert, например из-за кривой работы метода measure(), а мне нужно убедиться в том что датчик измеряет данные корректно. В итоге при моей организации кода в методе measure сбой, а я об этом и не узнаю. Можно как-нибудь обозначить, что условия assertEquals( sut.measure(), 22) [b]обязательно должно выполниться.[/]

   @Test 
   public void testSensorOk() {
        Air air =new Air();
        air.setTemperature(22); 
        
        Sensor sut = new Sensor();
        try {
            sut.measure(air);
            assertEquals(sut.value(), 22) 
        }
        catch(Exception e) {
        
        }
    }


Сообщение было отредактировано: 26 май 21, 12:36
26 май 21, 12:40    [22327382]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
da17,
Обработай исключение либо вообще убери try
26 май 21, 12:52    [22327390]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
da17
Member

Откуда:
Сообщений: 448
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

метод может выбросить исключение, убрать не получится.
26 май 21, 12:57    [22327395]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
da17,
Я сказал ИЛИ обработай ИЛИ убери. Тогда исключение обработает функция выше
26 май 21, 13:28    [22327417]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Ты же точно знаешь что оно не будет брошено. Тогда просто декларируй.

   @Test 
   public void testSensorOk() throws Exeption {
        Air air =new Air();
        air.setTemperature(22); 
        Sensor sut = new Sensor();

            sut.measure(air);
            assertEquals(sut.value(), 22) 
    }


Или если в другом тесте тебе надо точно проверить что оно брошено - тогда - как здесь https://howtodoinjava.com/junit5/expected-exception-example/
26 май 21, 13:42    [22327431]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
da17
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

метод может выбросить исключение, убрать не получится.


Можно тестировать исключения. :-)
26 май 21, 18:12    [22327610]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
da17
Member

Откуда:
Сообщений: 448
PetroNotC Sharp,
   @Test 
   public void testSensorOk() {
        Air air =new Air();
        air.setTemperature(22); 
        
        Sensor sut = new Sensor();
        try {
            sut.measure(air);
            assertEquals(sut.value(), 22) 
        }
        catch(Exception e) {
        
        }
    }

я вот так переписал
@Test 
   public void testSensorOk() {
        Air air =new Air();
        air.setTemperature(22); 
        int air_temperature = 0;
        Sensor sut = new Sensor();
        try {
            air_temperature = sut.measure(air);
            
        }
        catch(Exception e) {
        
        }
        assertEquals(air_temperature, 22);    
}

Что бы гарантированно поток выполнения добрался до строки assertEquals(air_temperature, 22). Может быть можно как-нибудь аккуратней? Есть ли возможность вообще не задумываться о том будет выброшено исключение или нет?

Сообщение было отредактировано: 26 май 21, 22:14
26 май 21, 22:22    [22327713]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
С точки зрения JUnit тест успешный в том случае когда из него не выбросилось исключение. Исключение может выброситься:
1. Твоим кодом
2. assertXxx() методами (они выбрасывают AssertionError)

Соответственно если исключение не выбросилось (или выбросилось, но ты его отловил), то тест будет считаться успешным.

При написании теста ты точно должен описывать условия чтоб результат не был разным от запуска к запуску. Т.е.
1. Либо тестируемый код никогда не выбрасывает исключений намеренно и тогда assertXxx() методы все выполняться в любом случае
2. Либо он всегда выбрасывает и тогда тест нужно так написать, чтоб он ожидал исключения. Вот 3 способа написать такой тест в JUnit4:
    @Test(expected = IndexOutOfBoundsException.class)
    public void checkingException1() {
        new ArrayList<>().get(0);
    }
    @Test
    public void checkingException2() {
        try {
            new ArrayList<>();
            fail("Exception wasn't thrown!");
        } catch (IndexOutOfBoundsException ignore) {}
    }
    @Test
    public void checkingException3() {
        IndexOutOfBoundsException e = assertThrows(IndexOutOfBoundsException.class, () -> new ArrayList<>().get(0));
        assertEquals("Index 0 out of bounds for length 0", e.getMessage());
    }


А если твой код просто объявляет throws Exception, но при этом в тесте он на самом деле не выбросит исключение, то просто не отлавливай его в тесте:
    @Test
    public void checkingWithoutExceptions() throws Exception {
        ...
    }


Сообщение было отредактировано: 26 май 21, 22:45
26 май 21, 22:49    [22327724]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.
27 май 21, 07:29    [22327769]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.


Как бы одно другому перпендикулярно.
Юнит-тесты, нужны для фиксации поведения класса/метода.
При этом не явно имея ввиду, что класс/метод является stateless.
27 май 21, 07:36    [22327771]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul,
Докажи.
Нафига тестировать 22 если числа нет в БЛ?
Ради чего?
27 май 21, 07:51    [22327774]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Тесты перпердикулярны жизни (с)
27 май 21, 07:53    [22327775]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
mad_nazgul,
Докажи.
Нафига тестировать 22 если числа нет в БЛ?
Ради чего?


Действительно нафига? :-)

Грубо говоря мы тестируем, например функцию, что должны получить, если подать не корректные значения.
Т.е. как мы реагируем, на не стандартную ситуацию.
И это поведение мы фиксируем в тесте.

Тесты определяют область определения и область значений, и реакцию, когда выходим за область определения.
В этом как бы весь смысл юнит-тестов (неявно предполагая, что тестируем stateless)

А вот уже БЛ тестируется в интеграционных тестах.
Несколько другой инструмент.
Вот там как раз важно состояние, нужно подготавливать специально тестовые данные, поднимать хранилище данных с нужными данными и т.д.
Это более дорогое тестирование.

ИМХО юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
Им можно пользоваться, можно не пользоваться.

Просто если есть юнит-тесты, то проще читать код.
Т.к. правда в коде и отчасти в тестах.
Всё остальное обычно врет. :-)
27 май 21, 08:18    [22327782]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
Тесты перпердикулярны жизни (с)


Вы просто не умеете их готовить (с) Не мой.

<:o)
27 май 21, 08:19    [22327783]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul,
Пример с 22 противоречит всему тому что ты написал.
27 май 21, 08:23    [22327784]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе
27 май 21, 08:27    [22327785]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
mad_nazgul,
Пример с 22 противоречит всему тому что ты написал.


Конкретно чему противоречит?

Есть юнит-тесты, которые тестируют stateless функциии/классы.
Есть модульные/интеграционные тесты, которые тестируют statefull функции/классы.

Если есть "состояние" это не юнит-тест.
Statefull тестировать дорого.
Либо нужно поднимать нужный контекст, либо обмазываться моками.
И то, и то "дорого", читай "не удобно".

Юнит-тест это инструмент разработки, а не тестирования.
В рамках методологии TDD.
И они (юнит-тесты) удобны/не удобны, в рамках умеет/не умеет программист этим инструментом пользоваться.

Еще раз юнит-тесты не про тестирование, юнит-тест про разработку.

P.S. Лично мне удобно, когда на проекте есть юнит-тесты, и они работают.
Т.к. они "правда", почти такая же, как код.
Что не скажешь о модульных/интеграционных тестах, особенно обмазанных моками.
28 май 21, 07:13    [22328303]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе


И... Норм решение, чтобы не смотреть глазами 22.
В чем проблема?
Написали код, который за нас смотрит 22.
28 май 21, 07:14    [22328304]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul
PetroNotC Sharp
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе


И... Норм решение, чтобы не смотреть глазами 22.
В чем проблема?
Написали код, который за нас смотрит 22.

Я лично смотрю в консоли или в дебаге или в логах.
Это быстрее.
автор
Юнит-тест это инструмент разработки, а не тестирования.

Я понял твою мысль. Обдумать надо)

Сообщение было отредактировано: 28 май 21, 07:22
28 май 21, 07:26    [22328306]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul,
>Лично мне удобно, когда на проекте есть юнит-тесты, и они работают.
То есть сделал git commit и пошло все исподнее в хранилище для всех?
28 май 21, 08:57    [22328316]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
PetroNotC Sharp
mad_nazgul
пропущено...


И... Норм решение, чтобы не смотреть глазами 22.
В чем проблема?
Написали код, который за нас смотрит 22.

Я лично смотрю в консоли или в дебаге или в логах.
Это быстрее.


Я же говорю System.out,println :-)
Мне когда надоедает глаза ломать, пишу небольшой тестик, с assert-ами.
Даже не юнит.

Правда эти отладочные тесты "хрупкие" и их в прод нельзя выводит.
Но если приложить усилия, то можно из них сделать юнит- или модульный/интеграционный тест.
Т.к. понятно что проверяем.

С юнит тестами основной блокер, что они удобны только в рамках TDD.
При других способах разработки и формальном использовании это не самая удобная вещь.
А TDD ну очень специфичный способ разработки.
Чтобы научиться, нужно "забыть", как делал раньше.
28 май 21, 08:58    [22328317]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
mad_nazgul
Есть юнит-тесты, которые тестируют stateless функциии/классы.
Есть модульные/интеграционные тесты, которые тестируют statefull функции/классы.
Поправлю по терминологии/концепциям:
1. Модульные тесты - это то же самое что unit tests. Одно - по-русски, другое - по-английски.
2. Модульные тесты могут тестировать хоть классы с состоянием, хоть без.
3. Интеграционные тесты (каким бы ни было отвратительным это название) - это когда хотя бы одно условие соблюдается: есть обращение к внешним ресурсам (БД, другой сервис) или поднимаем для теста приличный кусок приложения (e.g. инициализируем спринг контекст).

mad_nazgul
Юнит-тест это инструмент разработки, а не тестирования.
В рамках методологии TDD.
И они (юнит-тесты) удобны/не удобны, в рамках умеет/не умеет программист этим инструментом пользоваться.

Еще раз юнит-тесты не про тестирование, юнит-тест про разработку.
Они и про то, и про другое. Но эти тесты могут писаться и не по TDD и при этом оставаться тестами. Так что в первую очередь они все-таки про тестирование.

Сообщение было отредактировано: 28 май 21, 09:35
28 май 21, 09:42    [22328330]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
mad_nazgul,
Имхо ты заузил сабж слишком сильно.
28 май 21, 09:46    [22328335]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Для крупных проектов тесты могут быть готовой документацией. Если кто-то из коллег настолько самоуверен
или смел что никогда не пишет тестов - следовательно он должен где-то сохранять инфу о поведении разрабатываемых
компонентов. Будет ли это документация JavaDoc или confluence.. неважно. Важно что эта инфа где-то остается
кроме кода. Потому-что для newcomer который приходит в ваш проект будет трудно читая код глазами понять
для чего он и как работает.
28 май 21, 13:58    [22328430]     Ответить | Цитировать Сообщить модератору
 Re: Когда тест в junit считается успешным.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5687
Stanislav Bashkyrtsev
Поправлю по терминологии/концепциям:
1. Модульные тесты - это то же самое что unit tests. Одно - по-русски, другое - по-английски.
2. Модульные тесты могут тестировать хоть классы с состоянием, хоть без.
3. Интеграционные тесты (каким бы ни было отвратительным это название) - это когда хотя бы одно условие соблюдается: есть обращение к внешним ресурсам (БД, другой сервис) или поднимаем для теста приличный кусок приложения (e.g. инициализируем спринг контекст).


Не совсем так.
unit-тесты в понимании методологии TDD, это тест, который не имеет контекста.
Но, например, в Spring Test контекст явно имеется, и для тестирования нужно его поднятие, с соответствующей настройкой контекста.
Это уже не unit-тест, т.к. то что мы тестируем явно имеет состояние, которое мы должны передать тесту. И оно может быть разным в зависимости от окружения. Например, в зависимости от переменных среды.
Мне удобнее называть их модульными/интеграцонными тестами. Т.к. они уже не unit, но ещё не полноценные интеграционные тесты.
ИМХО правильнее их называть все таки интеграционными тестами, т.к тестируется часть контекста спринга.

Stanislav Bashkyrtsev

mad_nazgul
Юнит-тест это инструмент разработки, а не тестирования.
В рамках методологии TDD.
И они (юнит-тесты) удобны/не удобны, в рамках умеет/не умеет программист этим инструментом пользоваться.

Еще раз юнит-тесты не про тестирование, юнит-тест про разработку.
Они и про то, и про другое. Но эти тесты могут писаться и не по TDD и при этом оставаться тестами. Так что в первую очередь они все-таки про тестирование.


Не совсем.
Поведение программы тестируют интеграционные тесты.
Т.к. они воспроизводят некоторую последовательность действий.
И проверяют результат.

Unit-test определяет область определения и область значений функции/класса.
Можно написать 100% правильные unit-test со 100% покрытием кода, а на выходе получить не работающую программу.
Кроме того, unit-test имеет смысл писать ДО написания реализации, а не ПОСЛЕ.
Т.к. дизайн функций/классов может оказаться таким, что написать unit-test без глубокого рефракторинга не возможно.
Пример.
31 май 21, 07:56    [22329097]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить