Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unit тестирование, Помогите разобраться и начать изучение 
:(
    Опции темы
nikitao
Дата 16.5.2011, 01:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 4
Всего: 26



Добрый день!

Надоело быть Чаком Норисом ( это отсюда : http://habrahabr.ru/blogs/tdd/116514/ ) , поэтому захотел понять как систематически разрабатывать код и писать к нему тесты.

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

Код

int Calc(int a,int b)
{
   return a+b
}

минимальна.

Пытаюсь применить такой подход к своим задачам и встаю в ступор.

Сценарий 1.
Есть WCF сервис.
Соответственно у такого проекта наружу торчит контракт сервиса и контракты данных.
Каждый запрос к такому сервису ведет к обращению к БД считыванию\добавлению\обработки данных и выдачу ( при необходимости) наружу какого то результата.
И как такой паттерн можно протестировать ?
Читал ни раз , что юнит тестирование не должно тестировать обращение к БД. Тогда вообще не понятно , как такой сценарий тестировать.
Или тестировать также как юнит тесты , только это будет называться не юнит тестами , а интеграционными ?

Сейчас попробовал пару методов контракта окружить тестами. Получилось , что я скажем добавляю запись с помощью WCF в БД , а потом напрямую обращаюсь в БД и смотрю добавилась ли эта запись и если добавилась полностью проверяю ее корректность. Так что ли надо делать ? smile Что то мне кажется , что я не прав.
Причем корректность записей в БД проверяю с помощью тех же классов , коими и добавляю записи внутри WСF сервиса ( сгенерированные LINQ To SQL классы ). Опять же каламбур получается.

Читал про Мок объекты , но опять же не понимаю , чем они тут могут помочь, потому что по сути большая часть работы сервиса - это работа с БД ( LINQ запросы ) и что тут можно проверить эмулируя результаты запросов не понимаю.
Или это просто тот сценарий , где unit тестирование в принципе не надо применять ? 
Тогда как правильно тестировать ?

Или вот сценарий 2.
Есть приложение , которое "общается" с этим сервисом. 
По сути вся бизнес логика заключается в обращении сначала к сервису , а потом к обращению к сторонним сервисам ( написанных не мной ).
И тут вообще не могу понять как можно наладить автоматическое тестирование.
Во-первых нет даже никаких public методов , чтобы из юнит тестов можно было запускать части программы.
Во-вторых как я могу эмулировать работу этих сторонних ресурсов ? Не писать же мне их эмуляторы. Мне и так порой с ними сложно работать , не говоря уже , чтобы писать генераторы html кода и логику обработки запросов к этим сервисам. Такая эмуляция будет сложнее самой программы , а значит в ней и ошибок будет больше содержаться , чем в программе для которой она эмулируется.


Есть непонятки насчет юнит тестирования так такового. Когда я тестирую какой то код я имею доступ только к public классам и методам.
Тестирование через их вызов безусловно обеспечит покрытие большей части закрытого кода , но далеко не обязательно всего. К примеру я разработал класс и предусмотрел в нем какой то конструктор , но в данный момент этот конструктор нигде не вызывается внутри открытой части кода. Сам класс объявлен как internal и как следствие конструктор я не могу вызвать из тестирующего проекта. 
Или надо писать тесты внутри самого проекта ,а потом их вызывать ? Но я про такое нигде не видел\ не читал. Везде тестирующие проекты лежали отдельно в солюшене.
Т е меня с самого начало смутило, что тестирование мы проводим по принципу черного ящика. При этом одной из ключевых характеристик для нас является код ковередж, т е то , что лежит ближе как мне кажется все таки к тестированию с помощью белого ящика.
Тут можно сказать , что не надо писать то , что не используется. Но мне кажется , что если я разрабатываю класс , то я должен предусмотреть все возможные сценарии его использования и предусмотреть соответственно методы для удобной работы с ним. И совсем не обязательно , что сейчас я буду их использовать.  Менять же область видимости метода или класса только ради того , чтобы его можно было покрыть тестами мне кажется странным.

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

Ну в общем что то у меня в консерватории не то smile . Кто бы мозги мне вправил как надо - было б очень хорошо smile 

ЗЫ
Спасибо даже тем , кто просто дочитал до этого места smile 


Это сообщение отредактировал(а) nikitao - 16.5.2011, 01:17


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
likegift
Дата 16.5.2011, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 14.10.2008

Репутация: нет
Всего: 3



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

Цитата

ЗЫ
Спасибо даже тем , кто просто дочитал до этого места  


пжлста

Это сообщение отредактировал(а) likegift - 16.5.2011, 07:35
PM MAIL   Вверх
WarHog
Дата 16.5.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: нет
Всего: 2



Цитата

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


много чего плохого. например, подумайте о производительности таких тестов (для среднего проекта количеством юнит-тестов в несколько тысяч). кроме того, после первого теста, который изменит данные не в моке, а в реальной базе, как их там восстанавливать для следующего теста? в третьих, использование базы - уже не юнит-тестирование, а интеграционное.
--------------------
PM MAIL   Вверх
likegift
Дата 16.5.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 14.10.2008

Репутация: нет
Всего: 3



а чо их восстанавливать? это же тестовая база - drop table/create table smile
а если серьезно, то мне самому любопытно какая методика будет правильная.
PM MAIL   Вверх
nikitao
Дата 16.5.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 4
Всего: 26



Цитата(likegift @  16.5.2011,  08:34 Найти цитируемый пост)
2. что плохого в тестировании черного ящика, как черного ящика? смысл теста не поломать его, а убедиться, что он проходит набор определенных тестов. не?!

Да не. Ничо плохого нет. Просто получается, что от момента попадания бага в код до момента его обнаружения может пройти много времени, что тоже с виду не очень хорошо. Хотя мне кажется , что это скорее теоретическая , чем практическая проблема.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.