powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
72 сообщений из 72, показаны все 3 страниц
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39303850
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Write (string text, string path)
{
   if (_someField)
   {
     File.WriteAllText (path, text);
   }  
   else
   {
     File.WriteAllText(path, text, Encoding.UTF8);
   }
}




Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ?

Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами.

Поправьте, дополните если считаете по другому.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39303864
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПривет.

Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Write (string text, string path)
{
   if (_someField)
   {
     File.WriteAllText (path, text);
   }  
   else
   {
     File.WriteAllText(path, text, Encoding.UTF8);
   }
}




Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ?

Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами.

Поправьте, дополните если считаете по другому.
да вроде мысль верная, 1 класс, 1 задача.
1ый класс "А" читает, другой класс "Б" пишет
или класс "С" генерирует данные, а класс "Б" пишет.
класс должен быть абстрактным от остальных, такой класс и протестировать труда не составить и применить там, где он потом понадобится тоже.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39303874
Grunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Навскидку:
1. Протестировать зависимость от _someField
2. Проверить что метод действительно пишет в файл
3. Зафиксировать контракт на крайние случаи: пустой text, пустой path, длинный text, длинный path
4. Зафиксировать поведение при ошибках: что будет, если запись не удалась, что будет если path некорректный

То есть сразу 8 тест кейсов
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39303925
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grunch,

Вот у меня вопрос. Код вида "метод действительно пишет в файл" вообще покрывается тестами ?
А если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы.
Так же и с файлом. Тест может отвалится сам, если, к примеру, каталога нету - а он записывает в файл. В этом случае падает ошибка - нужно создавать каталог.
Кто будет создавать каталог перед выполнением теста ? Тест, или метод который записывает в файл - но во втором случае это уже не его же задача?

Вот я прихожу к мнению, что такие классы не покрыть тестом.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304025
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekА если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы.

В одной транзакции все делаешь, потом откатываешь
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304034
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304056
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как раз вы и предлагаете делать интеграционные тесты - запись в файл, в БД и пр.

А мой вопрос как покрывать тестами класс работающий с неуправляемыми ресурсами ? Имеет ли это вообще смысл ? Прихожу к мнению, что нет. мы не контролируем физический ресурс - там что угодно может произойти, вплоть до того, что тест отвалится из-за того, что SQL запрос отвалится по таймауту из-за того, что какой-то юзер (или система) в этот момент запустит сложный отчет.
С жестким диском такая же ерунда. Там что угодно может наложится.

Мне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Вообще не тестировать работу с физическими устройства - полагаясь на разработчиков написавших эти классы (для работы с БД, с файлами).
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304093
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВот как раз вы и предлагаете делать интеграционные тесты - запись в файл, в БД и пр.

А мой вопрос как покрывать тестами класс работающий с неуправляемыми ресурсами ? Имеет ли это вообще смысл ? Прихожу к мнению, что нет. мы не контролируем физический ресурс - там что угодно может произойти, вплоть до того, что тест отвалится из-за того, что SQL запрос отвалится по таймауту из-за того, что какой-то юзер (или система) в этот момент запустит сложный отчет.
С жестким диском такая же ерунда. Там что угодно может наложится.

Мне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями. Вообще не тестировать работу с физическими устройства - полагаясь на разработчиков написавших эти классы (для работы с БД, с файлами).
Не понял, чем Вас интеграционные тесты не устраивают?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304134
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, можно тестировать отдельно бизнес-логику работы приложения от логики работы с внешними ресурсами. При этом при тестировании эмулировать работу с внешними ресурсами, например, вместо записи в БД писать логи, ничего не делать, откатывать транзакции (некрасиво) или еще чего.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304145
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekМне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями.
Попробуйте протестировать логику апдейта в базе, когда обновляемая запись заблокирована другой сессией, и ваш апдейт отваливается по таймауту (или, что еще веселее, бесконечно ждет). Этот так, навскидку, подобных примеров можно накидать еще с десяток.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304242
Grunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ProBiotekGrunch,

