Курс. NETХорошая книга Чакон Pro git. Хорошая книга
































all_2013_07_09.ppt
- Количество слайдов: 30
Курс .NET
Хорошая книга Чакон Pro git
Хорошая книга Адам Фриман про ASP.NET MVC 4
Орг. вопросы Включить камеру Отметить присутствующих След. Занятие – 12 июля (пятница)
Дом. задание Восстановить CVS loader
TDD Проблемы
Одна из проблем TDD Подготавливаем данные для теста («эталонные данные») Запускаем тест Видим ошибку или не ошибку Подготаваливаем данные для теста – что за этим кроется???????
Вариант 1 (не прикольный) using (var db = new cvs_dbEntities()) { var newRecord = new testtable {id = 1, name = "3", value = true}; db.testtables.AddObject(newRecord); var newRecord2 = new testtable { id = 2, name = "3", value = true }; db.testtables.AddObject(newRecord2); var newRecord3 = new testtable { id = 3, name = "3", value = true }; db.testtables.AddObject(newRecord3); var newRecord4 = new testtable { id = 4, name = "3", value = true }; db.testtables.AddObject(newRecord4); db.SaveChanges(); }
Вариант 1 (сказка на ночь) А если у таблицы 16 полей и надо добавить 10 записей?
Вариант 2 (прикольный) Взять open office или office
Проблема Как это сделать?
Решение (часть 1) Использовать csv формат (когда все разделяется запятыми, а сами запятые в тексте экранируются)
Решение (2) Сделать следующую структуру файла Строка с названием таблицы Строка, в каждой ячейке которой хранится значение поля Затем 0 или более строк со значениями этих полей Затем (опционально) – пустая строка Все тоже самое для другой таблицы
Пример содержимого файла testtable,, id,name,value 1,проверка 1,true 2,"прове, 2",false 3,"про "" 3",false ,, secondTable,, id,name,
Мелкая проблема Почему-то в Office 2010 хоть и пишут, что разделитель – запятая, но ставят точку с запятой. А в 2007 офисе – все нормально, ставят запятую
Возникающие проблемы 1) разбить файл на «части» по БД (мелочь) 2) Прочитать значения строк из файла (мелочь) 3) Понять, к какой таблице относится запись и какой класс надо создавать (мелочь) 4) воссоздать класс из строки + список полей (не совсем мелочь) 5) Добавить в таблицу новую запись (не совсем мелочь)
Решение проблемы D:CourseCVSLoader
Mock
Суть проблемы Мы знаем, что где-то что-то в последовательности вызовов глючит. Вопрос – где и что? (особенно с учетом того, что каждый разработчик говорит, что у него нет ошибки) Решение – части системы заменить на заглушки. Если после замены глюки прекратятся – то ошибка или в замененной части или в блоке её вызова, т.е. будет сужение возможного пространства ошибки
Встающие вопросы Какие термины используются с тестировании? (хотя бы часть списка) Dependency Injection Реализация Mock С помощью какого инструментария реализовать Mock И еще кучка вопросов http://habrahabr.ru/post/116372/
Немного терминологии (1/2) Dummy - это объекты, которые передаются в методы, но на самом деле не используются. В основном, это параметры методов (если конечно, они не влияют в тесте на то, что мы хотим проверить). Иногда это просто NULL Fake - это объекты, которые имеют внутреннюю реализацию, но обычно она сильно урезанная и их нельзя использовать в готовом коде.
Немного терминологии (2/2) Stubs - обеспечивают жестко зашитый ответ на вызовы во время тестирования. Применяются для замены тех объектов, которые обеспечивают SUT входными данными. Также они могут сохранять в себе информацию о вызове(например параметры или количество этих вызовов) - такие иногда называют своим термином Test Spy. Такая "запись" позволяет оценить работуSUT, если состояние самого SUT не меняется. Mocks - объекты, которые настраиваются (например специфично каждому тесту) и позволяют задать ожидания в виде своего рода спецификации вызовов, которые мы планируем получить
Небольшой вывод В конечном счете любой класс – набор методов (с или без возвращаемого значения) и набор свойств. Что бы сделать тест, надо заменить методы своими. Пример с использованием калькулятора с использованием библиотеки Mock и Stub Ограничение библиотек – то, что заменяемые методы должны быть виртуальными
Использование Ninject в ASP MVC
IoC - Inversion of Control (инверсия управления) Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракции. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Суть - каждый компонент системы должен быть как можно более изолированным от других, не полагаясь в своей работе на детали конкретной реализации других компонентов. Следствие 1 – появление интерфейсов
Суть проблемы Пусть есть задача интеграции с платежным шлюзом банка. Пусть у нас есть 100 тестов, которые проверяют работу с платежным шлюзом и в среднем делают с ним 5 операций. Тогда когда мы запускаем тесты идет маленькая DOS атака на шлюз – 500 обращений за 5-10 секунд Банк не доволен. Если учесть, что в среднем тесты запускаются каждые 30 минут у 5-6 разработчиков банк ОЧЕНЬ не доволен
Суть решения В тестах заменить реализацию интерфейса взаимодействия с платежным шлюзом на «заглушку» (mock)
Решение («закат солнца в ручную)» Выделяем интерфейс взаимодействия с платежным шлюзом Делаем фабрику, которая возвращает экземпляр класса, который реализует интерфейс Получаем экземпляры интерфейса только через фабрику
Минусы решения Надо программировать А что если одна заглушка зависит от другой, т.е. в параметрах конструктора есть интерфейс? Решение – сделать жестокую рефлексию с использованием теории графов (при этом развести циклические зависимости)
Нормальное решение Взять гугл Поискать IoC контейнер для .NET (их несколько) Для примера использовать ninject