tag:blogger.com,1999:blog-29209088751744348212024-03-05T17:17:35.791-08:00Тестирование ПО и карьера в ITПерсhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-2920908875174434821.post-26881636093833320192012-11-12T05:19:00.000-08:002012-11-12T05:26:29.944-08:00Юнит тестирование в C#. Unit test in C#. Использование mock объектов. <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="post-title entry-title" style="text-align: left;">
<b><span style="font-weight: normal;">Начнем с основ. <a href="http://ru.wikipedia.org/wiki/Mock-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82">Википедия </a>нам с радостью скажет, что mock-объект это объект-имитация или объект-пародия. Данные </span></b><span style="font-weight: normal;">объекты нужны для упрощения написания модульных тестов зависимых от смежных проектов. Например у нас есть большой проект, в рамках которого работает несколько команд над своими проектами. Архитекторы с аналитиками проработали и согласовали интерфейсы. Но сложность и скорость разработки у каждой команды своя. А у нас есть зависимый от другой команды код, в котором планируется получать значение из сервиса разрабатываемого другой командой. </span>В том числе и при написании тестов. В данном случае нам на помощь и приходят различные mock фреймворки.</div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<div class="post-title entry-title" style="text-align: left;">
Небольшое отступление. В Visual studio 2012 в тестовом фреймворке есть namespace System.Fakes. Который предоставляет встроенные заглушки. </div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<div class="post-title entry-title" style="text-align: left;">
Мой выбор пал на <a href="http://code.google.com/p/moq/">Moq</a>. Т.к. его хвалили на stackoverflow :). </div>
<div class="post-title entry-title" style="text-align: left;">
И так предположим у нас есть интерфейс</div>
<code class="prettyprint lang-cs">
public class Contracts
{
public interface IUrlManager
{
UrlList GetByUserGuid(Guid id);
}
public enum UrlList
{
First = 1,
Second = 2,
}
}
</code>
<br />
<div class="post-title entry-title" style="text-align: left;">
В коде теста нам необходимо используя скаченный фреймворк "заглушить" или как еще говорят застабить, сервис, который его должен реализовывать. </div>
<div class="post-title entry-title" style="text-align: left;">
Все стандартно в Reference тестового проекта подключаем Moq.dll</div>
<div class="post-title entry-title" style="text-align: left;">
<br />
Далее в коде теста создаем мок по нужному нам интерфейсу.</div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<code class="prettyprint lang-cs">
var moc = new Mock<contracts .iurlmanager=".iurlmanager">();
// затем используя лямбда выражение пишем простую реализацию метода
moc.Setup(urlmanager => urlmanager.GetByUserGuid(new Guid("cb1e6c68-8750-4234-aaf1-abcaa3583eff"))).Returns(Contracts.UrlList.First)
// вызываем метод
var mocresult = moc.Object.GetByUserGuid(new Guid("cb1e6c68-8750-4234-aaf1-abcaa3583eff"));
</contracts></code>
<br />
<div class="post-title entry-title" style="text-align: left;">
</div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<div class="post-title entry-title" style="text-align: left;">
Подробнее про различные кейсы использования фреймворка описано на одной из <a href="http://code.google.com/p/moq/wiki/QuickStart">страниц ресурса</a></div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<div class="post-title entry-title" style="text-align: left;">
<br /></div>
<h3 class="post-title entry-title">
</h3>
<h3 class="post-title entry-title">
</h3>
</div>
Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-80929406274235922402009-09-16T05:40:00.001-07:002010-01-20T22:28:19.274-08:00Скрипт отправки email на VB<p>Данный скрипт создавался в Visual Studio 2008. Вообщем используется Visual Basic 2008 основанный на .NET Framework. Тип создаваемого проекта Vb Console Application Project. Пример приведен для почтовых серверов mail.ru.<br /></p><br /><br /><code class="prettyprint lang-vb"><br />Module SendMail<br /> 'Задать путь к System.Net.Mail в Reference<br /> Dim email As New MailMessage 'Если в Reference путь не задан, то можно System.Net.Mail.MailMessage<br /> Dim smtp As SmtpClient 'аналогично как выше<br /><br /><br /> Sub Main()<br /><br /><br /><br /> smtp = New SmtpClient("smtp.mail.ru", 2525) ' с 25 портом не работает<br /> smtp.Credentials = New NetworkCredential("login", "password")<br /> email.From = New MailAddress("aaa@evil")<br /> email.To.Add(New MailAddress("aaa@god"))<br /> email.Body = "test"<br /> email.Subject = "ttt"<br /><br /><br /> Try<br /><br /> smtp.Send(email)<br /><br /> Catch ex As Exception<br /><br /><br /><br /> End Try<br /><br /><br /> Console.ReadKey()<br /> End Sub<br /><br /><br /><br /><br />End Module<br /></code><br /><br /><p>Что меня больше всего удивило так это то, что в начале надо создать SMTP объект со свойствами авторизации, а затем уже задавать свойства объекта MailMessage. Если сделать наоборот, то скрипт не работает. </p><br /><p>Думаю, что в одном из последующих постов приведу пример QTP функции для отправки email</p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com2tag:blogger.com,1999:blog-2920908875174434821.post-67992568402630315842009-08-27T21:25:00.000-07:002010-01-20T22:36:32.520-08:00QTP script example for automate QTP (QuickTest) operations.<h2>Автоматизация запуска QTP тестов</h2><br /><p>В QTP есть интерфейс для обращения к его объектной модели QuickTest<br />Данный интерфейс реализован .dll библиотекой. В документации написано, что обертку для запуска QTP тестов можно писать на различных языках. Но наиболее удобным будет писать в среде разработки при подключенной библиотеки. Как оно и предполагается, будут доступны возможности IntelliSense. Также в QuickTest Professional Automation Object Model Reference написано, что в качестве библиотеки в reference надо указывать QTObjectModel.dll. <br /></p><br /><p>В данном посте я опишу свои впечатления о знакомстве с данной библиотекой</p><br /><ol><br /><li>Запуск QTP Application используя javascript<br /><p>Для начала можно написать простенький javascript код<br /><code class="prettyprint lang-js"><br /> function QTP() // объявляем функцию <br /> {<br /> debugger ; // это сделано для того, что бы при запуске в браузере выскочило окно с предложением о дебаге. <br /> var qtApp = new ActiveXObject("QuickTest.Application"); // Создаем объект application <br /><br />while (qtApp.Launched == false ) // Проверяем запущен или не запущен QTP и если false, то запускаем<br />{<br />qtApp.Launch();<br /><br />};<br /><br />qtApp.Visible = true // Делаем объект видимым<br />setTimeout(function() { qtApp.Quit() }, 10000); // через 10 секунд после того как QTP станет видимым он закроется<br /><br /> <br /> }<br /> </code><br /> <br /> Для запуска данного скрипта осталось только сделать html файлик в котором на какой-нить элемент повесить событие onclick или onload.<br /> В данном случае для отладки удобно использовать Visual studio. Не пробуйте запускать данный скрипт в firefox т.к. он официально не поддерживает ActiveX.<br /> Вот, что можно получить в случае отладки скриптов в студии. <br /> <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipF3VD3gveUHhKFI2lfaYn-V1FHiFSM2yQibaSghhA7MzuoTPC7IecpbxtALi7FnhAaHKM24BxtSpS4M-hWIto_fXZEg8Zxl0XUEf0Iq7sNd2bgIs3eARdgvI_-DFke1Lcg2hQ2YABzc6I/s1600-h/jsQTPstudio.PNG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 263px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipF3VD3gveUHhKFI2lfaYn-V1FHiFSM2yQibaSghhA7MzuoTPC7IecpbxtALi7FnhAaHKM24BxtSpS4M-hWIto_fXZEg8Zxl0XUEf0Iq7sNd2bgIs3eARdgvI_-DFke1Lcg2hQ2YABzc6I/s400/jsQTPstudio.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5374898412784812242" /></a><br /><br /><br /></p><br /></li><br /><li>Запуск QTP используя C#<br /><p><br />И так студия Visual Studio 2008. Тип создаваемого проекта C# console Application (на выходе получаем .dll и .exe файл для запуска приложения).<br />Сразу скажу, что то как описано ниже отличается от тех примеров создания объекта QTP Application из справки к QTP. <br /><code class="prettyprint lang-cs"><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using QTObjectModelLib; // здесь я использую библиотеку QTObjectModelLib.dll , вместо QTObjectModel.dll. Вроде как эту библиотеку лучше использовать , если обертка пишется на c#, но официального подтверждения этой информации я не видел. <br /><br />namespace TestRunner<br />{<br /> class Program <br /> {<br /> static void Main(string[] args) <br /> {<br /> AppDomain.CurrentDomain.UnhandledException += (s1, e1) => { Console.WriteLine((e1.ExceptionObject as Exception).ToString()); Console.ReadLine(); }; // это нужно для того, что бы если вдруг на компе, где запускается вдруг не окажется нужной dll<br /><br /> try<br /> {<br /> Testrunner(); // запуск метода в котором идет запуск QTP <br /> }<br /> catch (Exception e) // отлов возникающих ошибок и вывод их в консоль<br /> {<br /> Console.WriteLine(e.ToString());<br /> Console.ReadKey();<br /> }<br /> }<br /> <br /><br /> public static void Testrunner() <br /> {<br /> ApplicationClass app = new ApplicationClass(); // собственно создается объект класса в котором реализованы все методы интерфейсов объекта Application <br /> <br /> app.Launch(); // запуск QTP<br /> app.Visible = true; // Делаем видимым<br /> Console.ReadKey(); // Ждем нажатия кнопки в Console<br /> app.Quit(); // После нажатия кнопки в консоли мы закрываем QTP<br /> <br /> <br /> // Вкратце суть строчек ниже это очистка памяти. Метод FinalReleaseComObject Освобождает все ссылки на вызываемую оболочку CLR, устанавливая счетчик ссылок соответствующей оболочки среды CLR равным 0. Далее вызываем garbage collector , т.е. сборщик мусора. Я думаю это все делать не обязательно , но т.к. по сути мы используем не управляемый код используя dll. У меня возникали различные ошибки связанные с тем, что где то, видимо не подчищалось. <br /> while( System.Runtime.InteropServices.Marshal.FinalReleaseComObject( app ) > 0 ); <br /><br /> app = null;<br /><br /> GC.Collect();<br /> GC.WaitForPendingFinalizers();<br /> GC.Collect(); <br /> }<br /><br /> }<br /><br />}<br /><br /><br /></code><br />Кстати в случае использования QTObjectModelLib.dll , вместо QTObjectModel.dll, можно также создавать объект Application следующим образом:<br /><br />Application app = new Application(); <br /><br />И это не смотря на то, что Application интерфейс. <br /><br /></p><br /></li><br /><br /></ol><br /><br /><p><br />Теперь совет, если вы при попытке запуска QTP через скрипт получаете ошибку "сервер rpc недоступен", то зайдите в Task Manager и прибейте процесс QTAutomation Agent. <br /> И попробуйте снова.<br /><br /></p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com1tag:blogger.com,1999:blog-2920908875174434821.post-65212157460224485992009-08-19T06:27:00.000-07:002010-01-20T22:44:21.202-08:00Example. QTP connection to Oracle by ADO DB provider.<h2>Доступ к базе данных из QTP на примере Oracle</h2><br /><p>Как известно при записи скрипта QTP предоставляет возможность создания checkpoint с привязкой данных к значениям из бд.</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvwpJuiiBpp5X53KXGX7ePZMQ95Dy0E596TWXzTMFlwF1LdNBTHTnATsg1za_3vZNI8rh12jW8gqLhjUixBnMmdu8jI5tydyOwXe-3BJ698hqHnuEk6FkYlmalQuGAQOGU3X1-ZlEukBLH/s1600-h/select+bd.png"><img style="cursor: pointer; width: 358px; height: 316px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvwpJuiiBpp5X53KXGX7ePZMQ95Dy0E596TWXzTMFlwF1LdNBTHTnATsg1za_3vZNI8rh12jW8gqLhjUixBnMmdu8jI5tydyOwXe-3BJ698hqHnuEk6FkYlmalQuGAQOGU3X1-ZlEukBLH/s400/select+bd.png" alt="" id="BLOGGER_PHOTO_ID_5371667930921594226" border="0" /></a><br /><br /><br /><p>И просто выводить значение из БД через Output Value.<br /><br />Но в силу того, что в проекте, в котором я сейчас участвую, я создаю тестовые скрипты основываясь не на записи, а на создании их в ExpertView через так называемое programmatic description (программируемое описание).<br />Данные возможности я не использую. Кстати в данном случае запись я не использую т.к. почему то при записи в IE начинаются глюки, не раскрываются менюшки (Написанные с использованием htc и css). При этом если отключить запись и перезайти в приложение, то все ок.<br /></p><br /><br /><p> Недавно мне понадобилась брать значения для запроса из таблицы БД Oracle.<br />Пошуршив документацию по VB я наткнулся на Microsoft ActiveX Data Objects (ADO). Вот сразу ссылочка на <a href="http://msdn.microsoft.com/en-us/library/ms678086%28VS.85%29.aspx">API</a> .<br /><br />Итак вот пример использования данного объекта для обращения к БД Oracle из QTP и получение значения из таблицы БД. </p><br /><br /><code class="prettyprint lang-vb"><br /><br /><br />ConnectionString="Password=pass;User ID=user;Data Source=sid2; Provider=OraOLEDB.Oracle;" ' задается строка соединения к Oracle<br /><br />' Строка запроса, который будет выполнен в БД<br />sSql = " select word from ole_search_index where field_name='Comment' "<br /><br /><br />Set oConn = CreateObject ("ADODB.Connection") ' Создаем объект<br /><br />' открываем соединение к БД с заданными в строке соединения параметрами<br />oConn.Open ConnectionString<br /><br />' Задаем объект ADODB.Recordset, который возвращает метод<br />set rs=oConn.Execute (sSql)<br /><br />'rs.fields(0).value fields свойство объекта Recordset возвращающает коллекцию<br />' объектов field, которые являются по сути столбцами таблицы<br /><br /><br />Do Until checkfield( rs.fields(0).value )' Исполнения цикла до тех пор пока не true<br />' также можно сделать условие привязанное к свойству EOF объекта Recordset<br />' свойство EOF возвращает булево значение. В кратце суть EOF это, что пройденны все<br />' записи полученные объектом recordset<br /><br /> rs.MoveNext() ' переход к следующей строчке таблицы<br />' по умолчанию чтение из таблицы БД начинается с первой строчки<br /><br />Loop<br /><br /><br /><br />oConn.Close ' закрытие соединения к БД<br /><br /></code>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-25014281612738759012009-07-31T03:23:00.000-07:002010-01-20T22:46:11.047-08:00Synchronization in qtp<h2>События ожидания в Quik Test Professional (QTP)</h2><br /><h3>В данном посте будут расмотренны вопросы</h3><br /><br /><ol><br /><li><span>События ожидания в QTP</span></li><br /><li><span>Использование свойства Object для обращения к DOM свойствам объекта в Quick Test professional скрипте </span></li><br /><li><span>Пример programmatic Description в QTP или по русски программируемое описание в QTP</span></li><br /><li><span>Пример поиска Dom свойств объекта для использования в контексте ожидания загрузки </span></li><br /><li><span>Примеры использования методов ожидания в QTP</span></li><br /></ol><br /><br /><p>Как-то возник вопрос о том как оценить статус загрузки страницы браузера в QTP и ее дочерних объектов. Между прочим синхронизация очень важный момент при разработки автотестов. В будущем посте я расскажу об основных на мой взгляд правилах создания автотестов и фреймворка для набора тестов.<br />Первым делом пришла мысль об использование метода <strong>Sync</strong> объекта Browser.<br />Суть данного метода в том, что бы тест ожидал пока браузер не осуществит навигацию.<br />Также можно воспользоваться методом <strong>WaitProperty</strong> . Вкратце суть данного метода ожидание до того момента, когда заданное свойство объекта сравняется заданному значению свойства.<br /> Еще можно использовать метод <strong>Exist</strong>. C данным методом все просто. Он возвращает true или false в зависимости от того существует ли заданный объект. И соответственно его удобно применять в if/else конструкциях. <br /></p><br /><br /><p>Далее очень полезное свойство объектов Object, правда, к сожалению применимое только в рамках использования браузера Internet Explorer. Через данное свойство можно обращаться к различным DOM свойствам и методов указанного объекта. Приведу пример в рамках данного поста:<br /><br />Есть веб приложение, в котором после полной загрузки документа border-color таблицы, в которой отображается документ, становится равным определенному цвету. Для начала я написал функцию, ожидающую полной загрузки документа на основании данного условия.<br /></p><br /><code class="prettyprint lang-vb"><br />Public browdes<br />Set browdes = Description.Create<br />Browdes(“micclass”).Value=”Browser”<br /><br />Function waitforload()<br /><br />Set strbC=Browser(browdes).Frame(“html id:=someframe”).WebTable(“html id:=sometable”).Object. borderColor<br /><br />Do Until strbC = “#00a86b”<br />Wait 1<br />Loop<br /><br />End function<br /></code><br /><br /><p><br />Но как я позже убедился в случае, если возникает ошибка БД и документ не отображается, а вместо него отображается стек трейс ошибки БД, то функция уходит в бесконечное ожидание. Т.к. в данном случае borderColor не изменяется. Также я пробовал экспериментировать со свойством Browser(browdes).Object. StatusText , но это свойство браузера менялось при каждой подгрузки картинки в документе. В итоге я решил использовать свойство фрейма в котором рисовалась таблица документа. А именно свойство readyState. И в итоге получил такую функцию.<br /></p><br /><br /><br /><code class="prettyprint lang-vb"><br />Public browdes<br />Set browdes = Description.Create<br />Browdes(“micclass”).Value=”Browser”<br /><br />Function waitforload()<br /><br />Set strrS=Browser(browdes).Frame(“html id:=someframe”).Object.readyState<br /><br />Do Until strrS = “complete”<br />Wait 1<br />Loop<br /><br />End function<br /><br /></code><br /><br /><p><br />В итоге получается следующий список советов для поиска нужного свойства<br /></p><br /><ol><li><strong>Прочитать про DOM свойства и методы интересуемого объекта или объектов.Например в <a href="http://msdn.microsoft.com/en-us/library/ms533050%28VS.85%29.aspx">MSDN</a></strong></li><br /><li><strong>Активно использовать Object Spy и смотреть не только Identification properties, но и Native.</strong></li><br /><li><strong>Определить список свойств, которые хочется использовать. И написать тестовую функцию, которая в цикле заданное количество раз обращается к данным свойствам объекта. И выводит их значения в лог например при помощи метода Print. </strong></li><br /><table style="width: 40%;"><thead><tr><td><strong>Метод</strong> </td><td><strong>Ссылка на пример</strong></td></tr></thead><tbody><tr><td>Sync</td><td><a href="http://testerway.blogspot.com/2009/07/sync-browser-exist.html">Sync in QTP</a></td></tr><tr><td>WaitProperty</td><td><a href="http://testerway.blogspot.com/2009/07/waitproperty-quick-test-proffesional.html">WaitProperty in QTP</a></td></tr><tr><td>Exist</td><td><a href="http://testerway.blogspot.com/2009/07/sync-browser-exist.html">Exist in QTP</a></td> </tr></tbody></table></ol>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-58604094725074073642009-07-31T03:05:00.000-07:002010-01-29T00:36:20.905-08:00Пример использования метода WaitProperty в Quick Test Proffesional (QTP)<p><br />В данном примере показано использование метода <strong>WaitProperty</strong> в QTP версии 10.0 <br />И обращение к свойствам объектов с использованием конструкции attribute/свойство<br /></p><br /><br /><code class="prettyprint lang-vb"><br /><br />Public browdes 'Объяснять не стоит в ранних версиях постов данная конструкция есть <br />Set browdes = Description.Create <br />Browdes(“micclass”).Value=”Browser”<br /><br />If Browser(browdes).Frame("html id:=someframe").WaitProperty("attribute/readyState", "complete", 4000) Then ' QTP ждет в течение 4 секунд пока свойство readyState объекта<br />' Frame станет равным complete. Если это произойдет до истечения 4 секунд, то <br />' переходит к клику по первой строке таблицы<br />Browser(browdes).Frame("html id:=someframe").Table("html id:=table").Object.rows(1).Click ' клик по первой строке таблицы<br /><br />End If<br /><br /></code><br /><br /><br /><p>Подробнее об передаваемых в параметр WaitProperty значениях можно посмотреть в документации к QTP</p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-63005191991340992942009-07-31T00:35:00.000-07:002010-01-20T22:47:03.708-08:00Sync method example in QTP script<h2>Пример использования метода Sync объекта Browser и метода Exist</h2><br /><p><br />В данном примере показано использование метода Exist и Sync в Quick Test Professional (QTP) версии 10.0<br /></p><br /><br /><code class="prettyprint lang-vb"><br />Public browdes ' глобальное описание <br /><br />Set browdes = Description.Create 'вызов метода создания описания <br /><br />Function startie() ' объявляем функцию<br /><br />SystemUtil.CloseProcessByName "IEXPLORE.EXE" ' закрываем все открытые окна браузера<br />' также при желании можно добавить SystemUtil.CloseProcessByName "FIREFOX.EXE"<br />' и другие браузеры <br />If Browser("micclass:=Browser").Exist (0) Then ' проверяем есть ли открытые браузеры<br />' параметр 0 в методе Exist это время в течение которого тест ищет данный объект. <br />' 0 значит возвращать true или false незамедлительно <br />Print "Есть открытые окна браузера" ' Пишем в лог <br /> ExitAction(1) 'Выходим из теста<br />Else Print "Отлично!!! все окна браузера успешно закрыты" ' Пишем в лог <br /> End if <br />SystemUtil.Run "iexplore.exe" ' запускаем браузер <br />Print "Открываем новое окно браузера" 'пишем в лог <br />End Function <br /><br />Function openmyblog()<br /><br />Browser(browdes).Navigate("http://testerway.blogspot.com")' осуществляем навигацию <br />Browser(browdes).Sync ' собственно метод Sync ожидающий окончания навигации<br /><br />MsgBox "all done" <br />' Вывод сообщения. В данный кусок кода тест перейдет лишь после окончания навигации<br /><br />End Function <br /><br />call startie ' вызовы функций<br />call openmyblog<br /><br /></code><br /><br /><p><br />Замедлить скорость работы интернета можно при помощи различных программ, которые уменьшают пропускную способность канала или использовать "тормозную" проксю :)<br /></p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-39781741915868216362009-07-24T03:53:00.000-07:002009-07-24T04:09:41.526-07:00Немного юмора. Be libirated.<p>Анекдот:<br /><span style="font-style: italic;">"На рынке по торговле рабами: Мне два белых и половинку черного!!!!"</span><br /></p><br /><br /><br /><p>Давным, давно ...........в далекой галактике, но я не об этом :). Когда-то работая с rational robot я обратил внимание на одну из картинок, которая появляется в процессе загрузки.</p><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3fGvtzMMBcl2yq91aJjfxhgriGkqpAIoiy7FZFhISLzjH3qTtK3n4X436KN9XRB-NJWdg4G_hEhdzs-aoWo0TF3N2rUN0AjDiTGJgV0y358FIGdUgWd7EcaE63-hkDgRe3p7CE_anxHOf/s1600-h/rational.PNG"><img style="cursor: pointer; width: 339px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3fGvtzMMBcl2yq91aJjfxhgriGkqpAIoiy7FZFhISLzjH3qTtK3n4X436KN9XRB-NJWdg4G_hEhdzs-aoWo0TF3N2rUN0AjDiTGJgV0y358FIGdUgWd7EcaE63-hkDgRe3p7CE_anxHOf/s400/rational.PNG" alt="" id="BLOGGER_PHOTO_ID_5361978906587074258" border="0" /></a><br /><br /><p>На данной картинке изображен белый мужчина сидящий за компьютером и темнокожий мужчина стоящий рядом с ним. А на фоне окно похожее на решетку.А сверху надпись <span style="font-style: italic;">"be libirated" - "будь свободен"</span>. И мне вот интересно закладывали ли авторы данной картинки скрытый смысл в духе "с rational robot ты свободен"," национальная дружба", "у нас нет расизма".</p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-77194052604388093122009-07-23T23:12:00.000-07:002012-11-16T23:01:59.408-08:00Юнит тестирование в C# на примере Visual Studio 2008. Unit test in C#.<div dir="ltr" style="text-align: left;" trbidi="on">
Как видно из заголовка в данном посте я не буду рассказывать, что такое юнит тестирование и какие подходу к нему могут быть. Вопросы, которые я отражу в других постах будут включать в себя:<br />
<ol><br />
<li>Что такое модульное (unit) тестирование и почему его называют тестирование белого или стеклянного ящика?</li>
<br />
<li>Можно ли покрыть программу тестами на 100%?</li>
<br />
<li>Как оценивают тестовое покрытие? и его достаточность</li>
<li> </li>
<li>Использование <a href="http://testerway.blogspot.ru/2012/11/c-unit-test-in-c-mock.html">mock объектов </a>в unit тестирование</li>
</ol>
<br />
И другие вопросы.<br />
<br />
<br />
И так начнем. Предыстория вопроса следующая, недавно мне поступило задание написать модульный тест для тестирования изменений конфигурации поискового сервера. Писать модульные тест предстояло на незнакомом мне языке c#. Естественно обращение к поисковому серверу шло через сервис в котором вызывался определенный метод для обращения к серверу. Соответственно в итоге модульный тест создавался для сервиса. В качестве среды разработки модульного теста использовалась Visual Studio 2008. В данном примере я приведу простой пример создания модульного теста в среде VS.<br />
<br />
<br />
И так, запускаем студию и открываем окно<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEishrWuP5k0pETjhBWSXzIQIXYFSxVJn4icQxAsV3XuaFWP7vj3ng-y4eYhozuSRfqLGKhn6ABH3rftIAQ8P99z3j6aQ2VEEeM39tUXc03_eZ8Lb3ury1E_boBe3ZX-lTaGZFjtfMeS3b6A/s1600-h/new+Profect.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="Окно создания нового проекта в visual studio" border="0" id="BLOGGER_PHOTO_ID_5361917842890451266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEishrWuP5k0pETjhBWSXzIQIXYFSxVJn4icQxAsV3XuaFWP7vj3ng-y4eYhozuSRfqLGKhn6ABH3rftIAQ8P99z3j6aQ2VEEeM39tUXc03_eZ8Lb3ury1E_boBe3ZX-lTaGZFjtfMeS3b6A/s400/new+Profect.png" style="cursor: pointer; height: 300px; width: 400px;" /></a><br />
<br />
В котором выбираем C# class library.<br />
<br />
Далее пишем исходный код программы.<br />
<br />
<br />
<br />
<code class="prettyprint lang-cs"><br /><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using System.Net;<br /><br />namespace Example<br />{<br />public class Dosomething //Объявляем класс<br />{<br /><br /><br />public string checksrvstatus(string url)<br />// метод класса возвращающий строку и принимающий на вход строку<br />{<br /> if (url == "http://testerway.blogspot.com")<br /> {<br />// В блоке создается запрос к странице веб сервера и далее обрабатывается ответ<br /> HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);<br /> HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();<br /> string statusdes = myHttpWebResponse.StatusDescription;<br /> string server = myHttpWebResponse.Server;<br /> return ("server: " + server + " status: " + statusdes);<br /><br /> }<br /> else<br /> {<br /><br /> return "";<br /><br /> }<br /><br />}<br />public void callchecksrv(int k)<br />//еще одна функция не возвращающая значение и принимающая на вход число.<br />{<br />if (k > 0)<br />{<br /> checksrvstatus("http://microsoft.com");<br /><br />}<br /><br /> </code><br />
<code class="prettyprint lang-cs">Далее создаем UnitTest. Нажимаем правую кнопку мыши.</code><br />
<code class="prettyprint lang-cs"><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitCM20hcURNKzPSesLCuKw8tW43-8xfRX9eV1-Vyv7fbTNqI7hxUHry7aCLZOSZF8GeQgBq3yKsA3GxnMP2ey5HOLowlQuibuDYpz7c27zNOmg4P7CRI6ww-puvhg5ImlopSsMS8KXejqO/s1600-h/unit.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="контекстное меню создания юнит теста" border="0" id="BLOGGER_PHOTO_ID_5361922539791663906" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitCM20hcURNKzPSesLCuKw8tW43-8xfRX9eV1-Vyv7fbTNqI7hxUHry7aCLZOSZF8GeQgBq3yKsA3GxnMP2ey5HOLowlQuibuDYpz7c27zNOmg4P7CRI6ww-puvhg5ImlopSsMS8KXejqO/s400/unit.png" style="cursor: pointer; height: 191px; width: 400px;" /></a><br /><br />Появляется диалог<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2j4qCaSDWwJVkdBLUqGpW6gF2TQf08wb4stQe7ZbAIHmOdWMWX6uoRPTxn_bKPEVGrtEr6UaJC-SdnweKIVqXeOky634vmTqMFJ5EH2qDFHVmo7CKDSUMJor5-5fegBZqxCMUwLzFc4r2/s1600-h/unit1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="диалог выбора тестируемого класса, метода" border="0" id="BLOGGER_PHOTO_ID_5361922861374442066" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2j4qCaSDWwJVkdBLUqGpW6gF2TQf08wb4stQe7ZbAIHmOdWMWX6uoRPTxn_bKPEVGrtEr6UaJC-SdnweKIVqXeOky634vmTqMFJ5EH2qDFHVmo7CKDSUMJor5-5fegBZqxCMUwLzFc4r2/s400/unit1.png" style="cursor: pointer; height: 299px; width: 400px;" /></a><br /><br />В котором выбирается на какой класс, метод создавать юнит тест. Отображаются все классы и методы в рамках проекта. Необходимо выбрать метод checkservstatus. Затем в появившемся окне задаем имя тестового проекта. И в результате формируется следующий код<br />
<br /><br /><code class="prettyprint lang-cs"><br />using Example;<br />using Microsoft.VisualStudio.TestTools.UnitTesting;<br />namespace TextExample<br />{<br /><br /><br />/// </code></code><br />
<br />
<summary><code class="prettyprint lang-cs"><code class="prettyprint lang-cs"><br />///This is a test class for DosomethingTest and is intended<br />///to contain all DosomethingTest Unit Tests<br />///</code></code></summary><code class="prettyprint lang-cs"><code class="prettyprint lang-cs"><br />[TestClass()]<br />public class DosomethingTest<br />{<br /><br /><br />private TestContext testContextInstance;<br /><br />/// <summary><br />///Gets or sets the test context which provides<br />///information about and functionality for the current test run.<br />///</summary><br />public TestContext TestContext<br />{<br /> get<br /> {<br /> return testContextInstance;<br /> }<br /> set<br /> {<br /> testContextInstance = value;<br /> }<br />}<br /><br />#region Additional test attributes<br />//<br />//You can use the following additional attributes as you write your tests:<br />//<br />//Use ClassInitialize to run code before running the first test in the class<br />//[ClassInitialize()]<br />//public static void MyClassInitialize(TestContext testContext)<br />//{<br />//}<br />//<br />//Use ClassCleanup to run code after all tests in a class have run<br />//[ClassCleanup()]<br />//public static void MyClassCleanup()<br />//{<br />//}<br />//<br />//Use TestInitialize to run code before running each test<br />//[TestInitialize()]<br />//public void MyTestInitialize()<br />//{<br />//}<br />//<br />//Use TestCleanup to run code after each test has run<br />//[TestCleanup()]<br />//public void MyTestCleanup()<br />//{<br />//}<br />//<br />#endregion<br /><br /><br />/// <summary><br />///A test for checksrvstatus<br />///</summary><br />[TestMethod()]<br />public void checksrvstatusTest()<br />{<br /> Dosomething target = new Dosomething(); // TODO: Initialize to an appropriate value<br /> string url = string.Empty; // TODO: Initialize to an appropriate value<br /> string expected = string.Empty; // TODO: Initialize to an appropriate value<br /> string actual;<br /> actual = target.checksrvstatus(url);<br /> Assert.AreEqual(expected, actual);<br /> Assert.Inconclusive("Verify the correctness of this test method.");<br />}<br />}<br />}</code><br />Как видно из кода создается тестовый класс в котором создается тестовый метод. В тестовом методе создается экземпляр тестируемого класса. И для тестируемого метода уже подготовлены входные параметры. Плюс сформирован асерт на ожидаемый результат и корректность тестового метода. Необходимо немного изменить тестовый класс.<br />Добавить строчку<br />
<br /><br /><code class="prettyprint lang-cs"><br />using System.Diagnostics; // для вывода текста в debug trace<br /><br />[TestMethod()]<br /> public void checksrvstatusTest()<br /> {<br /> Dosomething target = new Dosomething(); // TODO: Initialize to an appropriate value<br /> string url = "http://testerway.blogspot.com"; // TODO: Initialize to an appropriate value<br /> Debug.WriteLine("url: " +url);<br /> string expected = "server: GFE/2.0 status: OK"; // TODO: Initialize to an appropriate value<br /> Debug.WriteLine("expected result: " + expected);<br /> string actual;<br /> actual = target.checksrvstatus(url);<br /> Debug.WriteLine("result: " + actual);<br /> Assert.AreEqual(expected, actual);<br /><br /><br /> }
</code>
</code>
<br />
Далее прогоняем тест. И смотрим окно результата прогона теста.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj23ynd9KFHwuElvCI-iZ0ZmB2p70MOILSyvSr444mnnZiRKGUnIDRAYjU9jXPKNe7OR9ZOpc1K-l4M24brI1HiwOYI1TfuZkEELVxWVcSRpe1ZQZxSSMlRXUgdrV8IC7_t-H5ewq-Frttv/s1600-h/testresult.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="отчет по результату выполнения модульного теста" border="0" id="BLOGGER_PHOTO_ID_5361927839153474514" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj23ynd9KFHwuElvCI-iZ0ZmB2p70MOILSyvSr444mnnZiRKGUnIDRAYjU9jXPKNe7OR9ZOpc1K-l4M24brI1HiwOYI1TfuZkEELVxWVcSRpe1ZQZxSSMlRXUgdrV8IC7_t-H5ewq-Frttv/s400/testresult.png" style="cursor: pointer; height: 266px; width: 400px;" /></a><br />
<br />
<br />
И так, что же еще полезное есть в студии. Включаем поддержку codecoverage (оценка покрытия тестируемого кода тестом). Выбираем тестируемую тестом библиотеку. В данном случае example.dll.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCdBrgk0Kpo601tDCXWvlvmWohyphenhyphenpST1jm0FjNcGuhmwnkkUTmBRbdu6Y1s6qXQ-7gAfHTFtd3Xww55EQSQwLIUpE5XjfaSHwoHcWQdlcuFtUXdQkFnm1obEB_zyy9uQaATtZ5u6bdOMD3Z/s1600-h/setcodecover.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="включение определения покрытия кода модульным тестом" border="0" id="BLOGGER_PHOTO_ID_5361928805679230290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCdBrgk0Kpo601tDCXWvlvmWohyphenhyphenpST1jm0FjNcGuhmwnkkUTmBRbdu6Y1s6qXQ-7gAfHTFtd3Xww55EQSQwLIUpE5XjfaSHwoHcWQdlcuFtUXdQkFnm1obEB_zyy9uQaATtZ5u6bdOMD3Z/s400/setcodecover.png" style="cursor: pointer; height: 189px; width: 400px;" /></a><br />
<br />
<br />
И теперь после прогона теста можно посмотреть следующие<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiie1bRhYChhhfIQK_oQDkzvB8cVqYaOBY-8nF7c4TXOvLfASslEud225oyeuIaeUaJ4yTeMXatTRnHkExKIHDu1lZaMDEfVq8SzWF8kYIwj1r75Zg60DY1Nxy4mmO_R1DV7XwnW_eZLJkl/s1600-h/codecovercall.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="покрытие кода тестом" border="0" id="BLOGGER_PHOTO_ID_5361930075816369346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiie1bRhYChhhfIQK_oQDkzvB8cVqYaOBY-8nF7c4TXOvLfASslEud225oyeuIaeUaJ4yTeMXatTRnHkExKIHDu1lZaMDEfVq8SzWF8kYIwj1r75Zg60DY1Nxy4mmO_R1DV7XwnW_eZLJkl/s400/codecovercall.png" style="cursor: pointer; height: 297px; width: 400px;" /></a><br />
<br />
Далее наблюдаем результат покрытия кода тестом. Также покрытие кода можно посмотреть в самом коде.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Peo3ae1G8IK6x31CgzFDIdByqjNqvvSP9nfzeCcqHrwN1i7pVJ4LhutBCXNJJtwEqC7tTcrBR3_1jgxQeXNv1fiumyqRt18x_-jd4LoxlMRMlGxf35qYskmxCleOObCaGcpSodaT1Ack/s1600-h/gotosource.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="выбор отображения покрытия кода тестом в самом коде" border="0" id="BLOGGER_PHOTO_ID_5361939136859584434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Peo3ae1G8IK6x31CgzFDIdByqjNqvvSP9nfzeCcqHrwN1i7pVJ4LhutBCXNJJtwEqC7tTcrBR3_1jgxQeXNv1fiumyqRt18x_-jd4LoxlMRMlGxf35qYskmxCleOObCaGcpSodaT1Ack/s400/gotosource.png" style="cursor: pointer; height: 105px; width: 400px;" /></a><br />
<br />
<img alt="" src="file:///C:/DOCUME%7E1/pers/LOCALS%7E1/Temp/moz-screenshot-1.jpg" /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYvHyW2PPHlUFuVp5wZllxkiWkHxRbdbxdVS_WrpNxCAQscLRpJ2c-7efU3O_XUPFOrWsc0XWDEywtszpw7REjPWwvI_-EoKafoxri5bXTNgnGW-bWk_xSDWYBF4ejB-7wN2Kf9wzKkSUN/s1600-h/codecover.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="отображение покрытия кода тестом в самом коде" border="0" id="BLOGGER_PHOTO_ID_5361939884768573186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYvHyW2PPHlUFuVp5wZllxkiWkHxRbdbxdVS_WrpNxCAQscLRpJ2c-7efU3O_XUPFOrWsc0XWDEywtszpw7REjPWwvI_-EoKafoxri5bXTNgnGW-bWk_xSDWYBF4ejB-7wN2Kf9wzKkSUN/s400/codecover.png" style="cursor: pointer; height: 267px; width: 400px;" /></a><br />
<br />
<br />
Очевидно, что красным выделен не покрытый тестом код. Также в Studio есть возможность управления набором тестов и другие полезные средства. Итог подводить не буду, так как думаю, что еще изучил не все возможности, которые предоставляет VS 2008 для модульного тестирования.<br />
<a href="http://testerway.blogspot.ru/2012/11/c-unit-test-in-c-mock.html">Использование mock объектов в модульном тестировании на C#</a></div>
Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com3tag:blogger.com,1999:blog-2920908875174434821.post-1529708509974941052009-07-20T03:44:00.000-07:002010-01-20T22:47:27.737-08:00Example of QTP script function<h2>Пример функции в Quick Test Professional(QTP). Кликанье или чтение по всем элементам таблицы</h2><br /><p style="border-style: double; border-color: green;"><br />В данном примере используется так называемое "программное описание" или "Programmatic Descriptions" и еще иногда называют descriptive programming. Также в примере используется свойство всех веб объектов QTP Object. Данное свойство позволяет обращаться к DOM свойствам и методам web объектов. Но к сожалению в help к QTP написано, что данное свойство работает, только для IE (InternetExplorer).<br /></p><br /><br /><code class="prettyprint lang-vb"><br />'Данный пример будет работать только в IE. Т.к. свойство Object , которое тут используется поддерживается только для ie.<br /><br />Set browdes=Description.Create 'Создается объект описание<br /><br />browdes("micclass").Value="Browser" 'для описания micclass значение Browser<br /><br />Function rcTable(obj, strmode, col, row) ' Функция с 4 параметрами на вход, obj - объект(таблица), strmode - строковое значение c(click) или r(read)<br /><br /> Dim intRowcount ' переменная для хранения числа строк в таблице<br /><br />intRowcount= obj.RowCount ' подсчет числа строк в таблице<br /><br />If intRowcount >0 Then ' Проверка на то, что число строк в таблице больше 0<br /><br />For i=row To intRowcount ' Цикл от переданного в функцию параметра row до числа строк в таблице<br /><br />If strmode="c" Then ' Ветвление для строкового параметра c(click)<br /><br />obj.Object.rows(i).cells(col).Click 'клик на соответсвующий элемент таблицы. С использованием свойства Object .<br /><br />elseif mode="r" Then ' Ветвление для строкового параметра r(read)<br /><br />Print obj.GetCellData(i,col) ' Печать текста соответсвующего элемента таблицы в лог.<br /><br />End If ' Конец ветвления для строкового параметра<br /><br />Next ' Переход к следующему значению в цикле, если оно еще не достигло максимального<br /><br />Else ' Ветвление , если intRowcount >0 = False<br /><br />MsgBox "Пустая таблица, повторите операцию на другой таблице" ' Вывод окна с сообщением<br /><br />End If ' Конец ветвления проверки числа строк intRowcount >0<br /><br /><br />End Function ' Окончание функции<br /><br />Set objTable=Browser(browdes).Frame("html id:=_frmQueryList").WebTable("html id:=Hitlist1__searchQueriesList__searchQueriesDataGrid") ' Пример инициализации объекта для использования в функции<br /><br />rcTable objTable,"c",3,1' Пример использования функции<br /></code>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0tag:blogger.com,1999:blog-2920908875174434821.post-87095616121576363382009-07-16T22:50:00.000-07:002010-01-29T00:30:21.067-08:00Дебаг теста в QTP и pdm.dll в этом процессе. И коротко о патче QTP_00591.EXE<p>Это мое первое сообщение в данном блоге. Далее в своем блоге я буду публиковать различные интересные проблемы с которыми сталкивался в процессе работы и какие то свои мысли по поводу карьеры в IT в целом и тестирования ПО в частности.</p><br /><p>В данный момент в качестве инструмента автоматизированного тестирования Web приложений я использую QTP 10.0,а в качестве браузера на котором идет веб тестирование это IE и вот однажды я столкнулся со следующей проблемой. После переноса QTP с одной машины на другую в дебаг (debug) режиме перестали отображаться текущие значения переменных. Просмотреть значение переменной можно было только через "Add watch", но при этом через него нельзя было обращаться к объектам после попытки добавления в список отображалась пустая строка как на рисунке ниже за исключением того, что была заполнена строчка Context. Итог: в QTP 10.0 в дебаг режиме перестали отображаться значения для переменных и для объектов.</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig021lvD0ZsK7obA8W3ly_YBnsMfxgdSgT918aVCUd4vzzVngLKaFXuO93jfcvyrn_Xun5d5p-6SN5Z0GglLjTABgpPPKV7V5P4lwwUxLk5Xs4-QlBVVsNJiltsm_oG3Z8U7bXGDUAsKk4/s1600-h/debug.png"><img style="cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig021lvD0ZsK7obA8W3ly_YBnsMfxgdSgT918aVCUd4vzzVngLKaFXuO93jfcvyrn_Xun5d5p-6SN5Z0GglLjTABgpPPKV7V5P4lwwUxLk5Xs4-QlBVVsNJiltsm_oG3Z8U7bXGDUAsKk4/s400/debug.png" alt="пустое окно дебага в QTP" id="BLOGGER_PHOTO_ID_5359365715595656802" border="0" /></a><br /><p>Первым делом я полез в google и на одном из буржуйских форумов увидел тему с данной проблемой. Выяснилось, что данная проблема лечится патчем QTP_00591. Вот вырезка из описания патча:<br />This patch fixes a problem in which objects sometimes disappeared from the Watch and Variables lists in the QuickTest Debug Viewer.<br />This problem was observed when Process Debug Manager 9.xx.xxxx was installed. It may also occur for later versions.</p><p>Как видно из описания проблема связана с более новой версией библиотеки pdm.dll. После установки патча проблема исчезла и я очень удивился, когда увидел</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCgJcDqxUKfcPKaLojmp7qNukPnIhOsEWWW9LjZGAkOzOgKY9iDOmP2ZwdxCcbo4H3KiIL2pTCOjJC1je0WCK2VHXDVMLcdo-tYed_u7sCT0nWYhPs6Xq5nnrTfvDTPIwpBmhl6EkpExNd/s1600-h/debug(new).PNG"><img style="cursor: pointer; width: 400px; height: 263px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCgJcDqxUKfcPKaLojmp7qNukPnIhOsEWWW9LjZGAkOzOgKY9iDOmP2ZwdxCcbo4H3KiIL2pTCOjJC1je0WCK2VHXDVMLcdo-tYed_u7sCT0nWYhPs6Xq5nnrTfvDTPIwpBmhl6EkpExNd/s400/debug(new).PNG" alt="окно дебага после update pdm.dll" id="BLOGGER_PHOTO_ID_5359368296013235842" border="0" /></a><br /><p>На другой машине окно дебага для аналогичного объекта выглядела вот так</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOHiVG3SW40X5xtWuxyhLYclj16re3nnqtpk0YsiL-x-yo7EwEhl9hvl4v7oN7frOrsxGbfacmHZzrcuvZxzSH0zjMaOB1cyPZA9XDHl8TvKEBOR7rlE6l-385uUePpc2lPsP9p4_KVngr/s1600-h/debug(virt).PNG"><img style="cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOHiVG3SW40X5xtWuxyhLYclj16re3nnqtpk0YsiL-x-yo7EwEhl9hvl4v7oN7frOrsxGbfacmHZzrcuvZxzSH0zjMaOB1cyPZA9XDHl8TvKEBOR7rlE6l-385uUePpc2lPsP9p4_KVngr/s400/debug(virt).PNG" alt="" id="BLOGGER_PHOTO_ID_5359368931250134194" border="0" /></a><br /><p>Выяснилось, что на старом месте для QTP стоит вот такая библиотека pdm.dll, которая судя по всему инсталлируется вместе с QTP.</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvGLsDvTC0JOzp8gRhkbssUJnrprw4r5SIepeKTK6-orqhyphenhyphendl_59VOWrGQaN2HrU27doELSIbq6BfnufAb6cGo8h4Ia7ZKKVF0g2nl6UenyI-hNwKFwlBl_rcW3bi2egyFkOTnM6Y-Ouqd/s1600-h/pdmdll(virt).PNG"><img style="cursor: pointer; width: 400px; height: 306px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvGLsDvTC0JOzp8gRhkbssUJnrprw4r5SIepeKTK6-orqhyphenhyphendl_59VOWrGQaN2HrU27doELSIbq6BfnufAb6cGo8h4Ia7ZKKVF0g2nl6UenyI-hNwKFwlBl_rcW3bi2egyFkOTnM6Y-Ouqd/s400/pdmdll(virt).PNG" alt="окно дебага со старой версией pdm.dll" id="BLOGGER_PHOTO_ID_5359369977082868130" border="0" /></a><br /><p>А на новом месте для QTP была следующая библиотека pdm.dll, которая установилась вместе с Visual Studio.</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic5rGQLqq2ZMOWbJGKUGLGx7mbzE7bpKIkUWsVDNOtIyMxezTFmnPdzFjiGjgkZPHtb4nZflBS6_PdCT33rJv4k1brdOCWdqO4ATO6lCAYdcoNm2n6dc_PCnDeAmOs4q_cNz5L4nXVEMrS/s1600-h/pdmdll(new).PNG"><img style="cursor: pointer; width: 400px; height: 302px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic5rGQLqq2ZMOWbJGKUGLGx7mbzE7bpKIkUWsVDNOtIyMxezTFmnPdzFjiGjgkZPHtb4nZflBS6_PdCT33rJv4k1brdOCWdqO4ATO6lCAYdcoNm2n6dc_PCnDeAmOs4q_cNz5L4nXVEMrS/s400/pdmdll(new).PNG" alt="новая версия pdm.dll" id="BLOGGER_PHOTO_ID_5359370387947412386" border="0" /></a><br /><p>Отсюда вывод, что если хочется как говорится видеть больше и дальше, то надо заменить старую библиотеку на новую или произвести update данной библиотеки ,а затем установить патч. Что бы удалить старую библиотеку и поставить новую, можно воспользоваться командой regsvr32, которая удаляет и устанавливает dll библиотеки. Посмотреть справку к данной команде можно в справке Windows или вызвав cmd консоль и набрав regsvr32 без параметров. Новая библиотека установится сама в случае установки VS, но также ее можно взять из IE 8, в который она входит как я предполагаю с целью отладки javascript в браузере посредством IE Devtoolbar, который включен в ie8.<br />P.S. Кстати интересно, что использует firefox для отладки javascript в firebug.<br /></p>Персhttp://www.blogger.com/profile/10705379268542375440noreply@blogger.com0