русский
Germany.ruForen → Архив Досок→ Programmierung

Юнит тесты для "системного" приложения

2301  1 2 3 4 5 6 7 8 9 alle
Murr патриот21.04.21 13:41
Murr
NEW 21.04.21 13:41 
in Antwort AlexNek 21.04.21 11:32

как я буду принимать данные с ошибками

------

А у меня задача какая-то другая? безум

AlexNek патриот21.04.21 14:11
AlexNek
NEW 21.04.21 14:11 
in Antwort Murr 21.04.21 13:41
А у меня задача какая-то другая?

Видимо да, если ты собираешься тестировать передатчик, а не приёмник.

koder патриот21.04.21 17:53
koder
NEW 21.04.21 17:53 
in Antwort AlexNek 21.04.21 11:32
В моём случае задача - приложение не должно вылетать при любых ошибках в источнике.Поэтому что и как выдает источник меня не волнует. Меня волнует, как я буду принимать данные с ошибками.

О! И если данные приходqт как текст, а ты конвертируешь его в обьект, то должен предусмотреть стандартные возможности - строка пустая или несуществует, строка не может быть конвертирована. И написать юниттесты для этих случаев, как реагирует твой код.

AlexNek патриот21.04.21 21:06
AlexNek
NEW 21.04.21 21:06 
in Antwort koder 21.04.21 17:53
И написать юниттесты для этих случаев, как реагирует твой код

А кто с этим спорит? Так и было сделано.

Murr патриот21.04.21 22:33
Murr
NEW 21.04.21 22:33 
in Antwort AlexNek 21.04.21 14:11

собираешься тестировать передатчик

------

Черный ящик без документации... не тестировать, а мокать... Как?

koder патриот22.04.21 07:36
koder
NEW 22.04.21 07:36 
in Antwort Murr 21.04.21 22:33
Черный ящик без документации... не тестировать, а мокать... Как?

Элементарно. Какое то представление о черном ящике все таки есть. Ну все публичные методы там присутствуют. С описанием параметров вызова и checked исключениями.


Именно это и мокаем. Мок должен уметь принимать те параметры, какие есть у реального обьекта и возвращать то, что возвращает реальный обьекt


Murr патриот22.04.21 14:55
Murr
NEW 22.04.21 14:55 
in Antwort koder 22.04.21 07:36

и возвращать то, что возвращает реальный обьекt

------

Именно этого мы как раз и не знаем...

koder патриот23.04.21 05:55
koder
NEW 23.04.21 05:55 
in Antwort Murr 22.04.21 14:55, Zuletzt geändert 23.04.21 05:55 (koder)
Именно этого мы как раз и не знаем...


Ну во первых мы точно знаем тип данных того, что возвращает обьект. Точно.

Во вторых мы знаем, что делать с тем, что возвращает обьект. Точно.


Поэтому тесты это реакция, как правильно реагирует НАША система на все мыслемые комбинации того, что возвращает чужой обьект. И мок это будет то, как мы себе это представляем.


Например чужой обект возвращает стринг. Значит наш мок должен уметь возвращать и null. И пофиг, может это делать настоящий обьект или нет


Напримет чужой обект возвращает обьект класса. Значит наш мок должен уметь возвращать и налль и недоинициализированный обьект класса. И пофиг, может это делать настоящий обьект или нет

Murr патриот23.04.21 06:29
Murr
NEW 23.04.21 06:29 
in Antwort koder 23.04.21 05:55

обект возвращает стринг

-----

Как это замечательно, когда есть стринг! Буковки, циферьки, длина - так много информации с которой можно работать...

А как насчет какого-то двойчного набора слегка перемежаемого прерываниями? смущ

Да и со строками Я как-то обрисовывал весьма проблемный вариант - ЗигБии называется... безум

Программист коренной житель23.04.21 08:18
NEW 23.04.21 08:18 
in Antwort koder 23.04.21 05:55
Ну во первых мы точно знаем тип данных того, что возвращает обьект. Точно.
Во вторых мы знаем, что делать с тем, что возвращает обьект. Точно.

Выдыхай уже :) Murr просто не знает, что такое "черный ящик" улыб

koder патриот23.04.21 11:11
koder
NEW 23.04.21 11:11 
in Antwort Murr 23.04.21 06:29
А как насчет какого-то двойчного набора слегка перемежаемого прерываниями? смущДа и со строками Я как-то обрисовывал весьма проблемный вариант - ЗигБии называется...

В меру своей фантазии. Черный ящик возвращает что то. Ты точно знаешь, что с этим делать. Иначе ты вообще не можешь его использовать. Ты ТОЧНО знаешь, какие проблемы могут возникнуть, иначе ты не подготовил СВОЙ код и что же ты собираешься тестовать? Вот мок и возвращяет то, что ты ожидаешь. Все мыслимые варианты. Немыслемые и неожиданные не нужны, ты все равно не готов в своем коде их отрабатывать.


