ein webtesting DSL Entwerfen von verschiedenem Web-Test-Treiber implementiert werden - sollten wir primitiv und nicht-primitive Operationen mischen?
-
01-10-2019 - |
Frage
Wir sind für einige Intranet-Anwendungen ein Web-Testautomatisierung Projekt umzusetzen.
Um einfach das Schreiben von jedem Test, wir sind einen Java-DSL entwerfen, die verschiedenen Adapter implementiert werden kann unter Verwendung von (wir haben Sahi gewählt und Selen / WebDriver so weit, wie wir wollen in Bezug auf Leistung, sie nebeneinander messen , Lesbarkeit, Wartbarkeit, usw.).
Wir haben zwei Arten von Operationen im DSL identifiziert:
1) Primitive: seine Umsetzung muss sicherlich beschäftigen sich mit HTML / Selen / Sahi / etc Besonderheiten. Beispiel: (mit Sahi Web-Treiber)
public void insertProjectRecord(String projectName) {
b.link("Create new project").click();
b.textbox("ctl00$ProjectForm$Name").setValue(projectName);
b.span("Insert").click();
}
2) Nicht-Primitive: eine Operation wert einschließlich in unserem DSL für Wiederverwendungszwecke, obwohl das Primitive mit eingebaut werden kann. Beispiel:
public void createFormulation(String projectName, String rteDummyText) {
goToAddProjectPage();
insertProjectRecord(projectName);
switchToEditModeForFirstAvailableRecord();
editBeneficiaryCountries();
editAcronyms(rteDummyText);
saveSectionChanges();
}
Frage: wir zunächst mit einer Schnittstelle mit nur primitiven Operationen begonnen, aber später änderten wir es zu einer abstrakten Klasse, um die nicht-primitiven Methoden umfassen (die eine spezifischen Implementierungen außer Kraft zu setzen erlaubt , wenn benötigt). Allerdings fühlt es sich nicht „OK“ Primitiven und nicht-Primitiven zu mischen, und die Liste der Methoden wurde sicherlich sehr lang.
Was anderer Ansatz würden Sie vorschlagen und / oder erkunden?
Lösung
Ich würde empfehlen, die Seite Object Model. Dabei erstellen Sie eine Klasse für jede Seite und dann abstrakte Elemente entfernt.
Ich schrieb einen Blog-Post zu schreiben wartbare Tests hier . Sie können meine Blog-Post auf der Seite Objektmodell hier
So Ihr Objekt wie unten sein könnte.
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);
}
}
und dann würde die Testklasse wie sein
[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));
}
}