Обработка Keyword в Keywords Driven Testing

Каким образом в Keyword Driven инструментах реализован мапинг между Action-ом и кодом который будет его реализовывать ?
Поскольку я одно время очень долго имел дело с MVC net.framework то от туда пришла идея использовать механизм Routes и RouteMap...

Предатель

Год назад переметнулся в лагерь к Javистам. Год пишу на жаве и оракле. Ощущение дежавю, не покидает на протяжение всего времени.

Доклад на тему asp.net MVC

Неделю тому назад мне в голову стукнуло сделать доклад, освещающий asp.net mvc. 24 октября доклад был озвучен на собрании местной .net-комуннити :) Насколько он получился успешным и смог ли я донести основные идеи данной технологии я не знаю :) Последний раз публичное выступление у меня было в далеком 2002 году, на тему современные ИТ-технологии в образовательной сфере. Было это в моем родном ТГУ :)
Презентация тут

После доклада всех интересовало, почему нужно бросать classic asp.net и переходить на asp.net mvc. Мое мнение такое, не нужно что-то бросать и куда-то переходить, но всегда надо иметь в запасе какое-то количество технологий, которые позволят вам покрыть больший объем задач. Asp.net для одних задач, asp.net mvc для других. :)

Внимание опасность

Недавно я столкнулся с очень не хороший ситуацией. Один из наших хостингов провел плановое обновление программного обеспечения на своих северах. В ходе обновление был так же установлен net.framework3.5 SP1. 
После установки, сайты созданные на asp.net mvc перестали работать. В ходе кодокопания была выявлена следующая неприятная ситация.
Сайт был реализован на базе Asp.Net MVC Preview 2, в котором Dll выглядили следующим обазом:

System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35

После выхода Asp.Net MVC Preview3 Сборки получили новые версии и стали выглядеть так.

System.Web.Abstractions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
System.Web.Routing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35

Это было сделано, чтобы не вводить разработчиков в шоковое состояние от номера версии.

Но вот вместе с SP1 идут те самые две библиотеки, так как Microsoft включил их в ряд своих проектов(Dynamic Data, Data Services). Где они хранятся в следующем виде:

System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35

Ничего не напоминает ? Это теже самые номера, что и в Preview2. В результате при работе компилятор подхватывает именно их. И в ходе работы можно столкнуться например с такой проблемой:

Не удалось загрузить тип "System.Web.HttpContextWrapper2" из сборки "System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".

Вот к чему приводит не согласованная политика версий...

+1

"И ты Брут", сказал бы Цезарь глядя на гугл. Гугл продвигается в сторону дескотпных приложений, выпустив свой броузер. Все кто заходили сегодня на сайт www.google.com могли видеть предложение о скачке их нового броузера Beta версии.

Могу сказать только одно, запостить этот пост, из него, мне удалось ) да и в интернете он неплохо лазиет, быстрее чем сафари, удобнее чем firefox+safary. Вообщем я сменил броузе с фаерфокса на Google Chrome.

Без шума и пыли.

Вышел очередной preview 5 Asp.net Mvc. Для установки необходимо снести старые preview.

  • Замечено перемещение Ajax Helper в свое собственное пространство имен.
Насколько я понял, для легкой смены js ajax framework-а.

  • IViewEngine немного поменял свою роль и теперь отвечает только за поиск View. 0_O
  • Появление Html.RenderPartial
Танцы с IViewEngine стали понятны. Появление RenderPartial и ... и видимо идет движение в сторону subcontroller-ов.

  • Added array support for action method parameters.
  • Added support for custom model binders(ModelBinder(…)+.).
Насколько я понял теперь с клента в Action можно передавать массивы, а также более сложные типы данных.

  • Added a new AcceptVerbs attribute.
  • Added a new ActionName attribute.
А вот эти два момента приближают нас к простой full REST реализации ;)

И еще, еще, еще...
Общее впечатление от прочитанного релиза. Framework претерпел некоторый рефакторинг.

Трудности перехода

Судя вот по этой статье, некоторые американские разработчики видели веб-разработку только через призму asp.net. И после выхода asp.net mvc с удивлением для себя заметили, что вокруг мира веб-разработки существует куча других проблем, кроме "как найти подходящий aspnet control для моего сайта/интранет системы". Для человека, всегда работавшего с win-app, трудно понять, что его asp.net приложение не работает, как он хочет, во всех броузерах. Трудно понят, что приложение не хранит состояние между сессиями. Трудно понять почему ему приходится делать работу два раза, clien-side и server-side.

Насчет споров вокруг asp.net mvc. По мне так все эти споры связаны в основном из-за того, что люди приходящие в веб разработку делают это с разных сторон и со своим сложившемся мировозрением на построение приложений.

Кто-то пришел из мира win-application и увидел родной для себя подход в classic asp.net. Кто-то пришел из мира web-application(perl,php,ruby и так далее и тому подобное).

Я так думаю MS не стало бы возиться с asp.net mvc если бы не видело проблем которые пораждает classic asp.net.

