Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Когда тест в junit считается успешным. / 25 сообщений из 27, страница 1 из 2
26.05.2021, 12:40
    #40073080
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
Добрый день, только вот начинаю осваивать этот фреймворк и возник вопрос по поводу того, что такое успешный тест. Столкнулся с тем, что у меня во время работы кода бывает выкидываются исключения и assertEquals не вызывается, а тест все равно пишет что он ок. Просто я изначально полагал, что тест успешный, когда обязательно выполняется условие assertEquals, а что делать в случае когда до выполнения этой проверки что-то отваливается? Вот например гипотетический кусок кода, где все может свалиться до assert, например из-за кривой работы метода measure(), а мне нужно убедиться в том что датчик измеряет данные корректно. В итоге при моей организации кода в методе measure сбой, а я об этом и не узнаю. Можно как-нибудь обозначить, что условия assertEquals( sut.measure(), 22) [b]обязательно должно выполниться.[/]

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   @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) {
        
        }
    }
...
Рейтинг: 0 / 0
26.05.2021, 12:52
    #40073087
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
da17,
Обработай исключение либо вообще убери try
...
Рейтинг: 0 / 0
26.05.2021, 12:57
    #40073092
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

метод может выбросить исключение, убрать не получится.
...
Рейтинг: 0 / 0
26.05.2021, 13:28
    #40073109
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
da17,
Я сказал ИЛИ обработай ИЛИ убери. Тогда исключение обработает функция выше
...
Рейтинг: 0 / 0
26.05.2021, 13:42
    #40073120
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
Ты же точно знаешь что оно не будет брошено. Тогда просто декларируй.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
   @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/
...
Рейтинг: 0 / 0
26.05.2021, 18:12
    #40073252
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
da17
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

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


Можно тестировать исключения . :-)
...
Рейтинг: 0 / 0
26.05.2021, 22:22
    #40073334
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   @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) {
        
        }
    }


я вот так переписал
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@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). Может быть можно как-нибудь аккуратней? Есть ли возможность вообще не задумываться о том будет выброшено исключение или нет?
...
Рейтинг: 0 / 0
26.05.2021, 22:49
    #40073344
Когда тест в junit считается успешным.
С точки зрения JUnit тест успешный в том случае когда из него не выбросилось исключение. Исключение может выброситься:
1. Твоим кодом
2. assertXxx() методами (они выбрасывают AssertionError)

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

При написании теста ты точно должен описывать условия чтоб результат не был разным от запуска к запуску. Т.е.
1. Либо тестируемый код никогда не выбрасывает исключений намеренно и тогда assertXxx() методы все выполняться в любом случае
2. Либо он всегда выбрасывает и тогда тест нужно так написать, чтоб он ожидал исключения. Вот 3 способа написать такой тест в JUnit4:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    @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, но при этом в тесте он на самом деле не выбросит исключение, то просто не отлавливай его в тесте:
Код: java
1.
2.
3.
4.
    @Test
    public void checkingWithoutExceptions() throws Exception {
        ...
    }
...
Рейтинг: 0 / 0
27.05.2021, 07:29
    #40073381
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.
...
Рейтинг: 0 / 0
27.05.2021, 07:36
    #40073383
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.


Как бы одно другому перпендикулярно.
Юнит-тесты, нужны для фиксации поведения класса/метода.
При этом не явно имея ввиду, что класс/метод является stateless.
...
Рейтинг: 0 / 0
27.05.2021, 07:51
    #40073386
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul,
Докажи.
Нафига тестировать 22 если числа нет в БЛ?
Ради чего?
...
Рейтинг: 0 / 0
27.05.2021, 07:53
    #40073387
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
Тесты перпердикулярны жизни (с)
...
Рейтинг: 0 / 0
27.05.2021, 08:18
    #40073393
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
mad_nazgul,
Докажи.
Нафига тестировать 22 если числа нет в БЛ?
Ради чего?


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

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

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

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

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

Просто если есть юнит-тесты, то проще читать код.
Т.к. правда в коде и отчасти в тестах.
Всё остальное обычно врет. :-)
...
Рейтинг: 0 / 0
27.05.2021, 08:19
    #40073394
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
Тесты перпердикулярны жизни (с)


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

<:o)
...
Рейтинг: 0 / 0
27.05.2021, 08:23
    #40073395
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul,
Пример с 22 противоречит всему тому что ты написал.
...
Рейтинг: 0 / 0
27.05.2021, 08:27
    #40073396
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе
...
Рейтинг: 0 / 0
28.05.2021, 07:13
    #40073711
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
mad_nazgul,
Пример с 22 противоречит всему тому что ты написал.


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

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

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

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

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

P.S. Лично мне удобно, когда на проекте есть юнит-тесты, и они работают.
Т.к. они "правда", почти такая же, как код.
Что не скажешь о модульных/интеграционных тестах, особенно обмазанных моками.
...
Рейтинг: 0 / 0
28.05.2021, 07:14
    #40073712
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе


И... Норм решение, чтобы не смотреть глазами 22.
В чем проблема?
Написали код, который за нас смотрит 22.
...
Рейтинг: 0 / 0
28.05.2021, 07:26
    #40073714
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul
PetroNotC Sharp
mad_nazgul,
>юнит-тест это средство для разработчика, как например отладчик или "System.out.println".
= да! Выше пример не тесты а извращенный отладчик чтобы узнать 22 ли на выходе


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

Я лично смотрю в консоли или в дебаге или в логах.
Это быстрее.
авторЮнит-тест это инструмент разработки, а не тестирования.
Я понял твою мысль. Обдумать надо)
...
Рейтинг: 0 / 0
28.05.2021, 08:57
    #40073719
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul,
>Лично мне удобно, когда на проекте есть юнит-тесты, и они работают.
То есть сделал git commit и пошло все исподнее в хранилище для всех?
...
Рейтинг: 0 / 0
28.05.2021, 08:58
    #40073720
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
PetroNotC Sharp
mad_nazgul
пропущено...


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

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


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

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

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

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

Еще раз юнит-тесты не про тестирование, юнит-тест про разработку.Они и про то, и про другое. Но эти тесты могут писаться и не по TDD и при этом оставаться тестами. Так что в первую очередь они все-таки про тестирование.
...
Рейтинг: 0 / 0
28.05.2021, 09:46
    #40073732
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
mad_nazgul,
Имхо ты заузил сабж слишком сильно.
...
Рейтинг: 0 / 0
28.05.2021, 13:58
    #40073790
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
Для крупных проектов тесты могут быть готовой документацией. Если кто-то из коллег настолько самоуверен
или смел что никогда не пишет тестов - следовательно он должен где-то сохранять инфу о поведении разрабатываемых
компонентов. Будет ли это документация JavaDoc или confluence.. неважно. Важно что эта инфа где-то остается
кроме кода. Потому-что для newcomer который приходит в ваш проект будет трудно читая код глазами понять
для чего он и как работает.
...
Рейтинг: 0 / 0
31.05.2021, 07:56
    #40074245
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда тест в junit считается успешным.
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 без глубокого рефракторинга не возможно.
Пример .
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Когда тест в junit считается успешным. / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]