Вот у меня вопрос. Код вида "метод действительно пишет в файл" вообще покрывается тестами ?
А если у нас реальная БД тест должен реально что-то записывать в бд, проверять что записалось и откатывать ? А ведь там при вставке может ого-го что произойти: запустятся триггеры, бизнес процессы.
Так же и с файлом. Тест может отвалится сам, если, к примеру, каталога нету - а он записывает в файл. В этом случае падает ошибка - нужно создавать каталог.
Кто будет создавать каталог перед выполнением теста ? Тест, или метод который записывает в файл - но во втором случае это уже не его же задача?

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

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

С БД тоже самое, попытались записать - попытались прочитать. Что там происходило в базе нас мало волнует.

В любом случае, можно сделать хотя бы примитивные положительные тесты, проверку того что в некоторых идеальных условиях все проходит как надо.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304305
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныProBiotekМне кажется, что нужно заменять все эти физические сущности интерфейсами-зависимостями. И тестировать чисто логику работающую с этими зависимостями.
Попробуйте протестировать логику апдейта в базе, когда обновляемая запись заблокирована другой сессией, и ваш апдейт отваливается по таймауту (или, что еще веселее, бесконечно ждет). Этот так, навскидку, подобных примеров можно накидать еще с десяток.

ну так это мои слова же ! Я же именно это и написал выше. Что не вижу как можно писать тесты вокруг неуправляемых C# ресурсов.
А мне вот тут предлагают альтернативу - интеграционные тесты.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304308
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНе понял, чем Вас интеграционные тесты не устраивают?

Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304313
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.

Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304339
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekskyANAНе понял, чем Вас интеграционные тесты не устраивают?

Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.
Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить.
А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами.

В Вашем примере модельными тестами надо покрывать то, что использует метод Write.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304343
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.

Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится.

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

стоимость такого тестирования - космическая. и место ему - для ПО космических аппаратов
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304395
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.

Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится.

Ну вот. В принципе именно это я и написал в первом посте:

ProBiotekМое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами.

Поправьте, дополните если считаете по другому.

Я хотел это обсудить, может быть услышать другое мнение. Хорошо. Значит я правильно понимаю как покрывать тестами правильно.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304421
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekЯ хотел это обсудить, может быть услышать другое мнение. Хорошо. Значит я правильно понимаю как покрывать тестами правильно.

Если речь идет именно о юнит-тестировании, где мы проверяем внутреннюю логику работы класса - да, этого достаточно. Если же речь идет о тестировании взаимодействия многих компонентов (т.е интеграционное тестирование), где некая сущность ждет наличия файла с определенным содержимым - таки придется создавать файл.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304517
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Писать тесты еще хоть как то можно для чистых функций. Если взаимодействуешь с внешним миром, лучше сосредоточится на создании проверок, перехватывании ошибок и логировании.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304636
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВProBiotek,
Писать тесты еще хоть как то можно для чистых функций. Если взаимодействуешь с внешним миром, лучше сосредоточится на создании проверок, перехватывании ошибок и логировании.

ну, а как тестировать автопилот, например?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304651
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekPallarisпропущено...


Можно сделать, чтобы работа с файлом велась через какой-нибудь интерфейс IStorage; экземпляр, реализующий этот интерфейс, инжектить в класс и с ним работать. А в юнит тестах мокать его, как заблагорассудится.

Ну вот. В принципе именно это я и написал в первом посте
У Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :)
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304664
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fsharp_fsharp
ну, а как тестировать автопилот, например?
А как тестировать компилятор?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304669
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВfsharp_fsharpну, а как тестировать автопилот, например?
А как тестировать компилятор?

ну, вот тут и закончим

дальше только стенды с натурными испытаниями, если они возможны
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304674
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :)

