|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=20&msg=39304093&tid=1400345]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 175ms |
0 / 0 |