Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Привет. Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ? Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами. Поправьте, дополните если считаете по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 14:42 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekПривет. Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ? Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами. Поправьте, дополните если считаете по другому. да вроде мысль верная, 1 класс, 1 задача. 1ый класс "А" читает, другой класс "Б" пишет или класс "С" генерирует данные, а класс "Б" пишет. класс должен быть абстрактным от остальных, такой класс и протестировать труда не составить и применить там, где он потом понадобится тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 14:55 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Навскидку: 1. Протестировать зависимость от _someField 2. Проверить что метод действительно пишет в файл 3. Зафиксировать контракт на крайние случаи: пустой text, пустой path, длинный text, длинный path 4. Зафиксировать поведение при ошибках: что будет, если запись не удалась, что будет если path некорректный То есть сразу 8 тест кейсов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 15:16 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Grunch, Вот у меня вопрос. Код вида "метод действительно пишет в файл" вообще покрывается тестами ? А если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы. Так же и с файлом. Тест может отвалится сам, если, к примеру, каталога нету - а он записывает в файл. В этом случае падает ошибка - нужно создавать каталог. Кто будет создавать каталог перед выполнением теста ? Тест, или метод который записывает в файл - но во втором случае это уже не его же задача? Вот я прихожу к мнению, что такие классы не покрыть тестом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 16:25 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekА если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы. В одной транзакции все делаешь, потом откатываешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 18:47 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 19:27 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Вот как раз вы и предлагаете делать интеграционные тесты - запись в файл, в БД и пр. А мой вопрос как покрывать тестами класс работающий с неуправляемыми ресурсами ? Имеет ли это вообще смысл ? Прихожу к мнению, что нет. мы не контролируем физический ресурс - там что угодно может произойти, вплоть до того, что тест отвалится из-за того, что SQL запрос отвалится по таймауту из-за того, что какой-то юзер (или система) в этот момент запустит сложный отчет. С жестким диском такая же ерунда. Там что угодно может наложится. Мне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Вообще не тестировать работу с физическими устройства - полагаясь на разработчиков написавших эти классы (для работы с БД, с файлами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 20:15 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekВот как раз вы и предлагаете делать интеграционные тесты - запись в файл, в БД и пр. А мой вопрос как покрывать тестами класс работающий с неуправляемыми ресурсами ? Имеет ли это вообще смысл ? Прихожу к мнению, что нет. мы не контролируем физический ресурс - там что угодно может произойти, вплоть до того, что тест отвалится из-за того, что SQL запрос отвалится по таймауту из-за того, что какой-то юзер (или система) в этот момент запустит сложный отчет. С жестким диском такая же ерунда. Там что угодно может наложится. Мне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Вообще не тестировать работу с физическими устройства - полагаясь на разработчиков написавших эти классы (для работы с БД, с файлами). Не понял, чем Вас интеграционные тесты не устраивают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2016, 22:40 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Да, можно тестировать отдельно бизнес-логику работы приложения от логики работы с внешними ресурсами. При этом при тестировании эмулировать работу с внешними ресурсами, например, вместо записи в БД писать логи, ничего не делать, откатывать транзакции (некрасиво) или еще чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 04:43 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekМне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Попробуйте протестировать логику апдейта в базе, когда обновляемая запись заблокирована другой сессией, и ваш апдейт отваливается по таймауту (или, что еще веселее, бесконечно ждет). Этот так, навскидку, подобных примеров можно накидать еще с десяток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 06:24 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekGrunch, Вот у меня вопрос. Код вида "метод действительно пишет в файл" вообще покрывается тестами ? А если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы. Так же и с файлом. Тест может отвалится сам, если, к примеру, каталога нету - а он записывает в файл. В этом случае падает ошибка - нужно создавать каталог. Кто будет создавать каталог перед выполнением теста ? Тест, или метод который записывает в файл - но во втором случае это уже не его же задача? Вот я прихожу к мнению, что такие классы не покрыть тестом. Тесты фиксируют требования. То есть, если метод должен только писать в файл и не должен создавать каталоги, значит надо это требование зафиксировать тестом. То есть ожидать, что при вызове метода с указанием несуществующего каталога произойдет исключение. С БД тоже самое, попытались записать - попытались прочитать. Что там происходило в базе нас мало волнует. В любом случае, можно сделать хотя бы примитивные положительные тесты, проверку того что в некоторых идеальных условиях все проходит как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 10:15 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Сон Веры ПавловныProBiotekМне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Попробуйте протестировать логику апдейта в базе, когда обновляемая запись заблокирована другой сессией, и ваш апдейт отваливается по таймауту (или, что еще веселее, бесконечно ждет). Этот так, навскидку, подобных примеров можно накидать еще с десяток. ну так это мои слова же ! Я же именно это и написал выше. Что не вижу как можно писать тесты вокруг неуправляемых C# ресурсов. А мне вот тут предлагают альтернативу - интеграционные тесты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 11:21 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAНе понял, чем Вас интеграционные тесты не устраивают? Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 11:22 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 11:38 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekskyANAНе понял, чем Вас интеграционные тесты не устраивают? Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить. А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами. В Вашем примере модельными тестами надо покрывать то, что использует метод Write. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 12:05 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
PallarisProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится. мне кажется, ТС не об этом спрашивает. действительно, вот так просто такой тест не написать. надо для этого фиксировать железо, ось. при этом в железе и оси создать соответствующие характерные состояния (нагрузить параллельной работой, заставить какие-то процессы работать с диском, с тем же файлом и т.п.), и для этих состояний делать прогоны. и тогда по статистике прогонов судить о положительности/отрицательности тестов. стоимость такого тестирования - космическая. и место ему - для ПО космических аппаратов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 12:07 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
PallarisProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится. Ну вот. В принципе именно это я и написал в первом посте: ProBiotekМое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами. Поправьте, дополните если считаете по другому. Я хотел это обсудить, может быть услышать другое мнение. Хорошо. Значит я правильно понимаю как покрывать тестами правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 13:03 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekЯ хотел это обсудить, может быть услышать другое мнение. Хорошо. Значит я правильно понимаю как покрывать тестами правильно. Если речь идет именно о юнит-тестировании, где мы проверяем внутреннюю логику работы класса - да, этого достаточно. Если же речь идет о тестировании взаимодействия многих компонентов (т.е интеграционное тестирование), где некая сущность ждет наличия файла с определенным содержимым - таки придется создавать файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 13:57 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotek, Писать тесты еще хоть как то можно для чистых функций. Если взаимодействуешь с внешним миром, лучше сосредоточится на создании проверок, перехватывании ошибок и логировании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 15:33 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВProBiotek, Писать тесты еще хоть как то можно для чистых функций. Если взаимодействуешь с внешним миром, лучше сосредоточится на создании проверок, перехватывании ошибок и логировании. ну, а как тестировать автопилот, например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 17:54 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekPallarisпропущено... Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится. Ну вот. В принципе именно это я и написал в первом посте У Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 18:11 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
fsharp_fsharp ну, а как тестировать автопилот, например? А как тестировать компилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 18:39 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВfsharp_fsharpну, а как тестировать автопилот, например? А как тестировать компилятор? ну, вот тут и закончим дальше только стенды с натурными испытаниями, если они возможны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 18:45 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Задача протестировать не реализацю IStorage, а класс, который его использует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 18:58 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
PallarisskyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Задача протестировать не реализацю IStorage, а класс, который его использует е маё, вот оно чё. так уже сказали как. надо класс писать так, чтобы внешние зависимости в него инжектировались: заменить моками обращения к внешним зависимостям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 19:10 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Нету. IStorage тут нужен не для того, чтобы иметь различные реализации. А для того, чтобы разорвать зависимости между классами и тестировать их отдельно. И если класс логикой еще понятно как тестить (моки, стабы) то вот класс непосредственно читающий/пишущий файл наверное не протестить. Просто хотелось услышать мнения о том как быть с юнит-тестами в условиях неуправляемых ресурсов. В принципе я для себя понял что такие классы остается делать минимально простыми и полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 19:23 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekи полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как). нет, если у Вас есть необходимость тестирования, это Ваши проблемы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 19:30 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
PallarisskyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Задача протестировать не реализацю IStorage, а класс, который его использует Посмотрите первое сообщение в топике, у ТС класс непосредственно пишет в файл. Это и есть на мой взгляд реализация IStorage для файловой системы. А про "протестировать не реализацю IStorage, а класс, который его использует" я уже писал: 19632216 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 20:23 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
если речь идет о модульных тестах: 1) создаете свой интерфейс, например IFileSystem с методом, сигнатура которого один в один повторяет сигнатуру File.WriteAllText (path, text) 2) в своем коде указывайте зависимость от этого интерфейса и используете 3.1) сам интерфейс IFileSystem реализуете в виде FileSystemWrapper внутри которого тупо делегируете вызов к методу к File.WriteAllText (т.к. метод WriteAllText в классе File статический) 3.2) в ином случае, например класс WebClient (где методы не статические) даже делегировать ничего не нужно, просто создаете интерфейс IWebClient и класс WebClientWrapper который наследуете от WebClient и IWebClient 4.1) в IOC контейнере указываете что IFileSystem реализован как FileSystemWrapper 4.2) в модульных тестах мокаете IFileSystem и ждёте что метод WriteAllText будет вызван имхо, както так ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 21:47 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
depend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 22:44 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВ, возможно так и есть, напоминает "эволюцию Hello World" ) однако, ТС спросил - как протестировать его код, я привел пример как, с разделением обязанностей - бизнес логика его кода, в числе прочего, требует чтобы в файл был записан некий текст - текст записывается, юнит тест это проверяет, "физически" процесс записи вынесен в отдельный класс который можно проверить интеграционным тестированием и многократно использовать я считаю, что абстрагирование любых нативных объектов (системных часов, файловой системы, сети и т.д.) - это хорошо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 23:28 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВdepend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. Или как про факториал . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 02:51 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Присоединяюсь. Считаю, что создавать сущности только ради облегченного юнит-тестирования - это плохая практика. Но юнит-тесты писать все-таки нужно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 05:37 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.Ну вызови этот метод, проверь созданный файл на правильность, потом удали файл. Заодно проверишь на закрытие файла. Что тут обсуждать? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:22 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
AnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:35 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAProBiotekпропущено... Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить. А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами. В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:37 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? Видимо, намного красивее - руками править изменения, держа в голове все триггера (если есть). Или после каждого теста базу восстанавливать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:38 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Алексей КskyANAпропущено... Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить. А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами. В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:39 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAАлексей Кпропущено... Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать.ТС скорее запутали, чем что-то выяснили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 09:41 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Сон Веры ПавловныИли как про факториал . Статья очень полезная, но никак не освещена тема юнит-тестирования полученных функций! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 10:11 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Сон Веры ПавловныЕвгенийВdepend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. Или как про факториал . Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 19:16 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikronСон Веры Павловныпропущено... Или как про факториал . Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 19:31 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной. После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно. А есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ? Я для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 21:45 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
fsharp_fsharpmikronпропущено... Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2016, 21:49 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekАлексей Кпропущено... Чем некрасиво? Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной. После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно.Зачем, например, мне думать про проблемы с Ораклом, если я работаю с MSSQL? ProBiotekА есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ?Это чем мешает? Это наоборот хорошо. Счётчики в реальном сервере тоже постоянно растут, в тесте это должно быть учтено. ProBiotekЯ для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает.Рад, что у тебя всё получается. зы: Если есть необходимость и возможность тестировать на реальной БД, то нужно тестировать на реальной БД. Не забываем, что в БД могут быть FK, CK и т. п., которые тоже контролируют правильность работы программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 04:23 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikronfsharp_fsharpпропущено... никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 06:30 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Юнит-тест - он как FK и CK у таблички ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 06:35 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Перегонщик перекупкиmikronпропущено... Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. Не надо демагогии и не путайте общее с частным. Наличие ТЗ и спецификации продукта (или программного модуля) не одно и тоже что спецификация каждого метода. А именно методы вы тестируете. Или вы до сих пор только реализовывали методы, которые вам специфицировали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 10:38 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekПривет. Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ? Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами. Поправьте, дополните если считаете по другому. в вашем классе 2 ответственности 1. выбрать способ записи 2. выполнить запись поэтому вы и не можете написать тест - они сигналят об ошибке в архитектуре. решение может быть таким - задачу записи вынести в отдельный класс(интерфейс) то есть будет 2 класса 1. выбор способа записи WriteModeSelector 2. физическая запись FileWriter:IFileWriter 1 класс нужно тестировать при помощи moq объекта. в метод Write класса WriteModeSelector передавать ссылку на IFileWriter (или завести для него свойство), в котором два разных метода писания файлов. экземпляр IFileWriter сформировать как заглушку. тест будет заключаться в том, что при выполнении условия _someField вызывался метод IFileWriter.WriteSimpleFile в противном случае вызывался метод IFileWriter.WriteUTF8File. тест на физическое создание файла можно делать отдельно для FileWriter.WriteSimpleFile и FileWriter.WriteUTF8File как то вот так - работу с внешними устройствами надо скрыть за интерфейсами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 10:49 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikronПерегонщик перекупкипропущено... не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. Не надо демагогии и не путайте общее с частным. Наличие ТЗ и спецификации продукта (или программного модуля) не одно и тоже что спецификация каждого метода . А именно методы вы тестируете. Или вы до сих пор только реализовывали методы, которые вам специфицировали? вижу, что объяснять Вам, похоже, бесполезно. не считаете нужным писать юнит-тесты - хозяин барин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 12:23 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
monstrU, я так и понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2016, 13:51 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
был несколько дней в отпуске - тема вниз ушла :). автор темы для примера использования неуправляемых ресурсов предложил задачу - запись в файл. и возникло мнение, что надо "просто в файл записать " да и все. предложу задачу сложнее. поступило от заказчика такое задание: необходимо клиентам рассылать текстовые сообщения по модему. клиенты находятся в Москве и Петербурге. Клиентам из Москвы надо рассылать сообщение по модемам фирмы Zyxel, клиентам из Петербурга- по модему Yota. какую архитектуру решения предложите? какие задачи каким логическим слоям выделять будете? что тестировать? и как? то есть по-простому просто "послать сообщение по модему " не прокатит, так как это отдельная аппаратно-программная задача. причем профессиональный архитектор-разработчик должен учитывать, что появятся другие города, другие фирмы производители модемов. как быть, если потребуется посылать не только текстовые сообщения, но и мультимедийные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 13:48 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
monstrU, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Теперь Worker спокойно тестируется через передачу мока/стаба ISender. Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками". Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :) Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент. PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 14:15 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotek, Абстракция интерфейса Sender здесь почти задана автором, в остальном же архитектурный bullshit. Почему интерфeйс а не абстрактный класс? наверняка некоторые методы будут общими. Worker.Send (ISender sender, string message) это вообще с ходу code smell - feature еnvy. И самое главное, вы решаете с энтузиазмом фиктивную задачу. см.ниже monstrU, В такой постановке надо настрочит две строчки, один раз самому протестироватъ на железе и забит болт на тесты. сначала две строчки: Код: c# 1. 2. всё остальное что вы напридумывали про должен архитектор-разработчик полная ересть и подлежит анафеме. Теперь по пунктам. В такой постановке задачи практически нет функциональных требований а тот минимум что есть, покрывается двумя приведенными строчками кода. По хорошему надо уточнить, должна ли гарантироваться доставка, поведение в случае ошибки, временнее параметры, через сколько устройств будет проиусходитъ отправка, где берутся эти сообщения, как протоколируюется отправка, наличие паралельных процессов и в этом духе. когда эти требования будут названы именно они подлежат тестированию. а затребованные две строчки кода можно конечно тестировать, но это ментальный онанизм и пустая потеря времени. 1. спекуляции о дальнейшем развитии и как следствие "gas factory" - design anti-pattern. 2. тест вам не принесёт никаких приемуществ. Ваш софт не станет ни лучше ни надёжнее. А электричество можно с большим толком пользовать. Я исхожу из того, что вы будете обкатывать и тестировать минимум один раз на железе для обкатки "ATM команд". после этого теста автоматическое юнит-тестирование бесполезно. ничего не меняется. Если же изменятся требования, то вам придётся например реализовывать передачу картинки, то вы опять будете отлаживать на железе и старый тест вам ничем не поможет. всё написаное - ИМХО, без претензии на правду в последней инстанции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 15:55 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikron, вы предлагаете сделать один класс, который будет Код: c# 1. ? Нарушение SRP - один класс на 2 вещи. Правильней сделать базовый класс отправляющий сообщение в порт, а наследники должны хранить эти строки (через protected свойство наверное). тогда можно без ifов вообще. Замена условного оператора полиморфизмом Не путайте интерфейс и базовый класс. Интерфейс передается тому кто будет его использовать - а базовый класс это способ реализации. Детали реализации. Интерфейс как раз нас отделяет от таких деталей. Тот кто использует интерфейс он даже не должен знать что там разные классы внутри у которых может быть один базовый класс. Интерфейс позволяет сделать 3 разных класса, 2 их которых будут произрастать от одного предка, а третий вообще левый, сторонней конторой написанный но поддерживающий интерфейс. PS. тестировать интерфейс через моки/стабы всяко легче чем базовый класс. У базового класса внутри логика, которая может неприятно сработать так что при вашем тесте будет отправляться реальное сообщение на почту. Замокав интерфейс будете уверены что проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 16:12 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotek, вы не поняли мой поинт. Ваши архитектурные ментальные построения вообще не нужны. надо просто написать две строчки кода. При оооочень большом желании можно оформить их как функцию. задача решена. точка. Все ваши классы и интерфеисы - не требуются. Это только спекуляция. Если вы не согласны, огласите хоть одно требование, которое объясняет их сушествование. И я вам приведу пару аргументов, почему приведённый код - вреден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 16:26 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikron, Топик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо. Завтра у вас появится третий модем и нужно будет менять эту строчку Код: c# 1. Вы отдадите эту мелкую задачу студенту ("ну сделай по подобию, делов на 5 минут") и он внесет ошибку. Тест на такой код не написать, раз он работает с реальным оборудованием напрямую через port.Send. И вас повалятся ошибки в программе в самый неожиданный момент. Работу непосредсвенно с железом максимально минимизировать, чтобы вместо Код: c# 1. стало Код: c# 1. Ибо в вашем варианте студент тоже конечно сделает ошибку. С такой кучей реплейсов :) Ваш вариант конечно тоже рабочий, но это возможный спагетти-код в будущем. Когда 2 строчки только такие, это не страшно. Но если все приложение состоит из такого кода, то - фиг покроешь тестами - очень страаашно добавлять функционал. Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel". Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу". Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов. А ваше решение как использовать для тестирования других классов ? В общем будет у вас такой код для нового модема: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. Переписывать же нету времени старый код - потом же все тестировать с нуля. Прикручиваем костыль. В лучше случае сделаете так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. получили дублирование кода. А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. При этом ZyxelSender и YotaSender смогут иметь общий базовый класс, а новый модем будет построен на отдельной иерархии классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 16:58 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikron, тут тоже хорошо описано (хороший сайт с видео для каждого вида рефакторинга) Замена условного оператора полиморфизмом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:18 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotek, тут вас поддерживаю. даже если в системе будут пользоваться только два модема и в обозримом будущем новые добавляться не будут, то на написание масштабируемой архитектуры уйдет немного времени. в живой системе требования все время расширяются, и если применять подход "тяп ляп и в продакшен" потому что сегодня не надо, то завтра получишь неподдерживаемую систему со спагетти кодом. так что если вы точно уверены, что систему сопровождать не будете - то "тяп ляп" наверно подойдет, но что то редко такое случается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:29 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekmonstrU, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Теперь Worker спокойно тестируется через передачу мока/стаба ISender. Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками". Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :) Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент. PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа. Что есть Worker? Что есть Message? Конфигурация где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 21:57 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
И где собственно связь Москвы с Zyxel, а Питера с Yota? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 21:59 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekТопик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо. Вы повторяете догмы и с упорством носорога игнорируете что я говорю. Две строчки кода (или "мой код" если угодно) вообще не надо тестировать. Под тестировать в конкретном контексте подразумевается покрытие юнит тестами и их автоматизация. ProBiotek Завтра у вас появится третий модем и .... Спекулятция Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ... Спекулятция Ибо в вашем варианте студент тоже конечно сделает ошибку... Спекулятция Ваш вариант конечно тоже рабочий Пункт , но это возможный спагетти-код в будущем. Спекулятция Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel". пустые лозунги и догмы за отсутствием мыслей. Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу". Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов. Домыслы и фантазёрство. А ваше решение как использовать для тестирования других классов ? Никак. Оно решает поставленную задачу а не ваши фантазии. .... получили дублирование кода. А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было. Прогчее фантазёрство. Подводя итог мы видим: 1. вы признаёте, что две строчки решают поставленную задачу 2. вы не привели ни одного аргумента, почему поставленная задача требует более сложного архитектурного решения. 3. нафантазировали варианты развития событий и именно ими мотивируете архитектурный онанизм. Так как других аргументов кроме плодов вашей фантазии у вас нет давайте рассмотрим риски развития событий. ProBiotekЗавтра у вас появится третий модем и .... Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку. Это я вам по доброму. А можно и за вредительство наказать. Во вторых, по опыту, вероятность наступления этого события я бы оценил не более 2%. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку. И кому нужен этот зоопарк? Другими словами даже если третий модем дешевле экономически выгодней возможно купить ещё один из уже поддерживаемых. ProBiotekЗавтра у вас появится третий модем и .... Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ... Ибо в вашем варианте студент тоже конечно сделает ошибку... Если же наступит этот вариант, то затраты на удаление двух строчек кода минимальны. Затраты на архитектурное решение предложенное вами - те-же. Элементарная математика показывает что вы просто тратите ресурсы в пустую. Затраты архитектурного онанизма сразу >> архитектурное решение потом * 2% + затраты на удаление 2х строчек кода. Если же как обычно наступит другой вариант, что не 3й модем появится а новый метод доставки (СМС например). то трудозатраты на поддержание вашего онанизма будут значительно выше чем разработка нового архитектурного решения с нуля с учётом изменённых требований. Затраты архитектурного онанизма сразу + Затраты на поддержания устаревшего архитектурного решения >> затраты на удаление 2х строчек кода + архитектурное решение потом с нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 01:43 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekПоэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать.Ну если так хочется, то вынеси тестируемый код в отдельную сборку, не содержащую взаимодействий с "внешним миром", и не имеющую ссылок на сборки, содержащие взаимодействия с "внешним миром". После этого, как бы ты не написал тестируемый код, ты всегда сможешь его запустить в любом окружении: тест , консольное приложение, веб-служба, GUI-приложение и т. п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 04:05 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
Архитектурный онанизм vs Простое и быстрое решение :) Технический долг и сраное легаси - это результат первого, или второго? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 09:09 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotek Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку. Это я вам по доброму. А можно и за вредительство наказать. почему вы рассматриваете вариант, что бизнес знает о своих рисках? если рассмотреть другой вариант, что бизнес не предусмотрел появление нового типа модема по сотне причин? типа не подумали, или еще что. аналитики не очень компетентные. и вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix. а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 12:34 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
monstrUProBiotekВо первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? почему вы рассматриваете вариант, что бизнес знает о своих рисках? если рассмотреть другой вариант, что бизнес не предусмотрел появление нового типа модема по сотне причин? типа не подумали, или еще что. аналитики не очень компетентные. Встречный вопрос: а почему нет? Я не говорю что бизнес знает и прогнозирует все риски. Но с наибольшей вероятностью он знает их лучше чем кто либо другой. А если каждая уборщится будете заниматься стратегическим планированием то горе такому предприятию и не долог час все окажутся у дороги. если рассмотреть другой вариант, в африке выпадет снег, и на москву упадёт метеорит, ля ля ля. Вообще ваши гипотетические построения страдают изяном: вы не учитываете вероятность и всегда исходите из самого маловероятного. monstrUи вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix. а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали? Оставьте уже ваши буйные фантазии. Я же уже показал что стоимость вашего "предвидения" неоправдана и общие затраты всегда выше чем если сделать минимальное решение. Вы с математикой дружите? Посчитайте риски. Сумма ( вероятность исхода х стоимость исхода). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 14:12 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
mikron, честно говоря, если вместо ответов задавать новые встречные вопросы, то будут только вопросы и никаких ответов. да и некрасиво как то выглядит. я со страницы скопировал ваши цитаты 1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку 2. Я не говорю что бизнес знает и прогнозирует все риски. так бизнес знает или не знает? вы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму. давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал. я тут согласен, что в случае такой простой постановки задач нужно сделать текущее решение минимальным - но минимальным насколько - использовать две строчки для команды модема или минимальную архитектуру разработать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 14:33 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
monstrUя со страницы скопировал ваши цитаты 1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку 2. Я не говорю что бизнес знает и прогнозирует все риски. так бизнес знает или не знает? Меня уже утомляют невнятные вопросы. бизнес знает что? Вы где-то увидели противоречие? Его здесь нет. это разные знания: знания рисков и знание стоимости внедрения. monstrUвы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму. давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал. Безусловно 2% это моя оценка. обсуждать просто дикие фантазии о 92% я не собираюсь. Одно замечу, если ваш в вашем предприятии разработчик так хорошо предвидит развитие бизнеса то ему место управляющего директора. Вообще дискуссия отдаёт студенчеством. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 15:13 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
skyANAАрхитектурный онанизм vs Простое и быстрое решение :) Технический долг и сраное легаси - это результат первого, или второго? :)Не забываем про избыточное проектирование. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 19:00 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ребята, вы приводите примеры неуправляемых ресурсов, но постоянно балансируете на грани юнит-тестов и моков . я бы не хотел, если бы ПО в самолете, на котором я лечу, было только так протестировано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 20:14 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
fsharp_fsharp, Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками. Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других. Так что все должно быть в порядке, самолеты в безопасности ) мухи к мухам котлеты к котлетам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 21:17 |
|
||
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
|---|---|---|---|
|
#18+
ProBiotekfsharp_fsharp, Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками. Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других. Так что все должно быть в порядке, самолеты в безопасности ) мухи к мухам котлеты к котлетам. тогда ОК. тут уже все описано, как реализовывать тестируемый код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 22:02 |
|
||
|
|

start [/forum/topic.php?all=1&fid=20&tid=1400345]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
150ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 267ms |

| 0 / 0 |