Задача протестировать не реализацю IStorage, а класс, который его использует
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304679
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisskyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :)

Задача протестировать не реализацю IStorage, а класс, который его использует

е маё, вот оно чё. так уже сказали как. надо класс писать так, чтобы внешние зависимости в него инжектировались: заменить моками обращения к внешним зависимостям.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304689
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :)

Нету. IStorage тут нужен не для того, чтобы иметь различные реализации. А для того, чтобы разорвать зависимости между классами и тестировать их отдельно. И если класс логикой еще понятно как тестить (моки, стабы) то вот класс непосредственно читающий/пишущий файл наверное не протестить.

Просто хотелось услышать мнения о том как быть с юнит-тестами в условиях неуправляемых ресурсов. В принципе я для себя понял что такие классы остается делать минимально простыми и полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как).
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304691
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekи полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как).

нет, если у Вас есть необходимость тестирования, это Ваши проблемы
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304719
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisskyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :)

Задача протестировать не реализацю IStorage, а класс, который его использует
Посмотрите первое сообщение в топике, у ТС класс непосредственно пишет в файл. Это и есть на мой взгляд реализация IStorage для файловой системы.

А про "протестировать не реализацю IStorage, а класс, который его использует" я уже писал: 19632216 .
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304744
depend86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если речь идет о модульных тестах:
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 будет вызван

имхо, както так )
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304752
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
depend86,
Это как за бутылкой водки поехать.
Из Зеленограда в Москву.
Через Казань.
На большегрузном КамАЗе.
Вместо того, что бы пешком сгонять через дорогу в продуктовый.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304762
depend86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ, возможно так и есть, напоминает "эволюцию Hello World" )
однако, ТС спросил - как протестировать его код, я привел пример как, с разделением обязанностей - бизнес логика его кода, в числе прочего, требует чтобы в файл был записан некий текст - текст записывается, юнит тест это проверяет, "физически" процесс записи вынесен в отдельный класс который можно проверить интеграционным тестированием и многократно использовать

я считаю, что абстрагирование любых нативных объектов (системных часов, файловой системы, сети и т.д.) - это хорошо
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304785
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВdepend86,
Это как за бутылкой водки поехать.
Из Зеленограда в Москву.
Через Казань.
На большегрузном КамАЗе.
Вместо того, что бы пешком сгонять через дорогу в продуктовый.
Или как про факториал .
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304797
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяюсь. Считаю, что создавать сущности только ради облегченного юнит-тестирования - это плохая практика.

Но юнит-тесты писать все-таки нужно :)
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304870
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.Ну вызови этот метод, проверь созданный файл на правильность, потом удали файл. Заодно проверишь на закрытие файла.

Что тут обсуждать? :-)
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304881
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304884
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAProBiotekпропущено...


Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.
Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить.
А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами.

В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304885
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво?

Видимо, намного красивее - руками править изменения, держа в голове все триггера (если есть). Или после каждого теста базу восстанавливать.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304887
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...

Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить.
А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами.

В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно.
То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304889
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно.
То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать.ТС скорее запутали, чем что-то выяснили.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39304920
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныИли как про факториал .
Статья очень полезная, но никак не освещена тема юнит-тестирования полученных функций!
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305457
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЕвгенийВdepend86,
Это как за бутылкой водки поехать.
Из Зеленограда в Москву.
Через Казань.
На большегрузном КамАЗе.
Вместо того, что бы пешком сгонять через дорогу в продуктовый.
Или как про факториал .

Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь

why most unit testing is waste

Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать.
IMHO
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305462
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronСон Веры Павловныпропущено...

Или как про факториал .

Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь

why most unit testing is waste

Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать.
IMHO

никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305520
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво?
Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной.
После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно.
А есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ?

Я для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305523
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fsharp_fsharpmikronпропущено...


Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь

why most unit testing is waste

Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать.
IMHO

никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный
Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации.
Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код.

Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305569
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekАлексей Кпропущено...
Чем некрасиво?
Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной.
После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно.Зачем, например, мне думать про проблемы с Ораклом, если я работаю с MSSQL?
ProBiotekА есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ?Это чем мешает? Это наоборот хорошо. Счётчики в реальном сервере тоже постоянно растут, в тесте это должно быть учтено.
ProBiotekЯ для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает.Рад, что у тебя всё получается.

зы: Если есть необходимость и возможность тестировать на реальной БД, то нужно тестировать на реальной БД. Не забываем, что в БД могут быть FK, CK и т. п., которые тоже контролируют правильность работы программы.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305596
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronfsharp_fsharpпропущено...


никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный
Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации.
Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код.

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

не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305598
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юнит-тест - он как FK и CK у таблички
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305678
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегонщик перекупкиmikronпропущено...

Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации.
Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код.

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

не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример.
Не надо демагогии и не путайте общее с частным. Наличие ТЗ и спецификации продукта (или программного модуля) не одно и тоже что спецификация каждого метода. А именно методы вы тестируете. Или вы до сих пор только реализовывали методы, которые вам специфицировали?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305690
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПривет.

Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void Write (string text, string path)
{
   if (_someField)
   {
     File.WriteAllText (path, text);
   }  
   else
   {
     File.WriteAllText(path, text, Encoding.UTF8);
   }
}




Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика 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

как то вот так - работу с внешними устройствами надо скрыть за интерфейсами
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305769
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПерегонщик перекупкипропущено...


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

вижу, что объяснять Вам, похоже, бесполезно. не считаете нужным писать юнит-тесты - хозяин барин
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39305859
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrU,

я так и понял
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309666
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
был несколько дней в отпуске - тема вниз ушла :).

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

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

какую архитектуру решения предложите? какие задачи каким логическим слоям выделять будете? что тестировать? и как?

то есть по-простому просто "послать сообщение по модему " не прокатит, так как это отдельная аппаратно-программная задача.

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

как быть, если потребуется посылать не только текстовые сообщения, но и мультимедийные?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309683
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public interface ISender
{
  void Send (Message message)
}

public class ZyxelSender: ISender
{
   public  ZyxelSender (string params1, object params2)
}

public class YotaSender: ISender
{
   public  YotaSender (object params1, Ienumerable<string> params2)
}


public class Worker
{
   public  Worker (ISender)  {}  // инъекция через конструктор, если Worker создается и работает только с одним ISender всю свою управляемую жизнь

  public void Send (ISender sender, string message)  // инъекция через метод, если каждый раз адресат вызова будет меняется.
 {
   ...
    sender.Send (new Message {...= message });
  ...
 }
}



Теперь Worker спокойно тестируется через передачу мока/стаба ISender.

Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками".
Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :)

Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент.

PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309758
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Абстракция интерфейса Sender здесь почти задана автором, в остальном же архитектурный bullshit.
Почему интерфeйс а не абстрактный класс? наверняка некоторые методы будут общими.
Worker.Send (ISender sender, string message) это вообще с ходу code smell - feature еnvy.
И самое главное, вы решаете с энтузиазмом фиктивную задачу. см.ниже