Буковки, циферьки, длина - так много информации с которой можно работать...

Именно. Если твой код имеет 100500 вариантов реакции на различные варианты - нужно 100500 вариантов поведения мока. Да, тесты рисовать может быть затратно по времени.

Murr патриот23.04.21 12:12
Murr
NEW 23.04.21 12:12 
in Antwort koder 23.04.21 11:11

Ты ТОЧНО знаешь, какие проблемы могут возникнуть

-----

Ошибаешься.

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

Какие проблемы могут возникнуть?


иначе ты не подготовил СВОЙ код и что же ты собираешься тестовать?

-----

А почему Я должен его подготовить? У меня новомодное ТДД - сначал надо написать все тесты, а потом подгоняем под них код...


Вот мок и возвращяет то, что ты ожидаешь.

-----

Так Я не знаю что ожидать.

И доки не помогают т.к. не описывают ситуацию с достаточной полнотой.

Получить хоть какое-то понимание того что будет получатся, когда будет получатся, когда не будет получатся можно только серьезно протестив то с чем надо работать. И то не все сразу отловишь...



имеет 100500 вариантов реакции

-----

Мне, в большинстве случаев, хватает двух - принято и отвергнуто.

А вот какое из них будет - фиг его знает - даже написав корректный код по заданию получается что что-то работает не так как надо...

AlexNek патриот23.04.21 12:38
AlexNek
NEW 23.04.21 12:38 
in Antwort Murr 23.04.21 12:12
в доках написано - получешь текстовое сообщение из двух частей

Ну если хоть что то написано, то это меняет дело. Тут уже чистая комбинаторика

Текст/ не текст/ничего

Одна часть/2/больше


А то что документации недостаточно, это никак не меняет дело с одним набором данных.

Можно его тестировать и изучать сколько угодно, но нет никакой гарантии что другой набор даст где то такие же результаты.

Должны быть некие соглашения и определенные рамки изменения данных.


Murr патриот23.04.21 13:10
Murr
NEW 23.04.21 13:10 
in Antwort AlexNek 23.04.21 12:38

это никак не меняет дело с одним набором данных.

-----

Хи-хи...

В той сети которую Я упомянул до набора данных еще надо дойти.

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


Тут уже чистая комбинаторика

-----

Угу... Я сначала тоже так подумал... оказалось - зря.

Среди упомянутых нет как минимум еще двух-трех опций...

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

На тестирование кода они мало влияют - ну не нашел и не протестил... но гробят обработку на раз... пустяки - подумаешь кто-то загнется от сердечного приступа об котором изначально было сообщение...



Должны быть некие соглашения и определенные рамки изменения данных.

------

Хи-хи... Ты хочешь другой протокол поверх или в дополнение к имеющемуся.

Увы - для этого надо поменять устройство... а после смены оно подлежит повторной сертификации... а на это никто не пойдет.

AlexNek патриот23.04.21 13:27
AlexNek
NEW 23.04.21 13:27 
in Antwort Murr 23.04.21 13:10
В той сети которую Я упомянул до набора данных еще надо дойти.

Доступность набора данных - это вообще совершенно другая проблема.


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

А зачем их тогда вообще получать, если о них знать?


но гробят обработку на раз

Ну так дело в обработчике. Если правильно написано, то вне зависимости от исходных данных ничего не должно упасть.


Ты хочешь другой протокол поверх или в дополнение к имеющемуся.

Нет, только лишь нормальное описание имеющегося.

koder патриот23.04.21 13:43
koder
23.04.21 13:43 
in Antwort Murr 23.04.21 12:12
А почему Я должен его подготовить?

Потому что неважно с чего ты начинаешь, с тестов или с кода. Ты должен знать, что нужно сделать. Если не знаешь - то ничего делать не надо.


получешь текстовое сообщение из двух частей - длинны текста и самого текста в виде одной строки, где длинна указана в начале и отделена пробелом от остального текста.Какие проблемы могут возникнуть?

Ну получил ты стринг. Ок. Это просто строка. Твой следующий шаг? Что ты будешь со строкой делать?

Так Я не знаю что ожидать.

Тогда ничего не делай. Что ты собираешься программировать, если ты ВООБЩЕ ничего не знаешь? Если ты вообще не знаешь, что придет с черного ящика, ты физически не можешь с ним работать.


т.к. не описывают ситуацию с достаточной полнотой.

Ты можешь запрограммировать (речь идет о исполнении задания) только на ту глубину, насколько ты знаешь "черный ящик". Именно эту глубину ты можешь покрыть тестами, неважно до имплементации задания или посл. Неважно с моком или с реальным обьектом.


Получить хоть какое-то понимание того что будет получатся, когда будет получатся, когда не будет получатся можно только серьезно протестив то с чем надо работать.

