|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
skyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Нету. IStorage тут нужен не для того, чтобы иметь различные реализации. А для того, чтобы разорвать зависимости между классами и тестировать их отдельно. И если класс логикой еще понятно как тестить (моки, стабы) то вот класс непосредственно читающий/пишущий файл наверное не протестить. Просто хотелось услышать мнения о том как быть с юнит-тестами в условиях неуправляемых ресурсов. В принципе я для себя понял что такие классы остается делать минимально простыми и полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 19:23 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekи полагаться на то, что разработчики этих классов их тестируют (это уже их проблемы как). нет, если у Вас есть необходимость тестирования, это Ваши проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 19:30 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
PallarisskyANAУ Вас есть реальная необходимость в нескольких реализациях IStorage? Если да, то как Вы протестируете каждую из этих реализаций? :) Задача протестировать не реализацю IStorage, а класс, который его использует Посмотрите первое сообщение в топике, у ТС класс непосредственно пишет в файл. Это и есть на мой взгляд реализация IStorage для файловой системы. А про "протестировать не реализацю IStorage, а класс, который его использует" я уже писал: 19632216 . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 20:23 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
если речь идет о модульных тестах: 1) создаете свой интерфейс, например IFileSystem с методом, сигнатура которого один в один повторяет сигнатуру File.WriteAllText (path, text) 2) в своем коде указывайте зависимость от этого интерфейса и используете 3.1) сам интерфейс IFileSystem реализуете в виде FileSystemWrapper внутри которого тупо делегируете вызов к методу к File.WriteAllText (т.к. метод WriteAllText в классе File статический) 3.2) в ином случае, например класс WebClient (где методы не статические) даже делегировать ничего не нужно, просто создаете интерфейс IWebClient и класс WebClientWrapper который наследуете от WebClient и IWebClient 4.1) в IOC контейнере указываете что IFileSystem реализован как FileSystemWrapper 4.2) в модульных тестах мокаете IFileSystem и ждёте что метод WriteAllText будет вызван имхо, както так ) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 21:47 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
depend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 22:44 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ЕвгенийВ, возможно так и есть, напоминает "эволюцию Hello World" ) однако, ТС спросил - как протестировать его код, я привел пример как, с разделением обязанностей - бизнес логика его кода, в числе прочего, требует чтобы в файл был записан некий текст - текст записывается, юнит тест это проверяет, "физически" процесс записи вынесен в отдельный класс который можно проверить интеграционным тестированием и многократно использовать я считаю, что абстрагирование любых нативных объектов (системных часов, файловой системы, сети и т.д.) - это хорошо ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2016, 23:28 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ЕвгенийВdepend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. Или как про факториал . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 02:51 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Присоединяюсь. Считаю, что создавать сущности только ради облегченного юнит-тестирования - это плохая практика. Но юнит-тесты писать все-таки нужно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 05:37 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekВопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл.Ну вызови этот метод, проверь созданный файл на правильность, потом удали файл. Заодно проверишь на закрытие файла. Что тут обсуждать? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:22 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
AnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:35 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
skyANAProBiotekпропущено... Всякому тесту свое место. Интеграционным интеграционное.А юнит тестам - юнит место. Вопрос был про то, как реализовать юнит тестирование класса, записывающего текст в файл. Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить. А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами. В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:37 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? Видимо, намного красивее - руками править изменения, держа в голове все триггера (если есть). Или после каждого теста базу восстанавливать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:38 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... Дак и надо было написать: "Что тут покрывать модульными тестами?" :) И про всякие неуправляемые ресурсы вообще ни слова не говорить. А то фиг Вас поймёшь, что Вы хотите тестировать: то ли логику, то ли интеграцию с этими самыми ресурсами. В Вашем примере модельными тестами надо покрывать то, что использует метод Write.Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:39 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
skyANAАлексей Кпропущено... Все не обязаны придерживаться терминологии, которой ты пользуешься. Со слов ТС и без этой терминологии всё понятно. То-то и видно, что тебе всё понятно :) Выяснили же уже, что ТС не хочет создавать файл, он хочет это замокать.ТС скорее запутали, чем что-то выяснили. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 09:41 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныИли как про факториал . Статья очень полезная, но никак не освещена тема юнит-тестирования полученных функций! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 10:11 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныЕвгенийВdepend86, Это как за бутылкой водки поехать. Из Зеленограда в Москву. Через Казань. На большегрузном КамАЗе. Вместо того, что бы пешком сгонять через дорогу в продуктовый. Или как про факториал . Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 19:16 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikronСон Веры Павловныпропущено... Или как про факториал . Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 19:31 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Алексей КAnSi_Sr... откатывать транзакции (некрасиво)Чем некрасиво? Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной. После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно. А есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ? Я для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 21:45 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
fsharp_fsharpmikronпропущено... Раз зашёл такой разговор, позвольте моё мнение хорошо обрисованное здесь why most unit testing is waste Другими словами: я считаю на грани маразма при покупке машины проверят округлость колес и устойчивость лобового стекла к механическим повреждениям. это именно что вы делаете юнит-тестами. Вы тестируете не функциональные требования. От вашего теста вообще нет пользы и мало смысла. По аналогии с машинами - любой нормальный покупатель просто устроит тестовую поездку. Вот и тестировать имеет смысл только тот код, который делает неч-то функциональное (в смысле полезное). Именно этот функционал составляет ценность ПО и только его нужно тестировать. IMHO никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2016, 21:49 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekАлексей Кпропущено... Чем некрасиво? Не все так просто откатить. Например есть автономные транзакции (у Оракла), и они не откатываются при откате основной. После каждого теста нужно возвращать все в изначальное состояние, что опять таки может быть сложно.Зачем, например, мне думать про проблемы с Ораклом, если я работаю с MSSQL? ProBiotekА есть еще identity, sequence. Как писать надежный тест, если сиквенс каждый раз возвращает новое значение - проверять что "процедура вернула какой-то int" ?Это чем мешает? Это наоборот хорошо. Счётчики в реальном сервере тоже постоянно растут, в тесте это должно быть учтено. ProBiotekЯ для себя уже все решил. Выделять функционал с неуправляемыми ресурсами в отдельные классы/сервисы и их внедрять как зависимости. Тестировать сами сервисы в "ручном режиме", вне автоматических юнит тестов. Других вариантов не вижу. Меня это решение устраивает.Рад, что у тебя всё получается. зы: Если есть необходимость и возможность тестировать на реальной БД, то нужно тестировать на реальной БД. Не забываем, что в БД могут быть FK, CK и т. п., которые тоже контролируют правильность работы программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 04:23 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikronfsharp_fsharpпропущено... никто не отменяет полезность функциональных тестов. но у юнит-тестов другое назначение . по аналогии с машиной: один разработчик протестировал, что отверстия под дверь сделаны правильно (саму дверь при этом не надо прикручивать, и не надо звать покупателя, чтобы он её тестировал на "открыть/закрыть"). как он это сделал? протестировал (линейкой). откуда у него способ проведения измерения? из спецификации на дверь. кузов пришел по конвейеру (исходники закоммитили в репозиторий) к другому разработчику, который при помощи кувалды сминает люминий (пишет какой-то говно код). все дверь уже не прикрутить. но для этого опять не надо саму дверь (и тем более покупателя-тестировщика) - достаточно того, что тест (измерение линейкой) красный Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 06:30 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Юнит-тест - он как FK и CK у таблички ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 06:35 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Перегонщик перекупкиmikronпропущено... Вот именно здесь сравнение не корректно , т.к. предполагается что тестируется отдельная деталь на соответствие спецификации. При этом спецификация одна а детали представляют массовое производство. В софтварной индустрии это по большому счёту не так. Исключения - единицы, как то компиляторы. Их можно условно проверить на соответствие стандарту. В случае автора спецификации нет. Если бы была, то во первых была бы на его конкретный код малополезна, во вторых, не возникало бы вопросов, что тестировать - на соответствие спецификации. Софтварный продукт по сути представляет мануфактурное производство, т.к. делается один раз под конкретней случай. Автор кода сам в определённой степени выбирает архитектурный дизайн и определяет интерфейсы. Возводить его видение в спецификацию можно, но какой в этом прок. Софт не будет делаться массово (или даже дважды) по этой спецификации. Скорее всего изменятся функциональные требования ко всему софту, и в таком случае надо или пересматривать спецификации или не трогать код. Иначе возникает парадоксальная ситуация, когда разрабатывали комбайн а после по тем-же чертежам и спецификациям хотим разработать пароход. не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. Не надо демагогии и не путайте общее с частным. Наличие ТЗ и спецификации продукта (или программного модуля) не одно и тоже что спецификация каждого метода. А именно методы вы тестируете. Или вы до сих пор только реализовывали методы, которые вам специфицировали? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 10:38 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekПривет. Сабж. Класс занимается одной обязанностью и очень простой. Предположим что у него всего одна функция "записать текст в файл". При этом там есть какая-то простенькая логика на Ifах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Что тут покрывать тестами ? Правильно ли, что в данном классе есть логика if ? Мое мнение: данные классы не получится покрыть тестами (ввиду работы с ресурсами) и в них не должно быть логики (ввиду того, что метод не покрыть тестами). Получается нужно разделить класс на хотя бы 2 метода/класса: в одном логика работающая с iFileWriter а в другом максимально краткий код, направленный только на работу с физическими ресурсами. Поправьте, дополните если считаете по другому. в вашем классе 2 ответственности 1. выбрать способ записи 2. выполнить запись поэтому вы и не можете написать тест - они сигналят об ошибке в архитектуре. решение может быть таким - задачу записи вынести в отдельный класс(интерфейс) то есть будет 2 класса 1. выбор способа записи WriteModeSelector 2. физическая запись FileWriter:IFileWriter 1 класс нужно тестировать при помощи moq объекта. в метод Write класса WriteModeSelector передавать ссылку на IFileWriter (или завести для него свойство), в котором два разных метода писания файлов. экземпляр IFileWriter сформировать как заглушку. тест будет заключаться в том, что при выполнении условия _someField вызывался метод IFileWriter.WriteSimpleFile в противном случае вызывался метод IFileWriter.WriteUTF8File. тест на физическое создание файла можно делать отдельно для FileWriter.WriteSimpleFile и FileWriter.WriteUTF8File как то вот так - работу с внешними устройствами надо скрыть за интерфейсами ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 10:49 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikronПерегонщик перекупкипропущено... не согласен. спецификация есть всегда - вы же не по наитию пишете, есть ведь ТЗ, так? и юнит-тест - это спецификация через пример. Не надо демагогии и не путайте общее с частным. Наличие ТЗ и спецификации продукта (или программного модуля) не одно и тоже что спецификация каждого метода . А именно методы вы тестируете. Или вы до сих пор только реализовывали методы, которые вам специфицировали? вижу, что объяснять Вам, похоже, бесполезно. не считаете нужным писать юнит-тесты - хозяин барин ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 12:23 |
|
|
start [/forum/topic.php?fid=20&msg=39304889&tid=1400345]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 425ms |
0 / 0 |