<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2920908875174434821</id><updated>2024-09-04T17:24:16.570-07:00</updated><category term="QTP"/><category term="QTP Example"/><category term="пример функции в QTP"/><category term="Object  QTP"/><category term="UnitTests"/><category term="UnitTests in C#"/><category term="Юнит тест в C#"/><category term="Debug in QTP"/><category term="Exist"/><category term="Exist Sync method in QTP"/><category term="Object QTP"/><category term="Problems with debug in QTP"/><category term="QTP Oracle"/><category term="QTP automation"/><category term="Send mail using vb"/><category term="System.Net.Mail"/><category term="Update pdm.dll"/><category term="Visual Basic 2008"/><category term="Анекдот"/><category term="Дебаг в QTP"/><category term="Написание юнит тестов в Visual Studio 2008"/><category term="Проблемы с дебаггером в QTP"/><category term="Юмор"/><category term="Юнит тест"/><title type='text'>Тестирование ПО и карьера в IT</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://testerway.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2920908875174434821/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://testerway.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Перс</name><uri>http://www.blogger.com/profile/10705379268542375440</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2920908875174434821.post-2688163609383332019</id><published>2012-11-12T05:19:00.000-08:00</published><updated>2012-11-12T05:26:29.944-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UnitTests"/><category scheme="http://www.blogger.com/atom/ns#" term="UnitTests in C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Юнит тест в C#"/><title type='text'>Юнит тестирование в C#. Unit test in C#. Использование mock объектов. </title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Начнем с основ. &lt;a href=&quot;http://ru.wikipedia.org/wiki/Mock-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82&quot;&gt;Википедия &lt;/a&gt;нам с радостью скажет, что mock-объект это объект-имитация или объект-пародия. Данные &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;объекты нужны для упрощения написания модульных тестов зависимых от смежных проектов. Например у нас есть большой проект, в рамках которого работает несколько команд над своими проектами. Архитекторы с аналитиками проработали и согласовали интерфейсы. Но сложность и скорость разработки у каждой команды своя. А у нас есть зависимый от другой команды код, в котором планируется получать значение из сервиса разрабатываемого другой командой. &lt;/span&gt;В том числе и при написании тестов. В данном случае нам на помощь и приходят различные mock фреймворки.&lt;/div&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;Небольшое отступление. В Visual studio 2012 в тестовом фреймворке есть namespace System.Fakes. Который предоставляет встроенные заглушки.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
Мой выбор пал на &lt;a href=&quot;http://code.google.com/p/moq/&quot;&gt;Moq&lt;/a&gt;. Т.к. его хвалили на stackoverflow :).&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;post-title entry-title&quot; style=&quot;text-align: left;&quot;&gt;
И так предположим у нас есть интерфейс&lt;/div&gt;
&lt;code class=&quot;prettyprint lang-cs&quot;&gt;
public class Contracts
    {
      public interface IUrlManager
        {
            UrlList GetByUserGuid(Guid id);

        }

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