PS. Интересно, сколько человек откликнется на этот пост )

Все когда-нибудь заканчивается

Отпуск тоже когда-то кончается и наступают рабочие будни.

  • Отдыхать в городе - это убийство своего отпуска.
  • Отдыхать в другом городе - это покушение на убийство.
  • Поход по магазинам во время отпуск - это ограбление своего отпуска.
  • Отсыпаться во время отпуска - это убийство своего отпуск.
  • Поездка на курорт - это гастроли с совершение тяжких телесных повреждений(отравление, ожирение и обгорание)

ТОЛЬКО АКТИВНЫЙ ВИД ОТДЫХА, в любом его проявлении и виде!
Остальное тут

Использование Http Status Code для обработки ошибок

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

Для любого ответа web-сервер генерирует Status Code. Статусы есть наверное на все случаи жизни сервера и request-а.
Классические:
200 OK - все верно обработано
301 Moved permanently - так называемый редирект
403 Forbidden - нет доступа
404 Not Found - нет такого ресурса
Более экстравагантные:
405 Method Not Allowed
411 Length Required
505 HTTP Version Not Supported

Есть еще один статус, который возникает если во время обработки запроса произошла ошибка в коде "500 Internal Server Error".
Как правило пользователь в браузере видет какую-то жуть несусветную и все исключения или ошибку стараются обработать на сервере и выдать в каком-нибудь удобоваримом виде. После такой обработки тот самый "500" статус теряется и теперь сервер возвращает "200 OK".
Далее на клиенте просто выводится текст ошибки, ну или на что фантазии хватит у разработчика.

Большинство браузеров или js-framework умеют работать с 500 статусом. Например при ajax запросе js-frameworks вываливаются в методы(OnError, onFailure). Броузеры имеют свою страничку для отображения ошибок.
Но, после обработки "500" статус пропадает и "клиент" не узнает об ошибке. Приходиться вводит и обрабатывать дополнительную ситуацию на "клиенте", придумывать форматы для информирования об ошибке и так далее.
Зачем городить огород, если клиент и так настроен на обработку "500" кода. Для того, чтобы клиент все правильно понял достаточно после обработки в HEADER опять поместить "500" ошибку.
Для этого можно записать в респонсе(Asp.Net Mvc):

Response.StatusCode = "500";

Теперь клиент правильно поймет, данные относятся к ошибке. А на сервере надо будет правильно эти данные сформировать. Информированием клиента об ошибке займется протокол HTTP.

Suggest поиск.

Понадобилось мне создать свой suggest поиск и чтобы не изобретать велосипед посетил я ряд проектов, посвященный этой теме.

Вот несколько готовых скриптов и примеров ;)

http://labs.adobe.com/technologies/spry/articles/autosuggest_overview/index.htm
http://www.dynamicajax.com/fr/AJAX_Suggest_Backend-271_290_312_315.html
http://www.brandspankingnew.net/archive/2006/08/ajax_auto-suggest_auto-complete.html
http://alx.vingrad.ru/fwc/ru/examples
http://www.enjoyxstudy.com/javascript/suggest/index.en.html

При создании своего Suggest-а я попробовал разделить процесс получения данных и процесс отрисовки(send-get и draw). Таким образом отрисовка можно спокойно менять.
Так же воспользовался событиями и мой suggest сообщает обо всем что происходит.

Вышел Asp.Net Mvc Preview 4

В блоге Scottа Gu появилась запись о выпуске очередного Preview aspnetmvc ворка.
Если раньше выпуск релиза сопровождался изменениями во всех частях ворка, то теперь изменения направлены явно в сторону улучшения и расширения пользовательских функций. Например разработаны готовые фильтры Authorize Filter, HandleError Filter и OutputCache Filter.

Фильтр авторизации использует несколько правил, по роле, по логину.

Фильтр обработки ошибок может по разному реагировать на ошибки, настройка на разные типы exception.

Интересно еще одно нововведение AccountController Class. Это уже реализация целой логики по управлению account-ами.

Как и раньше делаются все усилия чтобы данный продукт легко поддавался тестированию. Этот принцип коснулся и Testing TempData.
With previous ASP.NET MVC Previews you had to mock objects in order to test the TempData collection. With Preview 4 you no longer need to mock or setup anything. You can now add and verify objects within the Controller's TempData collection directly within your unit tests (for example: populate a controller's TempData property before calling its action method, or verify that the action updated the TempData after the action returned). The actual storage semantics of the TempData collection is now encapsulated within a separate TempDataProvider property.
И в заключении Скотт пообещал рассказать какие изменения коснутся AJAX в 4 Preview.
Я же со своей стороны жду появления subcontrollers. )

Осенило!!! Используем новые возможности ViewData

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

Например если контроллер выполняет какую то работы и передает свои данные во View, то не используем типизированную ViewData. Используем стандартный словарь. Об этом я тоже писал.


