Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 13 14 15 16 17 18 [19] 20 21 22   вперед  Ctrl
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
Глухая? Тоже шикарно.
28 фев 20, 22:22    [22089560]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
mayton
PetroNotC Sharp
mayton,
Я иногда в коде возвращал 9999999.
))))

Слышал про дохлую корову? Deaf beef. 0xDEADBEEF

Щас почитал
0xDEADBEEF («dead beef», рус. мёртвая говядина) 
Вау!
Текстом по шестнадцатеричному. Это круче чем картина на матричном принтере))
29 фев 20, 10:28    [22089661]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10009
Что же вас древние бояны так забавляют???
29 фев 20, 10:32    [22089662]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
Basil A. Sidorov,
Лично меня? Я не был связан в каменном веке с компьютерами.
Только относительно недавно)
29 фев 20, 10:40    [22089663]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
PetroNotC Sharp
Basil A. Sidorov,
Лично меня? Я не был связан в каменном веке с компьютерами.
Только относительно недавно)

Только это не для возврата из функции. В конце концов такая константа тоже имеем право на существование.
Это мемори-филлер для неинициализированных участков памяти. Потом на дампе можно видеть где
ты облажался с доступом. Впрочем .. это было для unamaged языков. Поэтому в данном топике - неактуально.
29 фев 20, 12:06    [22089686]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
mayton,
Конечно. Там ведь фраза осмысленная человечья. Это по терии верояности реже чем 9999999 случайно метод выдал.
29 фев 20, 14:07    [22089715]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
Развивая идею. Из 4х миллиардов случайных файлов Java-classloader
сдетектирует 1 с сигнатурой 0xCAFEBABE и приступит к его загрузке.
Правда он обломится дальше по структуре байткода. Ведь маловероятно
что из шума сложится валидный JVM поток. Но и эта вероятность ненулевая.

Есть в этом что-то от Вавилонской библиотеки Борхеса верно?
29 фев 20, 14:18    [22089720]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3267
Андрей Панфилов
Valentin Kolesnikov
Совершенно точно при миграциях на новую версию spring-boot юнит тесты были полезными.


Valentin Kolesnikov
Проект пережил 2 большие миграции с spring-boot 1.5 -> 2.0 -> 2.2.


Давайте посмотрим чтоли....

Bump to the spring boot 2.2.0. (с версии 2.1.9) - каких-либо существенных изменений нет, миграция действительно большая...
Bump to the spring boot 2.1.1. (с версии 1.5.18) - тоже каких-либо существенных изменений нет, только переименование пакетов, зато хорошо видно, как в spring-data решили на запрос по ID возвращать Optional и все моки успешно развалились

В чем именно при миграции вам помогло ваше покрытие 96%, если у вас просто код не компилировался?

Что у вас тестирует, например, вот этот код:

@RunWith(MockitoJUnitRunner.class)
public class ReportPhotoFileResourceTest {
    @Mock
    private ReportPhotoFileService reportPhotoFileService;
    @InjectMocks
    private ReportPhotoFileResource reportPhotoFileResource;
    @Test
    public void findOne() throws Exception {
        when(reportPhotoFileService.findOne(eq("1"), eq(1L), eq(""), any(OutputStream.class)))
                .thenReturn(new ReportPhotoFileDTO());
        reportPhotoFileResource.findOne("1", 1L, "", new MockHttpServletResponse());
        verify(reportPhotoFileService).findOne(eq("1"), eq(1L), eq(""), any(OutputStream.class));
    }
    @Test(expected = IOException.class)
    public void findOne_with_error() throws Exception {
        when(reportPhotoFileService.findOne(eq("1"), eq(1L), eq(""), any(OutputStream.class)))
                .thenThrow(new IOException());
        reportPhotoFileResource.findOne("1", 1L, "", new MockHttpServletResponse());
    }
}


?

Valentin Kolesnikov

Юнит тесты вместе с sonarcloud и scrutinizer помогают выявить ошибки в приложении.


Вот здесь неправильно экранируется регулярное выражение:

        public String apply(Map<K, V> value) {
            final String evaluate = TEMPLATE_SETTINGS.get("evaluate");
            String result = template;
            for (final Map.Entry<K, V> element : value.entrySet()) {
                result = java.util.regex.Pattern.compile(evaluate.replace(ALL_SYMBOLS,
                    "\\s*\\Q" + element.getKey()
                    + "\\E\\s*")).matcher(result).replaceAll(String.valueOf(element.getValue()));
            }
            return result;
        }