monstrU,
В такой постановке надо настрочит две строчки, один раз самому протестироватъ на железе и забит болт на тесты.
сначала две строчки:
Код: c#
1.
2.
var commandTemplate = _zyxel ? "ATM.sequence.for.zyxel" : "ATM.sequence.for.zyxel";
port.Send(commandTemplate.Replace("TEL_NUMBER", realPhoneNumber).Replace("MESSAGE", realMessage);


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

Теперь по пунктам. В такой постановке задачи практически нет функциональных требований а тот минимум что есть, покрывается двумя приведенными строчками кода. По хорошему надо уточнить, должна ли гарантироваться доставка, поведение в случае ошибки, временнее параметры, через сколько устройств будет проиусходитъ отправка, где берутся эти сообщения, как протоколируюется отправка, наличие паралельных процессов и в этом духе. когда эти требования будут названы именно они подлежат тестированию.

а затребованные две строчки кода можно конечно тестировать, но это ментальный онанизм и пустая потеря времени.
1. спекуляции о дальнейшем развитии и как следствие "gas factory" - design anti-pattern.
2. тест вам не принесёт никаких приемуществ. Ваш софт не станет ни лучше ни надёжнее. А электричество можно с большим толком пользовать. Я исхожу из того, что вы будете обкатывать и тестировать минимум один раз на железе для обкатки "ATM команд". после этого теста автоматическое юнит-тестирование бесполезно. ничего не меняется. Если же изменятся требования, то вам придётся например реализовывать передачу картинки, то вы опять будете отлаживать на железе и старый тест вам ничем не поможет.

всё написаное - ИМХО, без претензии на правду в последней инстанции.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309764
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

вы предлагаете сделать один класс, который будет
Код: c#
1.
_zyxel ? "ATM.sequence.for.zyxel" : "ATM.sequence.for.zyxel";


?
Нарушение SRP - один класс на 2 вещи. Правильней сделать базовый класс отправляющий сообщение в порт, а наследники должны хранить эти строки (через protected свойство наверное).
тогда можно без ifов вообще.
Замена условного оператора полиморфизмом

Не путайте интерфейс и базовый класс. Интерфейс передается тому кто будет его использовать - а базовый класс это способ реализации. Детали реализации. Интерфейс как раз нас отделяет от таких деталей.
Тот кто использует интерфейс он даже не должен знать что там разные классы внутри у которых может быть один базовый класс.
Интерфейс позволяет сделать 3 разных класса, 2 их которых будут произрастать от одного предка, а третий вообще левый, сторонней конторой написанный но поддерживающий интерфейс.

PS. тестировать интерфейс через моки/стабы всяко легче чем базовый класс. У базового класса внутри логика, которая может неприятно сработать так что при вашем тесте будет отправляться реальное сообщение на почту. Замокав интерфейс будете уверены что проблем нет.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309772
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

вы не поняли мой поинт. Ваши архитектурные ментальные построения вообще не нужны.
надо просто написать две строчки кода. При оооочень большом желании можно оформить их как функцию. задача решена. точка.
Все ваши классы и интерфеисы - не требуются. Это только спекуляция. Если вы не согласны, огласите хоть одно требование, которое объясняет их сушествование. И я вам приведу пару аргументов, почему приведённый код - вреден.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309802
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Топик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо.

Завтра у вас появится третий модем и нужно будет менять эту строчку
Код: c#
1.
var commandTemplate = _zyxel ? "ATM.sequence.for.zyxel" : "ATM.sequence.for.zyxel";



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

Работу непосредсвенно с железом максимально минимизировать, чтобы вместо
Код: c#
1.
port.Send(commandTemplate.Replace("TEL_NUMBER", realPhoneNumber).Replace("MESSAGE", realMessage);


стало
Код: c#
1.
port.Send(message);


Ибо в вашем варианте студент тоже конечно сделает ошибку. С такой кучей реплейсов :)


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

Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel". Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу".

Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов.
А ваше решение как использовать для тестирования других классов ?


В общем будет у вас такой код для нового модема:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
if (zyxel || yota)
{
var commandTemplate = _zyxel ? "ATM.sequence.for.zyxel" : "ATM.sequence.for.zyxel";
}
else
{
125 строк для работы с новым крутым модемом имеющим свой протокол
}


Переписывать же нету времени старый код - потом же все тестировать с нуля. Прикручиваем костыль. В лучше случае сделаете так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if (zyxel || yota)
{
var commandTemplate = _zyxel ? "ATM.sequence.for.zyxel" : "ATM.sequence.for.zyxel";
port.Send
}
else
{
  NewModed modem = ...
  modem.Send
}


получили дублирование кода.

А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
  
class Worker
public void Send (ISender sender, string message)  
 {
   ...
    sender.Send (new Message {...= message });
  ...
 }


При этом ZyxelSender и YotaSender смогут иметь общий базовый класс, а новый модем будет построен на отдельной иерархии классов.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309820
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

тут тоже хорошо описано (хороший сайт с видео для каждого вида рефакторинга)
Замена условного оператора полиморфизмом
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309823
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

тут вас поддерживаю. даже если в системе будут пользоваться только два модема и в обозримом будущем новые добавляться не будут, то на написание масштабируемой архитектуры уйдет немного времени.
в живой системе требования все время расширяются, и если применять подход "тяп ляп и в продакшен" потому что сегодня не надо, то завтра получишь неподдерживаемую систему со спагетти кодом.
так что если вы точно уверены, что систему сопровождать не будете - то "тяп ляп" наверно подойдет, но что то редко такое случается
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309915
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public interface ISender
{
  void Send (Message message)
}

public class ZyxelSender: ISender
{
   public  ZyxelSender (string params1, object params2)
}

public class YotaSender: ISender
{
   public  YotaSender (object params1, Ienumerable<string> params2)
}


public class Worker
{
   public  Worker (ISender)  {}  // инъекция через конструктор, если Worker создается и работает только с одним ISender всю свою управляемую жизнь

  public void Send (ISender sender, string message)  // инъекция через метод, если каждый раз адресат вызова будет меняется.
 {
   ...
    sender.Send (new Message {...= message });
  ...
 }
}



Теперь Worker спокойно тестируется через передачу мока/стаба ISender.

Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками".
Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :)

Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент.

PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа.
Что есть Worker? Что есть Message? Конфигурация где?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309916
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И где собственно связь Москвы с Zyxel, а Питера с Yota?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309953
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekТопик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо.

Вы повторяете догмы и с упорством носорога игнорируете что я говорю. Две строчки кода (или "мой код" если угодно) вообще не надо тестировать. Под тестировать в конкретном контексте подразумевается покрытие юнит тестами и их автоматизация.

ProBiotek
Завтра у вас появится третий модем и ....
Спекулятция
Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ...
Спекулятция
Ибо в вашем варианте студент тоже конечно сделает ошибку...
Спекулятция

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

Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel".
пустые лозунги и догмы за отсутствием мыслей.
Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу".

Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов.
Домыслы и фантазёрство.
А ваше решение как использовать для тестирования других классов ?
Никак. Оно решает поставленную задачу а не ваши фантазии.

....
получили дублирование кода.

А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было.

Прогчее фантазёрство.


Подводя итог мы видим:
1. вы признаёте, что две строчки решают поставленную задачу
2. вы не привели ни одного аргумента, почему поставленная задача требует более сложного архитектурного решения.
3. нафантазировали варианты развития событий и именно ими мотивируете архитектурный онанизм.

Так как других аргументов кроме плодов вашей фантазии у вас нет давайте рассмотрим риски развития событий.

ProBiotekЗавтра у вас появится третий модем и ....

Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку.
Это я вам по доброму. А можно и за вредительство наказать.

Во вторых, по опыту, вероятность наступления этого события я бы оценил не более 2%. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку. И кому нужен этот зоопарк? Другими словами даже если третий модем дешевле экономически выгодней возможно купить ещё один из уже поддерживаемых.

ProBiotekЗавтра у вас появится третий модем и ....
Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ...
Ибо в вашем варианте студент тоже конечно сделает ошибку...


Если же наступит этот вариант, то затраты на удаление двух строчек кода минимальны. Затраты на архитектурное решение предложенное вами - те-же. Элементарная математика показывает что вы просто тратите ресурсы в пустую.

Затраты архитектурного онанизма сразу >> архитектурное решение потом * 2% + затраты на удаление 2х строчек кода.

