<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fboiton&#039;s blog &#187; TDD</title>
	<atom:link href="http://www.fboiton.com/tag/tdd/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fboiton.com</link>
	<description>Blog Técnico y personal: Ideas, Guias, Tutoriales, Comentarios, Pensamientos, Entre otros.</description>
	<lastBuildDate>Sun, 05 Feb 2012 22:01:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SpecFlow, xUnit, WatiN mis primera experiencia con  TDD y BDD</title>
		<link>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes</link>
		<comments>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes#comments</comments>
		<pubDate>Fri, 28 May 2010 02:56:56 +0000</pubDate>
		<dc:creator>fboiton</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[SpecFlow]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Watin]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://www.fboiton.com/?p=27</guid>
		<description><![CDATA[Hace un par de semanas comenc&#233; a interactuar con TDD y BDD mas all&#225; del aprendizaje con base en lecturas&#8230; y bueno&#8230; d&#233;jenme contarles que no puedo decir nada mas que TDD y BDD Rules! La configuración es bien sencilla, &#8230; <a href="http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace un par de semanas comenc&eacute; a interactuar con TDD y BDD mas all&aacute; del aprendizaje con base en lecturas&#8230; y bueno&#8230; d&eacute;jenme contarles que no puedo decir nada mas que TDD y BDD Rules!</p>
<p>La configuración es bien sencilla, encontré más información utilizando nUnit y por ello que nace este post  (ya era hora no? <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) para ejemplificar utilizando xUnit</p>
<p>Primero comenzamos con las descargas e instalación de:</p>
<ol>
<li><a href="http://www.specflow.org/">specFlow</a> </li>
<li><a href="http://watin.sourceforge.net/">watiN</a> </li>
<li><a href="http://xunit.codeplex.com/">xUnit</a> </li>
</ol>
<p>Adicionalmente a esto, deberán tener configurado el ejecutor de test units ya sea con <a href="http://xunit.codeplex.com/wikipage?title=HowToUseTdNet&amp;referringTitle=Home">TestDriven.Net</a> o con <a href="http://xunit.codeplex.com/wikipage?title=HowToUseResharper&amp;referringTitle=Home">Resharper</a> en Visual Studio. </p>
<p>Ya que descargamos todo esto procedemos a crear un nuevo proyecto y a agregarle las referencias a las 3 librerias descargadas.</p>
<p>Ojo! Por default SpecFlow genera el código para ser utilizado por nUnit y pues resulta que queremos trabajar con xUnit… Casaca! (chapinismo para decir que algo es “simple, facil,…”) <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  debemos agregar un Application Configuration File a nuestro proyecto con lo siguiente:</p>
<div><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;        <br />&lt;configuration&gt;         <br />&lt;configSections&gt;         <br />&lt;section name=&quot;specFlow&quot; type=&quot;TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow&quot;/&gt;         <br />&lt;/configSections&gt;         <br />&lt;!-- the following configuration represent the defaults -–&gt;         <br />&lt;specFlow&gt;         <br />&lt;language feature=&quot;en&quot; /&gt;         <br />&lt;unitTestProvider name=&quot;XUnit&quot; /&gt;         <br />&lt;runtime detectAmbiguousMatches=&quot;true&quot; stopAtFirstError=&quot;false&quot; missingOrPendingStepsOutcome=&quot;Inconclusive&quot; /&gt;         <br />&lt;trace traceSuccessfulSteps=&quot;true&quot; traceTimings=&quot;false&quot; minTracedDuration=&quot;0:0:0.1&quot; /&gt;         <br />&lt;/specFlow&gt;         <br />&lt;/configuration&gt;</code></div>
<p>( mjm… creo que debo cambiar el theme de mi blog, les dejo el formato a ustedes por el momento )</p>
<p>Bueno, a este punto ya estamos listos para comenzar con nuestro primer test, para el cual tomaremos esta Feature:</p>
<p> <code>Feature: googling    <br />In order to use watin     <br />As entusiast     <br />I want to be able to get a page and validate text     </p>
<p>Scenario: google to search about frogs     <br />Given I have written URL in browser http://www.google.com     <br />When I see google home page with title Google     <br />Then I check if Advanced Search link appear     <br /></code>
<p>Cabe mencionar que SpecFlow utiliza como sintaxis Gherkin cuya documentación pueden encontrarla en <a href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin">http://wiki.github.com/aslakhellesoy/cucumber/gherkin</a>&#160;</p>
<p>Para utilizar esta feature debemos agregar un SpecFlowFeature File, el cual aparece entre los templates de visual studio si instalamos todo como nos indicaron los links que compartí al inicio.</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="330" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb.png" width="547" border="0" /></a></p>
<p>una vez creada nuestra feature</p>
<p>&#160;</p>
<p>ejecutamos la test unit, sabiendo que va a ser fallida y observamos el mensaje de salida:</p>
<p>&#160;</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_3.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="407" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb_3.png" width="694" border="0" /></a> </p>
<p>cool! tenemos el código base para iniciar, entonces agregamos una nueva clase a nuestro proyecto con el código que SpecFlow nos mostró en el mensaje de error. A este punto comenzamos a interactuar con Watin.</p>
<p>No debemos olvidar la respectiva referencia a la libreria en los “using” de nuestra clase:</p>
<p>using WatinN.Core;</p>
<p>la forma de interacción con WatiN es bastante extensa, yo me enfocaré en lo que nuestra feature quiere probar, que el texto “Advanced Search” aparezca al obtener el URL. Si desean adentrarse mas en el ejemplo pueden ir directamente al sitio de <a href="http://watin.sourceforge.net/gettingstarted.html">WatiN</a></p>
<p>Por cada una de las sentencias de nuestro “Scenario” tendremos un método lo cual nos permite dividir las acciones o validaciones segun cada una de las sentencias. Para esta prueba dejemos la instancia del browser al momento del “Given” de nuestro “Scenario”, sin embargo tambien existen las opciones de tenerlo en un constructor, trabajar un metodo setup, entre otras. Nuestro código se puede ver algo así:</p>
<p><a href="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_4.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="448" alt="image" src="http://www.fboiton.com/images/xUnitSpecFlowyJavascript_7489/image_thumb_4.png" width="704" border="0" /></a> </p>
<p>en el primer método se instancia el Watin para que utilice Internet Explorer y definimos la URL que se obtendrá, esto corresponde a nuestro “Given”.</p>
<p>Luego viene el “When” donde le inddicamos al Browser que obtenga la dirección que necesitamos evaluar.</p>
<p>Finalmente llegamos a la sentencia “Then” donde indicamos al browser que espere al texto que estamos buscando (esta en ingles y en español por la deteccion de idioma que tiene google) y adicionalmente se hace el “Assert” para verificar que se encuentre en el HTML. Esta validación, es muy relacionada a lo que queremos probar.</p>
<p>En este caso utilizo un “WaitUntilContainsText” porque la página de google pareciera mostrar con javascript estos textos, o al menos darles algun efecto, así que le digo a Watir que espere hasta que dicho texto se encuentre en el DOM. Lo cual nos indica que no importando si la página tiene javascript y a su vez este genera más elementos en el Dom, podemos realizar validaciones sobre el mismo. </p>
<p>No olvidemos cerrar el navegador al finalizar la ejecución desde código para evitar llenarnos de browsers con las ejecuciones de las pruebas <img src='http://www.fboiton.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Aca está el código de nuestra clase: </p>
<p><code>using System.Text.RegularExpressions;      <br />using TechTalk.SpecFlow;       <br />using WatiN.Core;       <br />using Xunit; </code></p>
<p>namespace testingIISInstance    <br />{     <br />&#160;&#160;&#160; [Binding]     <br />&#160;&#160;&#160; public class StepDefinitions     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private IE _browser;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; private string _httpAddress;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [Given(@&quot;I have written URL in browser <a href="http://www\.google\.com&quot;)]&#8220;>http://www\.google\.com&quot;)]</a>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void GivenIHaveWrittenURLInBrowserHttpWww_Google_Com()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser = new IE();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _httpAddress = &quot;<a href="http://www.google.com&quot;;">http://www.google.com&quot;;</a>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; [Then(@&quot;I check if Advanced Search link appear&quot;)]    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void ThenICheckIfAdvancedSearchLinkAppear()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.DomContainer.WaitUntilContainsText(new Regex(&quot;Advertising Programs|Programas de publicidad&quot;));     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.True(     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Html.IndexOf(&quot;Advertising Programs&quot;) &gt;= 0 || _browser.Html.IndexOf(&quot;Programas de publicidad&quot;) &gt;= 0     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Dispose();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.Close();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; [When(@&quot;I see google home page with title Google&quot;)]    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void WhenISeeGoogleHomePageWithTitleGoogle()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _browser.GoTo(_httpAddress);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; } </p>
<p>Prometo continuar con este tema y desglosar con mejor detalle cada uno de los elementos ac&aacute; mencionados</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fboiton.com/specflow-xunit-watin-mis-primeros-trotes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