с точки зрения безопасности неправильное экранирование - это всегда уязвимость, почему молчит Sonar Cube?
При этом Sonar Cube просто захлебывается от неправильного нейминга полей в сущностях, а вы вместо того чтобы реализовать собственную PhysicalNamingStrategy тупо его игнорите - зачем так жить?

+ еще там косяков навалом.

Складывается такое ощущение, что вы делаете так же как и ТС: сказали делать покрытие - делаем покрытие, сказали подключить sonar cube - подключили, сказали использовать flyway - используем


Исправил экранирование для регулярного выражения.

Хорошего вам дня!
3 мар 20, 05:51    [22091208]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2991
вам никто не говорил что все значения магические нужно в константы выводить с говорящим названием?

public void findOne() throws Exception {
when(reportPhotoFileService.findOne(eq( "1" ), eq(1L), eq(""), any(OutputStream.class)))
.thenReturn(new ReportPhotoFileDTO());
reportPhotoFileResource.findOne( "1" 1L, "", new MockHttpServletResponse());
verify(reportPhotoFileService).findOne(eq( "1" ), eq(1L), eq(""), any(OutputStream.class));
}
@Test(expected = IOException.class)
public void findOne_with_error() throws Exception {
when(reportPhotoFileService.findOne(eq( "1" ), eq(1L), eq(""), any(OutputStream.class)))
.thenThrow(new IOException());
reportPhotoFileResource.findOne( "1" , 1L, "", new MockHttpServletResponse());
}
}


5 раз только в одном куске кода из 10 строчек?

Сообщение было отредактировано: 3 мар 20, 12:26
3 мар 20, 12:23    [22091486]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3267
asv79,

Можно создать константу для "1".

Хорошего вам дня!
4 мар 20, 05:08    [22092149]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2991
Valentin Kolesnikov,
даже нужно,ваш код будет более читаем и нагляден ,а самое главное его будет в дальнейшем легко рефакторить
4 мар 20, 10:15    [22092240]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Чем замена 1 на константу сделает код более читаемым и нягляденым ?
А тем более, как это скажется на рефакторить ?

asv79
Valentin Kolesnikov,
даже нужно,ваш код будет более читаем и нагляден ,а самое главное его будет в дальнейшем легко рефакторить
4 мар 20, 10:25    [22092250]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
Если предположить что следующие тест будет findTwo() тогда introduce constant имеет смысл.
4 мар 20, 10:59    [22092272]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
andreykaT
Member

Откуда:
Сообщений: 2720
ну если уж на то пошло то "1" и "" выглядят в джавакоде стремно. почемуб не юзать стринг.емпти например? а один в кавычках да - однознчно говорящая константа.
4 мар 20, 11:25    [22092306]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
Дело в том что модульные тесты пишуться как английский текст. Есть такая практика.

+
Есть даже куча расширений на Scala/Gradle которые возводят тесты в ранг особого DSL
и требуют чтобы язык был специфицирован НЕ ДЛЯ программиста а для QA.

Есть фреймворки Cucumber/JBehave которые на уровне Java пробуют выдать тест за некий
англоязычный DSL который понятен читающему.

Тоесть читающий должен читать его сверху вниз без проглядывания деклараций.

В этом смысле Валентин прав и единичку можно оставить. Я-бы оставил чтоб читать сверху вниз.

Модульные тесты это вообще не программа. Это просто набор аксиом. Например (я пишу на гипотетическом DSL).

test() {
Given: 
   componentX = new ComponentX
When: 
   componentX receives value "1"
Then:
   componentX responses text "Hello"
And then:
   componentX responses code "OK"  
}


Тоесть я хочу чтоб вы поняли что текст модульного теста - это фрагмент документации по проекту.
И здесь рефакторинги класса introduce constant обычно не применяются.
4 мар 20, 12:31    [22092403]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
mayton,
Да. Для тестов интересная особенность. +1
4 мар 20, 12:47    [22092443]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Вот создал я "говорящую" константу MyClass.STRING_ONE, и что в ней хранится?
"1", "ONE", "One", "I", "единичка" или что-то еще?

Иногда один, это просто один. И делать из него константу, лично я смысла не вижу. Это как делать константу из числа 42.

Можно написать 42, а можно Universe.Answer_to_the_Ultimate_Question_of_Life_the_Universe_and_Everything. Смысл тот же самый, но букв больше ))) и понятности нифига не добавляет )))

