Hace un par de semanas comencé a interactuar con TDD y BDD mas allá del aprendizaje con base en lecturas… y bueno… déjenme contarles que no puedo decir nada mas que TDD y BDD Rules!
La configuración es bien sencilla, encontré más información utilizando nUnit y por ello que nace este post (ya era hora no?
) para ejemplificar utilizando xUnit
Primero comenzamos con las descargas e instalación de:
Adicionalmente a esto, deberán tener configurado el ejecutor de test units ya sea con TestDriven.Net o con Resharper en Visual Studio.
Ya que descargamos todo esto procedemos a crear un nuevo proyecto y a agregarle las referencias a las 3 librerias descargadas.
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,…”)
debemos agregar un Application Configuration File a nuestro proyecto con lo siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"/>
</configSections>
<!-- the following configuration represent the defaults -–>
<specFlow>
<language feature="en" />
<unitTestProvider name="XUnit" />
<runtime detectAmbiguousMatches="true" stopAtFirstError="false" missingOrPendingStepsOutcome="Inconclusive" />
<trace traceSuccessfulSteps="true" traceTimings="false" minTracedDuration="0:0:0.1" />
</specFlow>
</configuration>( mjm… creo que debo cambiar el theme de mi blog, les dejo el formato a ustedes por el momento )
Bueno, a este punto ya estamos listos para comenzar con nuestro primer test, para el cual tomaremos esta Feature:
Feature: googling
In order to use watin
As entusiast
I want to be able to get a page and validate text
Scenario: google to search about frogs
Given I have written URL in browser http://www.google.com
When I see google home page with title Google
Then I check if Advanced Search link appear
Cabe mencionar que SpecFlow utiliza como sintaxis Gherkin cuya documentación pueden encontrarla en http://wiki.github.com/aslakhellesoy/cucumber/gherkin
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.
una vez creada nuestra feature
ejecutamos la test unit, sabiendo que va a ser fallida y observamos el mensaje de salida:
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.
No debemos olvidar la respectiva referencia a la libreria en los “using” de nuestra clase:
using WatinN.Core;
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 WatiN
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í:
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”.
Luego viene el “When” donde le inddicamos al Browser que obtenga la dirección que necesitamos evaluar.
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.
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.
No olvidemos cerrar el navegador al finalizar la ejecución desde código para evitar llenarnos de browsers con las ejecuciones de las pruebas
Aca está el código de nuestra clase:
using System.Text.RegularExpressions;
using TechTalk.SpecFlow;
using WatiN.Core;
using Xunit;
namespace testingIISInstance
{
[Binding]
public class StepDefinitions
{
private IE _browser;
private string _httpAddress;
[Given(@"I have written URL in browser http://www.google.com";
}
[Then(@"I check if Advanced Search link appear")]
public void ThenICheckIfAdvancedSearchLinkAppear()
{
_browser.DomContainer.WaitUntilContainsText(new Regex("Advertising Programs|Programas de publicidad"));
Assert.True(
_browser.Html.IndexOf("Advertising Programs") >= 0 || _browser.Html.IndexOf("Programas de publicidad") >= 0
);
_browser.Dispose();
_browser.Close();
}
[When(@"I see google home page with title Google")]
public void WhenISeeGoogleHomePageWithTitleGoogle()
{
_browser.GoTo(_httpAddress);
}
}
Prometo continuar con este tema y desglosar con mejor detalle cada uno de los elementos acá mencionados