И вот мы получили 3 релиз AspNet MVC. В котором немного поменялся вид этой самой ViewData. Теперь если вы используете типизированную ViewData, то для обращения к ней надо писать вот так ViewData.Model. А сама ViewData так и осталось словарем.
Тоесть если контроллер выполняет какие то действия, то результат можно запихивать в структуру и передавать как ViewData. Если же ViewData надо расширить какими-либо данные из вне, то их можно спокойно поместить во ViewData со своим ключем.

Я думаю такое изменение ViewData это попытка найти подход или решение, к передаче данных во View, не только из контроллера но и из sub-контроллера.

Переход на Trac 0.11, в отдельно взятой деревне.

У нас в команде для управления проектами и задачами используется trac. До не давнего времени(24,06,08) стояла 0.10 и в принципе всем устраивала, но вот встал вопрос о написании своих workflow для тикетов. Тем более что такая возможность была предоставлена в версии 0.11. Заодно решили пропатчить и остальной софт который нужен для работы trac-а
Зайдя на сайт и обновив знания об установки закачал следующий софт:
python-2.5
Genshi-0.5
mod_python-3.3.1
pysqlite-2.4.0
setuptools-0.6c7
svn-python-1.4.6
Trac-0.11

Питон 2.5 я решил оставить. А вот остальное заменить на более новые версии.
Новые версии софта помимо стандартной поставки(в виде исходников), стали предоставляться и в виде бинарников(запустил exe и сиди жди). Поэтому процесс установки занял мало времени и много сил не отнял. После установки новой версии надо обновить окружение проектов. Если раньше для работы с trac-admin надо было запускать его через python.exe, то в новой версии trac-admin поставляется как exe файл.
trac-admin C:\MyProjects\Project\ upgrade
На данном этапе проблем особых не было и все проекты спокойно обновили свое окружение.
Далее перезапустил Apache и зашел в управление проектом. Ввел логин и пароль... Тут и начались проблемы. Сервер принимал пароль с логином и вываливался по дисконнекту.
Логи апача показывали следующее:
[Tue Jun 24 15:05:15 2008] [notice] Parent: child process exited with status 0 -- Restarting.
[Tue Jun 24 15:05:15 2008] [notice] Apache/2.2.9 (Win32) DAV/2 mod_auth_sspi/1.0.4 SVN/1.4.5 configured -- resuming normal operations
[Tue Jun 24 15:05:15 2008] [notice] Server built: Jun 13 2008 04:04:59
[Tue Jun 24 15:05:15 2008] [notice] Parent: Created child process 4364
[Tue Jun 24 15:05:15 2008] [debug] mpm_winnt.c(487): Parent: Sent the scoreboard to the child
[Tue Jun 24 15:05:15 2008] [notice] mod_python: Creating 8 session mutexes based on 0 max processes and 250 max threads.
[Tue Jun 24 15:05:15 2008] [notice] Child 4364: Child process is running
[Tue Jun 24 15:05:15 2008] [info] Parent: Duplicating socket 280 and sending it to child process 4364
[Tue Jun 24 15:05:15 2008] [debug] mpm_winnt.c(408): Child 4364: Retrieved our scoreboard from the parent.
[Tue Jun 24 15:05:15 2008] [debug] mpm_winnt.c(605): Parent: Sent 1 listeners to child 4364
[Tue Jun 24 15:05:15 2008] [debug] mpm_winnt.c(564): Child 4364: retrieved 1 listeners from parent
[Tue Jun 24 15:05:15 2008] [notice] Child 4364: Acquired the start mutex.
[Tue Jun 24 15:05:15 2008] [notice] Child 4364: Starting 250 worker threads.
[Tue Jun 24 15:05:15 2008] [notice] Child 4364: Starting thread to listen on port 81.
Логи Windows 2003 выдавали, что произошла ошибка VsJITDebugger:
An unhandled win32 exception occurred in httpd.exe [8024]. Just-In-Time debugging this exception failed with the following error: Debugger could not be started because no user is logged on.
В начале пришлось повозиться для отключения дебагинга, чтобы увидеть нормальную ошибку. Для этого надо было слазить в реестр винда и удалить ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AhDebug.
После этого стала видна сама ошибка и почему она возникает:
Ошибка приложения httpd.exe, версия 2.2.9.0, модуль libapr-1.dll, версия 1.3.0.0, адрес 0x000079fc.
Порывшись на форумах была найдена причина. Оказывается версия файла libapr-1.dll который используется в при работе Apache не совпадает с версией файла который установлен вместе с пакетом svn-python-1.4.6.
Делал попытки скопировать файл одной версии в папку bin Апача и в папку svn-python(находится по пути \\Python25\Lib\site-packages\libsvn\). Все в пустую, проклятая ошибка была живее всех живых...

Проблема решилось только после отказа от svn-python-1.4.6 и возврата на svn-python-1.4.5.

Дальше стоит вопрос о переходе на SVN-1.5. Вот теперь думаю, а нужен он такой геморой ? )))))