Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.) / 25 сообщений из 72, страница 1 из 3
05.09.2016, 14:42
    #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
05.09.2016, 14:55
    #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
05.09.2016, 15:16
    #39303874
Grunch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
Навскидку:
1. Протестировать зависимость от _someField
2. Проверить что метод действительно пишет в файл
3. Зафиксировать контракт на крайние случаи: пустой text, пустой path, длинный text, длинный path
4. Зафиксировать поведение при ошибках: что будет, если запись не удалась, что будет если path некорректный

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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