<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dev.net.ua/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Дмитрий Лапшин</title><subtitle type="html" /><id>http://dev.net.ua/blogs/dmytrol/atom.aspx</id><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dev.net.ua/blogs/dmytrol/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2008-06-11T18:55:11Z</updated><entry><title>Рабочие элементы: состояния и переходы между ними</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/11/12/7174.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/11/12/7174.aspx</id><published>2008-11-12T21:47:51Z</published><updated>2008-11-12T21:47:51Z</updated><content type="html">&lt;p&gt;Уже неоднократно наблюдал ситуацию, когда люди, переходящие на TFS с других программ управления требованиями или дефектами, испытывают трудности с непривычной для них, основанной на двух, а не одном, полях системой статусов - или, как они называются в TFS, состояний. Порой даже &amp;quot;родная&amp;quot; система полностью игнорируется, а вместо нее заводится привычное поле &amp;quot;Status&amp;quot; с привычной же кучей всевозможных значений &lt;img src="http://dev.net.ua/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;  &lt;p&gt;Такой подход может сгладить &amp;quot;кривую обучения&amp;quot; в краткосрочной перспективе, но в долгосрочной - имеет ряд побочных эффектов, особенно если в дальнейшем планируется задействовать не отдельные подсистемы TFS, а все возможности продукта в единой связке. В первую очередь, речь идет о подсистеме отчетности и запросах: многие стандартные отчеты и запросы к хранилищу рабочих элементов предполагают использование родной системы управления состояниями, и в противном случае просто не будут работать.&lt;/p&gt;  &lt;p&gt;С другой стороны, в родной системе состояний нет совершенно ничего &amp;quot;военного&amp;quot; - к ней попросту нужно привыкнуть. В основе лежит несколько простых и логичных принципов:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Весь жизненный цикл рабочего элемента представлен в виде &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)#.D0.9E.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84"&gt;ориентированного графа&lt;/a&gt;. Состояния являются его вершинами, а переходы между ними - ребрами:      &lt;br /&gt;&lt;img src="http://i.msdn.microsoft.com/Bb668962.image001(en-us,MSDN.10).jpg" /&gt; &lt;/li&gt;    &lt;li&gt;Количество состояний рабочего элементов должно быть минимальным. В стандартных шаблонах их максимум четыре:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Proposed - рабочий элемент предложен для рассмотрения, но еще не принят в работу - например, клиент предложил новую функциональную возможность, но команда не будет ее реализовывать в текущей итерации.&lt;/li&gt;      &lt;li&gt;Active - над рабочим элементом ведется работа - например, пишется код.&lt;/li&gt;      &lt;li&gt;Resolved - рабочий элемент готов к проверке или тестированию - например, разработчик написал код и юнит-тесты, и все юнит-тесты проходят успешно.&lt;/li&gt;      &lt;li&gt;Closed - никакие действия над рабочим элементом более не требуются, например, тестирование прошло успешно и функциональность вошла в очередной релиз.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Минимум состояний компенсируется множеством переходов из одного состояния в другое. Каждый переход представляет собой конкретную причину, по которой рабочий элемент оказался в том или ином состоянии. Например, в состоянии Active находятся как принятые в работу в текущей итерации рабочие элементы, так и те, которые &amp;quot;завалили&amp;quot; проверку или тестирование.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Небольшое количество состояний позволяет легко отслеживать динамику &amp;quot;движения&amp;quot; работы в команде. Например, большое количество рабочих элементов в состоянии Proposed может говорить о том, что либо у заказчика бурная фантазия и он придумывает функциональные возможности быстрее, чем команда в состоянии их реализовывать, либо существует узкое место в процессе утверждения в работу (например, перегружен менеджер проекта или заказчик не отвечает на письма и звонки). А большая очередь из рабочих элементов в состоянии Resolved может означать, что команде не хватает инженеров по тестированию.&lt;/p&gt;  &lt;p&gt;Разумеется, цифра &amp;quot;четыре&amp;quot; - отнюдь не догма. Бывают случаи, когда большее количество состояний оправдано - например, чтобы отдельно отслеживать требования, которые были успешно проверены на тестовом окружении, но еще не попали в производственную эксплуатацию. С другой стороны, не стоит заводить состояния вида &amp;quot;Verified Fixed&amp;quot; или &amp;quot;Verification Failed&amp;quot; - такие значения, скорее, подходят для поля Reason.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7174" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Измерение качества кода с помощью Visual Studio 2008</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/10/24/7050.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/10/24/7050.aspx</id><published>2008-10-24T09:43:44Z</published><updated>2008-10-24T09:43:44Z</updated><content type="html">&lt;p&gt;VS 2008 предоствляет 4 метрики, которые подробно описаны в блоге Code Analysis Team:   &lt;br /&gt;&lt;a href="http://blogs.msdn.com/fxcop/archive/2007/10/03/new-for-visual-studio-2008-code-metrics.aspx"&gt;http://blogs.msdn.com/fxcop/archive/2007/10/03/new-for-visual-studio-2008-code-metrics.aspx&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Взаимозависимость классов: чем она больше, тем больше вероятность регрессионных дефектов, сложнее писать юнит-тесты и делать рефакторинг; &lt;/li&gt;    &lt;li&gt;Глубина наследования: сложные иерархии классов трудны для понимания, осложняют изучение кода новым членам команды. Обратите внимание, что реализация интерфейсов в этой метрике не учитывается. &lt;/li&gt;    &lt;li&gt;Цикломатическая сложность: опять же, чем она больше, тем сложнее отлаживать и поддерживать код, сложнее тестировать, как следствие - повышается вероятность дефектов; &lt;/li&gt;    &lt;li&gt;Количество строк кода: куда же без них &lt;img alt=":-)" src="http://ctoblog.validio.com.ua/smilies/happy.gif" /&gt; На уровне классов позволяет выявлять &amp;quot;раздутые&amp;quot; (&amp;quot;три экрана кода&amp;quot;) методы, которые логично разбить на несколько более мелких. Цикломатическая сложность, кстати, при этом может быть небольшой, если много действий выполняются строго последовательно. &lt;/li&gt;    &lt;li&gt;Индекс простоты обслуживания: синтетическая метрика, учитывающая, в частности, количество строк кода, цикломатическую сложность и &lt;a href="http://en.wikipedia.org/wiki/Halstead_Complexity_Measures"&gt;объем Халстеда&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7050" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/Visual+Studio/default.aspx" /><category term="Метрики" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_1C0435044204400438043A043804_/default.aspx" /></entry><entry><title>Запросы, подписки и переименование областей и итераций</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/10/17/7020.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/10/17/7020.aspx</id><published>2008-10-17T20:20:50Z</published><updated>2008-10-17T20:20:50Z</updated><content type="html">&lt;p&gt;В TFS можно переименовывать уже существующие области и итерации. Но при этом нужно учитывать, что если в ваших запросах присутствуют условия наподобие &amp;quot;Area Path under ...&amp;quot;, где в пути фигурирует название переименованной области или итерации, то такие запросы перестанут работать. Для того, чтобы восстановить работоспособность запросов, откройте их для редактирования и исправьте условия, включающие поля Area Path&amp;#160; или Iteration Path.&lt;/p&gt;  &lt;p&gt;Та же самая ситуация с подписками на события. После переименования области или итерации нужно перепроверить условия и, при необходимости, обновить их.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7020" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="Работа с work items" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_2004300431043E0442043004_+_4104_+work+items/default.aspx" /><category term="Полезные советы" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_1F043E043B04350437043D044B043504_+_41043E043204350442044B04_/default.aspx" /><category term="TFS Core Services" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/TFS+Core+Services/default.aspx" /></entry><entry><title>Связи решают все</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/10/16/7016.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/10/16/7016.aspx</id><published>2008-10-15T21:24:08Z</published><updated>2008-10-15T21:24:08Z</updated><content type="html">&lt;p&gt;Team Foundation Server не был бы столь мощным инструментом, объединяющим все роли в проектной группе, если данные составляющих его подсистем были бы изолированными &amp;quot;островками&amp;quot;. К счастью, это не так, TFS предоставляет средства для установления связей между различными артефактами. Об этих связях я и хочу рассказать подробнее. &lt;/p&gt;  &lt;p&gt;Рассмотрим поподробнее &amp;quot;анатомию&amp;quot; ссылки:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Может быть представлена в виде URI вида vstfs:///&amp;lt;tooltype&amp;gt;/&amp;lt;artifacttype&amp;gt;/&amp;lt;tool-specific id&amp;gt;, где &amp;quot;tooltype&amp;quot; - это идентификатор подсистемы (контроль версий, управление сборкой и т.п.), а artifacttype - идентификатор артефакта (например, &amp;quot;набор изменений&amp;quot;). Естественно, оба идентификатора записываются латиницей, например: vstfs:///WorkItemTracking/WorkItem/16723 или vstfs:///vsversionstore/file/b4e3216.&lt;/li&gt;    &lt;li&gt;Связывает потребителя артефакта с его поставщиком. Например, если рабочий элемент ссылается на набор изменений в системе контроля версий, то подсистема управления рабочими элементами&amp;#160; является потребителем, а подсистема контроля версий - поставщиком. Потребитель и поставщик могут ничего не знать друг о друге, что, благодаря подсистеме регистрации поставщиков, потребителей и типов ссылок, обеспечивает расширяемость (об этом немного подробнее ниже).&lt;/li&gt;    &lt;li&gt;Ссылки двунаправленны и имеют &amp;quot;прочтение&amp;quot; в каждую из сторон. В примере из второго пункта, если предположить, что тип рабочего элемента - &amp;quot;Дефект&amp;quot;, прочтение в одну из сторон, от рабочего элемента к набору изменений, может звучать как &amp;quot;Исправлен в&amp;quot;, а в обратную - &amp;quot;Исправляет&amp;quot;.&lt;/li&gt;    &lt;li&gt;Контракты поставщика и потребителя соответственно предусматривают возможность прямых (&amp;quot;дайте мне артефакты с такими-то идентификаторам&amp;quot;) и обратных (&amp;quot;ссылаетесь ли вы на артефакты с такими-то идентификаторами?&amp;quot;) запросов&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;С точки зрения TFS SDK ссылки делятся на три класса:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.workitemtracking.client.externallink(VS.80).aspx"&gt;Внешние ссылки&lt;/a&gt;. Обеспечивают связь рабочих элементов с другими артефактами, такими, как наборы изменений или результаты тестов.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.workitemtracking.client.relatedlink(VS.80).aspx"&gt;RelatedLink&lt;/a&gt;: Ссылки на связанные рабочие элементы. С помощью этого класса ссылок можно обеспечить прослеживаемость, например, какие сценарии тестирования покрывают то или иное требование. Фактически, это подкласс внешних ссылок, выделенный для удобства в отдельную категорию как наиболее часто используемый.&lt;/li&gt;    &lt;li&gt;Гиперссылки. Здесь все очевидно - обойдемся без комментариев.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Благодаря расширяемой архитектуре TFS можно создавать собственные типы ссылок и, в случае, если поставщиком или потребителем является подсистема управления рабочими элементами, в нее можно встроить собственный пользовательский интерфейс для выбора артефактов для связи с рабочим элементом. Подробно обо всем этом &lt;a href="http://blogs.msdn.com/narend/archive/2006/10/13/how-to-extend-linking-and-workitem-ui-with-custom-link-types.aspx"&gt;рассказывается&lt;/a&gt; в &lt;a href="http://blogs.msdn.com/narend/default.aspx"&gt;блоге Naren Datha&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;И, напоследок - об изменениях в linking API в Rosario: &lt;a title="http://blogs.msdn.com/dgorti/archive/2007/09/26/querying-on-workitem-links-through-the-api.aspx" href="http://blogs.msdn.com/dgorti/archive/2007/09/26/querying-on-workitem-links-through-the-api.aspx"&gt;http://blogs.msdn.com/dgorti/archive/2007/09/26/querying-on-workitem-links-through-the-api.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7016" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="VSTS Rosario" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/VSTS+Rosario/default.aspx" /><category term="TFS Core Services" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/TFS+Core+Services/default.aspx" /></entry><entry><title>VSTE for Developers и VSTE for Database Professionals - краще разом!</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/10/03/6966.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/10/03/6966.aspx</id><published>2008-10-03T20:13:02Z</published><updated>2008-10-03T20:13:02Z</updated><content type="html">&lt;p&gt;Существование отдельной редакции Visual Studio для профессионалов по базам данных (VSTE for Database Professionals, также известной среди блоггеров Microsoft как &amp;quot;Data Dude&amp;quot;), сильно омрачало жизнь разработчикам Windows и Web приложений. Дело в том, что в реальности редко когда всеми задачами, связанными с базами данных, занимается отдельный человек. Как правило, на &amp;quot;долю&amp;quot; администратора баз данных (DBA) достается оптимизация запросов и структуры базы, а также поддержка и обслуживание БД, находящейся в производственной эксплуатации. Рутинными же задачами по написанию запросов, хранимых процедур и т.п. занимаются разработчики. Ну а поскольку VSTE for Database Professionals - отдельная редакция Visual Studio, которую можно приобрести только в составе MSDN-подписки, то большинство организаций либо не приобретали эту редакцию вообще (поскольку DBA вполне комфортно себя чувствовали и с привычным инструментарием), либо, в лучшем случае, приобретали в очень ограниченных объемах.&lt;/p&gt;  &lt;p&gt;Однако, я бы не писал столь подробной предыстории, если бы не замечательные новости - с 1 октября редакции Visual Studio для разработчиков и профессионалов по БД &lt;a href="http://msdn.microsoft.com/en-us/vsts2008/products/cc990295.aspx"&gt;становятся одним продуктом&lt;/a&gt;! Подписчики, приобревшие VSTE for Developers + MSDN Premium, равно как и партнеры, которым по условиям партнерской программы полагаются лицензии на эту редакцию, теперь автоматически получают лицензию и на VSTE for Database Professionals. И хотя физически единым продуктом обе редакции станут лишь в следующей версии Visual Studio 2010, уже сейчас подписчики получат доступ к скачиванию инсталляционного пакета. Причем, изменения касаются не только Visual Studio 2008, но и Visual Studio 2005.&lt;/p&gt;  &lt;p&gt;Остается добавить только одно: &lt;strong&gt;МО-ЛОД-ЦЫ&lt;/strong&gt;!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6966" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/Visual+Studio/default.aspx" /><category term="анонсы" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_30043D043E043D0441044B04_/default.aspx" /></entry><entry><title>Об одной особенности прав доступа уровня области или итерации</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/09/20/6905.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/09/20/6905.aspx</id><published>2008-09-20T13:51:40Z</published><updated>2008-09-20T13:51:40Z</updated><content type="html">&lt;p&gt;В TFS существует возможность разграничения доступа на уровне отдельной области (area) или итерации - это удобно, когда над большим проектом работает несколько, возможно даже распределенных, команд. Тем не менее, полезно знать об одной неочевидной особенности TFS, когда вы создаете новую область или итерацию. Дело в том, что по умолчанию стандартные группы TFS, такие как Readers или Contributors не получают никаких прав доступа к вновь созданной области или итерации, соответственна, она будет недоступна ни вам, ни другим пользователям при редактировании рабочих элементов. Причем, что интересно, в &lt;a href="http://msdn.microsoft.com/en-us/library/ms253077.aspx"&gt;документации&lt;/a&gt; (раздел &lt;strong&gt;Area-Level Groups and Permissions&lt;/strong&gt;) написано ровным счетом обратное, но на практике, возможно, только при каких-то определенных условиях, происходит именно то, что описано выше, порождая &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3879717&amp;amp;SiteID=1"&gt;вопросы в форумах&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Поэтому, сразу же после создания, убедитесь, что права доступа настроены следующим образом:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Группа Contributors и Build Services&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;View this node&lt;/li&gt;    &lt;li&gt;View work items in this node (только для областей)&lt;/li&gt;    &lt;li&gt;Edit work items in this node (только для областей)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Группа Project Administrators&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;View this node&lt;/li&gt;    &lt;li&gt;View work items in this node (только для областей)&lt;/li&gt;    &lt;li&gt;Edit work items in this node (только для областей)&lt;/li&gt;    &lt;li&gt;Create and order child nodes&lt;/li&gt;    &lt;li&gt;Delete this node&lt;/li&gt;    &lt;li&gt;Edit this node&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Группа Readers&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;View this node&lt;/li&gt;    &lt;li&gt;View work items in this node (только для областей)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Подробности в документации:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms253077.aspx" href="http://msdn.microsoft.com/en-us/library/ms253077.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms253077.aspx&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms252587.aspx" href="http://msdn.microsoft.com/en-us/library/ms252587.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms252587.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6905" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Осторожно: порядок выполнения модульных (unit) тестов</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/08/14/6661.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/08/14/6661.aspx</id><published>2008-08-14T14:51:23Z</published><updated>2008-08-14T14:51:23Z</updated><content type="html">&lt;p&gt;Насколько я помню, в классике модульного тестирования принято, что порядок выполнения модульных тестов не определен - то есть, модульные тесты не могут зависеть от результатов выполнения других модульных тестов. Но разработчики mstest пошли еще дальше: среда исполнения многопоточна и запускает на выполнение несколько модульных тестов &lt;strong&gt;одновременно&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Это означает, что нужно быть очень осторожным, если в коде ваших тестов используются статические объекты, такие как &amp;quot;Одиночки&amp;quot; (Singleton) или фабрики классов, поведение которых зависит от внешних условий, задаваемых индивидуально в каждом тесте. Например, это может быть фабрика классов внутри &lt;a href="http://xunitpatterns.com/SUT.html"&gt;тестируемой системы&lt;/a&gt;, которая создает реальный объект или &amp;quot;дублера для тестирования&amp;quot; (&lt;a href="http://xunitpatterns.com/Test%20Double.html"&gt;Test Double&lt;/a&gt;, он же в просторечии mock object &lt;img src="http://dev.net.ua/emoticons/emotion-1.gif" alt="Smile" /&gt;) в зависимости от заданного модульным тестом режима.&amp;#160; Проще всего даже будет отказаться от подобных сценариев и решать задачу внедрения зависимостей другими способами, например через &lt;a href="http://xunitpatterns.com/Dependency%20Injection.html#Constructor%20Injection"&gt;конструктор&lt;/a&gt; или &lt;a href="http://xunitpatterns.com/Dependency%20Injection.html#Setter%20Injection"&gt;специальное свойство&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;А родробнее про исследование порядка выполнения модульных тестов можно прочитать у &lt;a href="http://blogs.msdn.com/nnaderi/default.aspx"&gt;Naysawn Naderi&lt;/a&gt;: &lt;a href="http://blogs.msdn.com/nnaderi/archive/2007/02/17/explaining-execution-order.aspx"&gt;That Pesky MSTest Execution Ordering..&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6661" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Check out и редактирование документов на портале проекта из Team Explorer</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/07/16/6490.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/07/16/6490.aspx</id><published>2008-07-16T10:31:42Z</published><updated>2008-07-16T10:31:42Z</updated><content type="html">&lt;p&gt;По какому-то странному стечению обстоятельств разработчики Team Explorer упустили возможность изъятия для редактирования (check out) хранящихся на портале группового проекта документов непосредственно из узла Documents. В результате, открыть документ для редактирования можно, но при сохранении есть вероятность переписать текущую версию без сохранения истории изменений.&lt;/p&gt;  &lt;p&gt;Частично проблему в TFS 2008 и Windows SharePoint Services 3.0 можно решить таким образом. В SharePoint заходим в настройки контроля версий для нужной библиотеки документов (&lt;strong&gt;Settings&lt;/strong&gt; | &lt;strong&gt;Document Library Settings &lt;/strong&gt;| &lt;strong&gt;Versioning Settings&lt;/strong&gt;) и для опции &lt;strong&gt;Require documents to be checked out before they can be edited?&lt;/strong&gt; ставим &lt;strong&gt;Yes&lt;/strong&gt;. Теперь, даже если документ был открыт для редактирования, переписать текущую версию без явного выполнения операции Check out не получится. С другой стороны, если вы используете Office 2007, то изъять документ для редактирования можно непосредственно из Word или Excel сразу же после открытия.&lt;/p&gt;  &lt;p&gt;Более удобное решение потребовало бы написания адд-ина к Team Explorer, что уже само по себе - задача нетривиальная, но еще сложнее, мне кажется, было бы получить URL документа, на котором нажали правой кнопкой мыши. Быстрый поиск в Google, возможно, именно по причине сложности реализации, такого решения не нашел.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6490" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="Полезные советы" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_1F043E043B04350437043D044B043504_+_41043E043204350442044B04_/default.aspx" /><category term="SharePoint" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/SharePoint/default.aspx" /><category term="TFS 2008" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/TFS+2008/default.aspx" /></entry><entry><title>Ждем июльских TFS Power Tools</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/07/12/6473.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/07/12/6473.aspx</id><published>2008-07-12T12:05:49Z</published><updated>2008-07-12T12:05:49Z</updated><content type="html">&lt;p&gt;В новой версии, из самого интересного, &lt;a href="http://blogs.msdn.com/bharry/archive/2008/07/08/july-08-tfs-power-tool-preview.aspx"&gt;обещают&lt;/a&gt;:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Наконец-то, &amp;quot;родной&amp;quot; человеческий инструментарий для подписки на события&lt;/li&gt;    &lt;li&gt;Поддержка переименования пользователей в Windows/Active Directory&lt;/li&gt;    &lt;li&gt;Обновление Team System Web Access,которое выйдет сразу на 10 языках, но на месяц позже&lt;/li&gt; &lt;/ol&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6473" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="TFS Tools" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/TFS+Tools/default.aspx" /><category term="анонсы" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_30043D043E043D0441044B04_/default.aspx" /></entry><entry><title>Первый отчет своими руками</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/07/08/6449.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/07/08/6449.aspx</id><published>2008-07-08T15:42:32Z</published><updated>2008-07-08T15:42:32Z</updated><content type="html">&lt;p&gt;Хотя я уже довольно много времени занимаюсь TFS, его хранилище данных и создание собственных отчетов до сих пор оставались terra incognita. В основном, из-за &amp;quot;технологического барьера&amp;quot; - в своем программистском прошлом &lt;img src="http://dev.net.ua/emoticons/emotion-1.gif" alt="Smile" /&gt; сталкиваться с OLAP не приходилось вообще, а с отчетами - очень поверхностно.&lt;/p&gt;  &lt;p&gt;Но... все когда-то бывает в первый раз. Сейчас одна из моих задач на работе - разработка метрик для нашего процесса разработки, а известно, что без автоматического сбора данных метрики, по-хорошему, не работают. Благо, наши разработчики все активнее используют TFS, который собирает довольно много данных автоматически, а там, где этого не хватает, задача решается вводом одного-двух дополнительных полей.&lt;/p&gt;  &lt;p&gt;Собрать данные мало - их нужно обработать, чтобы получить интересующие показатели, а потом представить в удобоваримой форме. Чтобы не писать &amp;quot;голословно-теоретическую&amp;quot; спецификацию, я решил поэкспериментировать, сделав один-два отчета-прототипа, иллюстрирующих общую концепцию. &lt;/p&gt;  &lt;p&gt;Пришлось закатать рукава и разобраться в том, как устроено хранилище данных TFS, что такое схема &amp;quot;звезда&amp;quot;, как создавать запросы к многомерному кубу и показывать результаты хотя бы в виде простенького отчета. Начать мне очень помогли брошюра &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=a74486b2-f7db-4a85-97bd-46bf478bda60&amp;amp;displaylang=en"&gt;Creating and Customizing TFS Reports&lt;/a&gt; и пост в &lt;a href="http://blogs.msdn.com/teams_wit_tools/"&gt;блоге Team WIT Tools&lt;/a&gt; под названием &lt;a href="http://blogs.msdn.com/teams_wit_tools/archive/2007/04/30/understanding-the-tfs-cube.aspx"&gt;Understanding the TFS Cube&lt;/a&gt; - без этих материалов мое разбирательство затянулось бы на несколько дней, а так уже через часов 6-7 чистого времени (и то, по большей части из-за разбирательства с аггрегирующими функциями в языке запросов MDX) был получен первый результат. Очень рекомендую всем, кто планирует работать с хранилищем данных TFS.&lt;/p&gt;  &lt;p&gt;По моим впечатлениям, самое трудное, если вы раньше не сталкивались с OLAP - понять, как &amp;quot;работают&amp;quot; хранилища данных и построенные по ним многомерные кубы. Освоившись с этим, уже гораздо легче будет понять &lt;a href="http://msdn.microsoft.com/en-us/library/ms244710(VS.80).aspx"&gt;структуру куба TFS Warehouse&lt;/a&gt; и &amp;quot;набить руку&amp;quot; в использовании его основных измерений (dimensions) и мер (measures) - заодно попрактикуетесь в составлении MDX-запросов. С получением же данных из самого хранилища, если вы раньше работали с базами данных Microsoft SQL Server, серьезных проблем вообще быть не должно - хотя сама &lt;a href="http://msdn.microsoft.com/en-us/library/ms244691(VS.80).aspx"&gt;схема базы&lt;/a&gt; и отличается от привычных нам 3й и более высоких нормальных форм, во всем остальном получение данных происходит точно также (за исключением не всегда очевидных пар первичных и внешних ключей).&lt;/p&gt;  &lt;p&gt;Пока что я не планирую заниматься отчетами серьезно, на уровне производственной эксплуатации, но чем, как говорится, черт не шутит... поэтому добавил себе в закладки &lt;a href="http://blogs.msdn.com/teams_wit_tools/archive/2007/03/26/tfs-report-developer-resources.aspx"&gt;подборку материалов&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6449" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author><category term="Метрики" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/_1C0435044204400438043A043804_/default.aspx" /><category term="TFS Warehouse and Reporting" scheme="http://dev.net.ua/blogs/dmytrol/archive/tags/TFS+Warehouse+and+Reporting/default.aspx" /></entry><entry><title>Способы сборки инсталляционных пакетов с помощью Team Build</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/06/27/6400.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/06/27/6400.aspx</id><published>2008-06-27T11:45:11Z</published><updated>2008-06-27T11:45:11Z</updated><content type="html">&lt;p&gt;В идеале, при гибкой (Agile) разработке процесс сборки решения и его развертывания в среде тестирования или опытной эксплуатации должен быть полностью автоматизированным, как и б&lt;strong&gt;о&lt;/strong&gt;льшая часть самого тестирования - это позволяет производить сборку и ее тестовый прогон как минимум раз в день. Такая частота тестирования помогает выявлять дефекты практически сразу же после того, как они были внесены в код, а общеизвестно, что стоимость исправления дефекта очень быстро растет со временем.&lt;/p&gt;  &lt;p&gt;К сожалению, в стандартной поставке Team Build отсутствует возможность сборки инсталляционных пакетов, но не беда: решения существуют как для стандартных проектов создания инсталляций, так и для нестандартных/сторонних решений:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/anutthara/archive/2006/01/05/509606.aspx"&gt;Обычные проекты создания инсталляций Visual Studio (.vdproj)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx"&gt;Web Deployment Projects&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://mihaiciureanu.blogspot.com/2007/07/wix-and-team-build-tfs-integration.html"&gt;WIX 2.0&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6400" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Создание своего адаптера к хранилищу данных TFS - нелегкое дело</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/06/26/6395.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/06/26/6395.aspx</id><published>2008-06-26T15:31:11Z</published><updated>2008-06-26T15:31:11Z</updated><content type="html">&lt;p&gt;Сегодня искал информацию о структуре хранилища данных TFS (data warehouse) и попутно набрел на блог разработчика из Норвегии, который описывает свою эпопею создания своего адаптера к хранилищу для накопления статистики о метриках кода. Интересно, кто-нибудь вообще пытался создавать адаптер для других целей? &lt;img src="http://dev.net.ua/emoticons/emotion-1.gif" alt="Smile" /&gt; - мы в свое время писали собственный тоже именно для сбора метрик.&lt;/p&gt;  &lt;p&gt;К сожалению, записи в дневнике обрываются перед Рождеством 2007 года, поэтому неизвестно, чем закончилось дело, удалось ли Tommy запустить адаптер. Я написал ему письмо, дай Бог, ответит... Между тем, если вы занимаетесь подобной задачей, стоит почитать его заметки, чтобы обойти наиболее вероятные &amp;quot;грабли&amp;quot;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tomfury.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;amp;_c=BlogPart&amp;amp;partqs=amonth%3d10%26ayear%3d2007"&gt;Октябрь 2007 г.&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://tomfury.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;amp;_c=BlogPart&amp;amp;partqs=amonth%3d11%26ayear%3d2007"&gt;Ноябрь 2007 г.&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://tomfury.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;amp;_c=BlogPart&amp;amp;partqs=amonth%3d12%26ayear%3d2007"&gt;Декабрь 2007 г.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6395" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Team Foundation Server и RSS</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/06/24/6382.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/06/24/6382.aspx</id><published>2008-06-24T16:40:25Z</published><updated>2008-06-24T16:40:25Z</updated><content type="html">&lt;p&gt;Любопытно, но, похоже, пока еще никто не реализовал полноценную подписку на события TFS (eventing service) через RSS-каналы. Есть отдельные некоммерческие реализации &lt;a href="http://blogs.msdn.com/jefflu/archive/2005/07/27/443900.aspx"&gt;для подсистемы контроля версий&lt;/a&gt; (и то, судя по коду, делает рекурсивный обход дерева, а не накапливает информацию от поступающих событий) и &lt;a href="http://blogs.msdn.com/abhinaba/archive/2005/12/21/506277.aspx"&gt;для отслеживания статуса групповых сборок&lt;/a&gt;.&amp;#160; А вот какого-то универсального решения, которое позволяло бы мне &amp;quot;на лету&amp;quot; создавать нужные мне RSS-каналы, не существует.&lt;/p&gt;  &lt;p&gt;Как идея, при реализации можно было бы использовать механизмы &lt;a href="http://www.codeplex.com/MigrationSyncToolkit"&gt;TFS Migration and Synchronization Toolkit&lt;/a&gt; для периодического получения списков изменений в рабочих элементах и системе контроля версий - но еще вопрос, лучше ли это с точки зрения производительности, чем подписка на события и последующий анализ данных без дополнительной нагрузки на TFS... С другой стороны, при использовании событий их придется где-то накапливать для последующей обработки, и периодически вычищать это хранилище по критерию &amp;quot;срока давности&amp;quot;.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6382" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Поиск текста в рабочих элементах</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/06/20/6356.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/06/20/6356.aspx</id><published>2008-06-20T14:00:00Z</published><updated>2008-06-20T14:00:00Z</updated><content type="html">&lt;P&gt;Поиск рабочих элементов, содержащих заданный текст - задача, встречающаяся довольно часто. Однако же, в Team Explorer нет встроенной функции поиска, а городить "одноразовые" запросы - неудобно и непроизводительно. К счастью, существует более удобное решение: небольшой add-in для Visual Studio, который предназначен именно для этой цели: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/noahc/archive/2007/03/08/search-work-items-team-system-addin.aspx"&gt;http://blogs.msdn.com/noahc/archive/2007/03/08/search-work-items-team-system-addin.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Add-in бесплатный, с открытым исходным кодом, написан сотрудником Microsoft. "Инструкция по эксплуатации" (кстати, ее советую-таки прочитать - в текущей версии настройка шаблона запроса для поиска неочевидна) - в упомянутом выше посте.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Upd&lt;/STRONG&gt;:&amp;nbsp;Коллега подсказал альтернативный add-in, которым пользуется сам и очень доволен:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.acorns.com.au/projects/vsaddins/"&gt;http://www.acorns.com.au/projects/vsaddins/&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6356" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry><entry><title>Шаблон процесса ThoughtWorks Agile для TFS</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/dmytrol/archive/2008/06/11/6305.aspx" /><id>http://dev.net.ua/blogs/dmytrol/archive/2008/06/11/6305.aspx</id><published>2008-06-11T15:55:11Z</published><updated>2008-06-11T15:55:11Z</updated><content type="html">&lt;p&gt;Набрел случайно на &lt;a&gt;презентацию&lt;/a&gt; о шаблоне процесса для TFS на основе принципов гибкой разработки (фактически - некий гибрид SCRUM и XP) от ThoughtWorks. Понравился шаблон рабочего элемента для Story - формализовано описание &amp;quot;Как [персона] я хочу [потребность] для того, чтобы [какой практический результат получу]&amp;quot;&lt;/p&gt;  &lt;p&gt;Hint: В этой компании работает Мартин Фаулер &lt;img src="http://dev.net.ua/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6305" width="1" height="1"&gt;</content><author><name>DmytroL</name><uri>http://dev.net.ua/members/DmytroL.aspx</uri></author></entry></feed>