Если же как обычно наступит другой вариант, что не 3й модем появится а новый метод доставки (СМС например).
то трудозатраты на поддержание вашего онанизма будут значительно выше чем разработка нового архитектурного решения с нуля с учётом изменённых требований.

Затраты архитектурного онанизма сразу + Затраты на поддержания устаревшего архитектурного решения >> затраты на удаление 2х строчек кода + архитектурное решение потом с нуля.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39309958
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПоэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать.Ну если так хочется, то вынеси тестируемый код в отдельную сборку, не содержащую взаимодействий с "внешним миром", и не имеющую ссылок на сборки, содержащие взаимодействия с "внешним миром".

После этого, как бы ты не написал тестируемый код, ты всегда сможешь его запустить в любом окружении: тест , консольное приложение, веб-служба, GUI-приложение и т. п.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310027
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архитектурный онанизм vs Простое и быстрое решение :)

Технический долг и сраное легаси - это результат первого, или второго? :)
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310156
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek
Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку.
Это я вам по доброму. А можно и за вредительство наказать.



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

и вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix.
а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310243
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUProBiotekВо первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку?


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

Встречный вопрос: а почему нет? Я не говорю что бизнес знает и прогнозирует все риски. Но с наибольшей вероятностью он знает их лучше чем кто либо другой. А если каждая уборщится будете заниматься стратегическим планированием то горе такому предприятию и не долог час все окажутся у дороги.
если рассмотреть другой вариант, в африке выпадет снег, и на москву упадёт метеорит, ля ля ля.
Вообще ваши гипотетические построения страдают изяном: вы не учитываете вероятность и всегда исходите из самого маловероятного.

monstrUи вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix.
а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали?
Оставьте уже ваши буйные фантазии.
Я же уже показал что стоимость вашего "предвидения" неоправдана и общие затраты всегда выше чем если сделать минимальное решение. Вы с математикой дружите? Посчитайте риски. Сумма ( вероятность исхода х стоимость исхода).
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310274
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

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

я со страницы скопировал ваши цитаты
1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку
2. Я не говорю что бизнес знает и прогнозирует все риски.

так бизнес знает или не знает?

вы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму.

давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал.

я тут согласен, что в случае такой простой постановки задач нужно сделать текущее решение минимальным - но минимальным насколько - использовать две строчки для команды модема или минимальную архитектуру разработать?
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310318
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUя со страницы скопировал ваши цитаты
1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку
2. Я не говорю что бизнес знает и прогнозирует все риски.

так бизнес знает или не знает?

Меня уже утомляют невнятные вопросы. бизнес знает что?
Вы где-то увидели противоречие? Его здесь нет. это разные знания: знания рисков и знание стоимости внедрения.

monstrUвы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму.

давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал.

Безусловно 2% это моя оценка. обсуждать просто дикие фантазии о 92% я не собираюсь. Одно замечу, если ваш в вашем предприятии разработчик так хорошо предвидит развитие бизнеса то ему место управляющего директора.

Вообще дискуссия отдаёт студенчеством.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310569
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАрхитектурный онанизм vs Простое и быстрое решение :)

Технический долг и сраное легаси - это результат первого, или второго? :)Не забываем про избыточное проектирование. :-)
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310613
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, вы приводите примеры неуправляемых ресурсов, но постоянно балансируете на грани юнит-тестов и моков . я бы не хотел, если бы ПО в самолете, на котором я лечу, было только так протестировано
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310651
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fsharp_fsharp,

Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками.
Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других.

Так что все должно быть в порядке, самолеты в безопасности ) мухи к мухам котлеты к котлетам.
...
Рейтинг: 0 / 0
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
    #39310662
fsharp_fsharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekfsharp_fsharp,

Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками.
Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других.

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

тогда ОК. тут уже все описано, как реализовывать тестируемый код.
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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