powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Когда тест в junit считается успешным.
27 сообщений из 27, показаны все 2 страниц
Когда тест в junit считается успешным.
    #40073080
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, только вот начинаю осваивать этот фреймворк и возник вопрос по поводу того, что такое успешный тест. Столкнулся с тем, что у меня во время работы кода бывает выкидываются исключения и 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
Когда тест в junit считается успешным.
    #40073087
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17,
Обработай исключение либо вообще убери try
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40073092
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

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

Код: 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
Когда тест в junit считается успешным.
    #40073252
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17
PetroNotC Sharp
da17,
Обработай исключение либо вообще убери try

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


Можно тестировать исключения . :-)
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40073334
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Когда тест в junit считается успешным.
    #40073344
С точки зрения 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
Когда тест в junit считается успешным.
    #40073381
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40073383
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
da17,
Я обработку всех неожиданностей делаю в коде а не в тестах.
Поэтому скептически к ним отношусь.
У меня в самом коде написано что делать если пришло не 22.


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


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

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

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

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

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

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


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

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


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

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

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

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

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

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


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


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

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


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

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


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

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

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

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

Еще раз юнит-тесты не про тестирование, юнит-тест про разработку.Они и про то, и про другое. Но эти тесты могут писаться и не по TDD и при этом оставаться тестами. Так что в первую очередь они все-таки про тестирование.
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40073732
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul,
Имхо ты заузил сабж слишком сильно.
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40073790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для крупных проектов тесты могут быть готовой документацией. Если кто-то из коллег настолько самоуверен
или смел что никогда не пишет тестов - следовательно он должен где-то сохранять инфу о поведении разрабатываемых
компонентов. Будет ли это документация JavaDoc или confluence.. неважно. Важно что эта инфа где-то остается
кроме кода. Потому-что для newcomer который приходит в ваш проект будет трудно читая код глазами понять
для чего он и как работает.
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40074245
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Когда тест в junit считается успешным.
    #40074302
mad_nazgulunit-тесты в понимании методологии TDD, это тест, который не имеет контекста.TDD не определяет что такое модульные тесты. TDD - это о том как переплетать написание тестов и prod кода.
mad_nazgulЭто уже не unit-тест, т.к. то что мы тестируем явно имеет состояние, которое мы должны передать тесту. И оно может быть разным в зависимости от окружения. Например, в зависимости от переменных среды.Тут дело не в состоянии, а в том что есть обращение к внешнему окружению.
mad_nazgulИМХО правильнее их называть все таки интеграционными тестами, т.к тестируется часть контекста спринга.Ну дак это все ИМХО, ни на чем не основанное. Почитай статью по ссылке. Тут нет четкой терминологии.
mad_nazgulПоведение программы тестируют интеграционные тесты.
Т.к. они воспроизводят некоторую последовательность действий.
И проверяют результат.Все то же относится и к модульным тестам. Они что-то вызывают, а потом проверяют результат.
mad_nazgulКроме того, unit-test имеет смысл писать ДО написания реализации, а не ПОСЛЕ.Их имеет смысл писать всегда . Потому как они защищают нас всякий раз когда мы меняем что-то внутри классов. И это их главная задача.

Модульные тесты писали и до TDD. Более того - я нередко пишу в TDD и не модульные тесты тоже. Получаю все тот же профит, что и при TDD с модульными тестами.

Основное отличие модульных и высокоуровневых тестов: сложность, скорость, кол-во компонентов которые они проверяют вместе, доступ к окружению. B это все никак не относится к TDD.
...
Рейтинг: 0 / 0
Когда тест в junit считается успешным.
    #40074422
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Их имеет смысл писать всегда . Потому как они защищают нас всякий раз когда мы меняем что-то внутри классов. И это их главная задача.

Модульные тесты писали и до TDD. Более того - я нередко пишу в TDD и не модульные тесты тоже. Получаю все тот же профит, что и при TDD с модульными тестами.

Основное отличие модульных и высокоуровневых тестов: сложность, скорость, кол-во компонентов которые они проверяют вместе, доступ к окружению. B это все никак не относится к TDD.


Насчет того, что тесты нужно писать всегда - согласен.
Просто надо понимать, что если хотите 100% покрытие тестами, то писать лучше в стиле TDD.
т.е. пишем тест, потом под него реализацию.

Если же наоборот, то начинаются проблемы.
Нужно ли их "героически преодолевать"?
Думаю не стоит.
Т.к. один интеграционный тест может соответствовать до 50% unit-test.

По моему unit-test это инструмент разработчика, для разработки, который заточен под определенный стиль программирования.
И слепо пытаться внедрить их везде, это "карго культ".

Мне гораздо приятнее работать с кодом, который покрыт тестами, чем с кодом без тестов.
Но я понимаю, что unit-test не все умеют писать.:-)
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Когда тест в junit считается успешным.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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