Мок - это имитация реального обьекта насколько ты его понимаешь. Слово "серьезно" это несерьезно. Например у тебя неполное понимание работы обьекта и ты слепил мок. Ок. мок несовершенен. Ты "серьезно" гонял настоящий обьект, что бы понять. Ты можешь гарантировать, что понимание теперь 100%? Если нет, то твой мок лучше предыдущего, но принципиально то же самое - то, что он будет копией реального обьекта ты гарантировать не можешь.


Но это и не надо. Еще раз. Ты не учишисья работать с реальным обьектом - "черным ящиком" используя мок. Ты тестируешь СВОЙ код на все известные тебе варианты поведения реального "черного ящика".

Мне, в большинстве случаев, хватает двух - принято и отвергнуто.

Это варианты поведения твоего кода. Вариантов поведения мока больше. Например твой пример для составной строки. Мок прислал пустую строку - отвергнуто-тест прошел. Мок не ответил в таймаут. Мок прислал сообщение о ошибке. Мок прислал строку, где длина в буквах. Мок прислал строку без разделителя. Везде твой код должен отреагировать правильно, пусть одним вариантом реакции, но на 100500 вариантов ответа мока.

Murr патриот23.04.21 18:46
Murr
NEW 23.04.21 18:46 
in Antwort AlexNek 23.04.21 13:27

А зачем их тогда вообще получать, если о них знать?

------

Их в документации нет, но они иногда случаютя...

и докопаться до них можно только при очень дотошном исследовании...


Если правильно написано, то вне зависимости от исходных данных ничего не должно упасть.

-----

Да ну? Там сеть без квитирования и без гарантии доставки...


только лишь нормальное описание имеющегося

------

Нормальное - есть. Но оно не покрывает фактическую работу устройства.

Мало того - при тестировании единичного устройства многое просто не видно.

Murr патриот23.04.21 19:19
Murr
NEW 23.04.21 19:19 
in Antwort koder 23.04.21 13:43

Если не знаешь - то ничего делать не надо.

-----

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


Твой следующий шаг?

-----

По документации - вырежу данные и буду с ними работать.

По факту - будет существенно сложнее. Причем настолько, что сразу не понять ни какие проблемы, ни откуда они, ни как с ними разбираться.

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



Что ты будешь со строкой делать?

-----

Вот это Я у тебя хотел узнать. смущ



ты физически не можешь с ним работать

------

А код надо сдавать и он должен быть рабочим.



только на ту глубину, насколько ты знаешь "черный ящик"

------

Т.е. ровно на столько, сколько написано в документации.

Написанное по документации в практической среде работать не будет.



Ты можешь гарантировать, что понимание теперь 100%?

-----

Нет. Но Я могу поднять понимание с 20% соответствующих документации до 97% соответствующих реальной системе.

Оставшиеся 3% Я все одно не смогу получить от устройства/среды, но могу хоть как-то интерполировать полученные из опыта 77% и задавить еще 2.9%.

Это уже будет неплохой результат. Очень даже хороший по сравнению с исходным. И даже где-то приемлемый.

Где-то, но не везде.

По секрету скажу - уже где-то с 50-60% эффективное решение будет не на уровне кода, а на уровне инфраструктуры - об этом ты вообще пока не задумывался... и даже после прочтения документации эти идеи не появятся.



твой код должен отреагировать правильно

-----

Угу. Осталось выяснить сааамую простую вещь - правильно в соответствии с документацией т.е. в 20% случаев, или правильно в соответствии с реальной ситуацией т.е. 97%.

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

Программист коренной житель23.04.21 19:44
NEW 23.04.21 19:44 
in Antwort koder 23.04.21 13:43
Ты можешь запрограммировать (речь идет о исполнении задания) только на ту глубину, насколько ты знаешь "черный ящик".

Нет и не может быть никакого глубинного знания "черного ящика". У "черного ящика" есть только вход и выход. Как из входа получается выход - магия.

Меня удивляет, что об этом приходится говорить.


AlexNek патриот23.04.21 19:48
AlexNek
NEW 23.04.21 19:48 
in Antwort Murr 23.04.21 18:46
Их в документации нет, но они иногда случаютcя

Тогда получается, что мы о них не знаем.


Там сеть без квитирования и без гарантии доставки

У меня складывается впечатление что мы обсуждаем разные вещи.

Ты - свою бывшую проблему.

Я - просто данные

Сеть - это уже способ доставки данных.

Ну и способ доставки данных никак не связан с самими данными.

Это будет интересно только при приеме конкретного пакета.


Было бы интересно "увидеть" пример правильно спроектированного класса для приема данных, который падает при неправильных данных смущ


Нормальное - есть. Но оно не покрывает фактическую работу устройства.

Тогда это неполное описание. Другими словами ненормальное.


при тестировании единичного устройства многое просто не видно

Ну именно это я имел в виду, говоря про единичный набор данных.

И работа устройства это совсем не то, что мы рассматриваем - прием каких либо данных.

1 2 3 4 5 6 7 8 9 alle