El diseño de un DSL webtesting a desarrollar por diferentes conductores de prueba Web - deberíamos mezclar operaciones primitivas y no primitivas?

StackOverflow https://stackoverflow.com/questions/3558493

Pregunta

Estamos poniendo en práctica un proyecto de automatización de pruebas web para algunas aplicaciones de intranet.

Para fácil la escritura de cada prueba, estamos diseñando un DSL Java que puede ser implementado utilizando diferentes adaptadores (que hemos elegido Sahi y selenio / WebDriver hasta ahora, ya que queremos medir al lado del otro en términos de rendimiento , la legibilidad, facilidad de mantenimiento, etc.).

Hemos identificado dos tipos de operaciones en el DSL:

1) Primitivo: su aplicación seguramente tendrá que lidiar con HTML / selenio / Sahi / etc específicos. Ejemplo: (utilizando el controlador web Sahi)

public void insertProjectRecord(String projectName) {
  b.link("Create new project").click();
  b.textbox("ctl00$ProjectForm$Name").setValue(projectName);
  b.span("Insert").click();
}

2) no primitivos: un valor de operación, incluyendo en nuestro DSL con fines de reutilización, a pesar de que se pueden construir usando primitivas. Ejemplo:

public void createFormulation(String projectName, String rteDummyText) {
  goToAddProjectPage();
  insertProjectRecord(projectName);
  switchToEditModeForFirstAvailableRecord();
  editBeneficiaryCountries();
  editAcronyms(rteDummyText);
  saveSectionChanges();
}

Pregunta: que inicialmente comenzó con una interfaz con las operaciones solamente primitivas, pero más tarde que lo cambió a una clase abstracta con el fin de incluir los métodos no primitivos (que a implementaciones específicas se permiten para anular , si es necesario). Sin embargo, no se siente "OK" para mezclar primitivas y no primitivas, y la lista de métodos sin duda se hizo muy larga.

¿Qué otro enfoque que sugerir y / o explorar?

¿Fue útil?

Solución

lo recomiendo encarecidamente utilizando el Modelo de objeto de página. En este se crea una clase para cada página y los artículos abstractos de distancia.

Me escribió una entrada de blog en la escritura de pruebas mantenibles aquí . Usted puede ver mi blog sobre el modelo de objetos de página aquí

Así que su objeto podría ser, como a continuación.

public class Home
{
    private readonly ISelenium _selenium;

    /// <summary>
    /// Instantiates a new Home Page object. Pass in the Selenium object created in the test SetUp(). 
    /// When the object in instantiated it will navigate to the root
    /// </summary>
    /// <param name="selenium">Selenium Object created in the tests
    public Home(ISelenium selenium)
    {
        this._selenium = selenium;
        if (!selenium.GetTitle().Contains("home"))
        {
            selenium.Open("/");
        }
    }

    /// <summary>
    /// Navigates to Selenium Tutorials Page. Selenium object wll be passed through
    /// </summary>
    /// <returns>SeleniumTutorials representing the selenium_training.htm</returns>
    public SeleniumTutorials ClickSelenium()
    {
        _selenium.Click("link=selenium");
        _selenium.WaitForPageToLoad("30000");
        return new SeleniumTutorials(_selenium);
    }

    /// <summary>
    /// Click on the blog or blog year and then wait for the page to load
    /// </summary>
    /// <param name="year">blog or blog year
    /// <returns>Object representing /blog.* pages</returns>
    public Blog ClickBlogYear(string year)
    {
        _selenium.Click("link=" + year);
        _selenium.WaitForPageToLoad("30000");
        return new Blog(_selenium);
    }
    // Add more methods as you need them
}

public class SeleniumXPathTutorial
{
    private readonly ISelenium _selenium;

    public const string FirstInput = "number1";
    public const string SecondInput = "number2";
    public const string Total = "total";

    public SeleniumXPathTutorial(ISelenium selenium)
    {
        this._selenium = selenium;
    }

    public bool IsInputOnScreen(string locator)
    {
        return _selenium.IsElementPresent(locator);
    }
}

y luego la clase de prueba sería como

[TestFixture]
public class SiteTests
{
    private ISelenium selenium;
    [SetUp]
    public void Setup()
    {
        selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.theautomatedtester.co.uk");
        selenium.Start();
    }

    [TearDown]
    public void Teardown()
    {
        selenium.Stop();
    }

    [Test]
    public void ShouldLoadHomeThenGoToXpathTutorial()
    {
        Home home = new Home(selenium);
        SeleniumTutorials seleniumTutorials = home.ClickSelenium();
        SeleniumXPathTutorial seleniumXPathTutorial = seleniumTutorials.ClickXpathTutorial();
        Assert.True(seleniumXPathTutorial.
                    IsInputOnScreen(SeleniumXPathTutorial.FirstInput));
        Assert.True(seleniumXPathTutorial
                    .IsInputOnScreen(SeleniumXPathTutorial.SecondInput));
        Assert.True(seleniumXPathTutorial
                    .IsInputOnScreen(SeleniumXPathTutorial.Total));
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top