Рефакторинг и покрытие тестами оно конечно хорошо. но не нужно в маразм скатываться.
4 мар 20, 12:54    [22092454]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
Бывает очень опасный рефакторинг когда вы с помощью Ide заменяете одну строчку (например "Order") на константу.
Пока всё в порядке. Потом оказывается что в системе был Ордер как табличка. И в других табличках был Ордер
как поле и были еще элементы Enum которые в себе содержали тип документа Ордер. Идет время. Далее бизнес
что-то меняет и табличка Ордер становится табличкой Documents но изменение константы final String ORDER="Documents"
во первых крашит приложение. Во вторых вводит еще целый слой вопросов. Теперь надо разбирать где был ТОТ ордер
а где НЕ ТОТ.

Не всегда случайное совпадение двух строк несет семантику единой константы.

Сообщение было отредактировано: 4 мар 20, 12:58
4 мар 20, 12:58    [22092458]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
SpringMan
Member

Откуда:
Сообщений: 140
Да в примере хотя бы локальные переменные добавить. Нифига же непонятно, что за 1L, "1", "". Где id, а где все остальное, и почему типы разные. Хотя тут вопросы больше к сигнатуре методов, почему reportPhotoFileService.findOne принимает несколько параметров разного типа.

Сообщение было отредактировано: 4 мар 20, 13:03
4 мар 20, 13:01    [22092466]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2991
andreykaT
" выглядят в джавакоде стремно. почемуб не юзать стринг.емпти

хорошее замечание
4 мар 20, 13:39    [22092522]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2991
Leonid Kudryavtsev
Чем замена 1 на константу сделает код более читаемым и нягляденым ?
А тем более, как это скажется на рефакторить ?

тем что констатнта ,которая правильн оформлена -читается гораздо лучше чем "1"
во вторых по нажатию я могую посмотреть все юседжи
далее в один клик я могу изменить ее значение во всех местах,вместо того ,чтобы искать где я там натыкал этих единиц
вы видимо не занимались глубоким рефакторингом чужого кода и тесты к нему не писали,а я второй месяц это делаю и скажу так ,что за эти литералы хочется бить лицо иногда
4 мар 20, 13:42    [22092530]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
asv79

вы видимо не занимались глубоким рефакторингом чужого кода

рефакторингом занимался

но если "глубокий" рефакторинг идет уже 2-ой месяц - может не кровати виноваты, а в бордели что-то поменять нужно

IMHO
4 мар 20, 13:50    [22092555]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4508
asv79
а я второй месяц это делаю
критика это твое хобби.
Но как надо обозвать единицу ты так и не написал.
Выше ляпнул что то про деньги.
4 мар 20, 13:51    [22092557]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Делал я переделку системы из классического IO в NIO, который дофига и больше чужого кода затрагивал. Код туда-сюда cut/paste по 100500 классов таскать пришлось....

Тесты практически _вообще_ не трогал - т.к. поведение системы от названия классов и способа работы с сетью никак меняться не должно. Как раз таки и добивался, что бы тесты не падали. (вроде ряд тестов падали, т.к. поведение в ряде мест изменилось /как минимум задержки/; но все ситуации изменения поведения тестов - шли исключительно через архитектора)

Наверное месяца 2-3 разбирался. Потом еще 1-2 дня код merge'или в git'е.

Но вот на константы и как они написаны - совершенно пофиг.
4 мар 20, 13:57    [22092574]     Ответить | Цитировать Сообщить модератору
 Re: unit-тестирование  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
asv79

вы видимо не занимались глубоким рефакторингом чужого кода и тесты к нему не писали

вот совершенно не понимаю, как __рефакторинг__ затрагивает тесты
и какие можно написать тесты К РЕФАКТОРИНГУ

Тесты должны корректность работы (функционирование) проверять. Как внутри организован код (рефакторинг) по определению на поведение тестов сказать не должно

На то они и тесты.

А если от реорганизации внутреннего кода, приходится менять тесты .... что эти тесты проверяют?

Как забиты константы в коде: хоть константами, хоть строчками, хоть числами в unicode - для теста должно быть глубоко пофиг. Т.к. от этого поведение кода ну поменяться никак не может. "Черный ящик" вроде никто не отменял. А если тесты пишутся так, что покрывают конкретную реализацию - то это не тесты, а профанация. Подгонка результата под нужный ответ.
4 мар 20, 14:03    [22092583]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 13 14 15 16 17 18 [19] 20 21 22   вперед  Ctrl
Все форумы / Java Ответить