2010-08-24 20 views
2

我们正在为一些内联网应用程序实施Web测试自动化项目。我们正在设计一个可以使用不同适配器实现的Java DSL(我们已经选择了Sahi和Selenium/WebDriver到目前为止,因为我们要按照性能,可读性,可维护性等)。设计一个webtesting DSL由不同的Web测试驱动程序实现 - 我们是否应该混合原始操作和非原始操作?

我们已经确定了两种类型的DSL业务:

1)原始:它的实施,必将要处理HTML /硒/ SAHI公司/等细节。例如:(使用SAHI公司的网络驱动器)

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

2)非原生态的:价值,包括我们的可重用性的目的DSL的操作,虽然可以使用原语上构建。例如:

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

问题:我们最初开始使用仅具有原始操作的接口,但后来我们以包括非原始的方法(其中具体的实施方式允许将其改为一个抽象类覆盖,如果需要的话)。 但是,混合原语和非原语并不感觉“好”,方法列表肯定会变得很长。

你会建议和/或探索什么其他方法?

回答

2

我强烈推荐使用页面对象模型。在这里,您为每个页面创建一个类,然后抽取项目。

我写了一篇关于编写可维护测试here的博客文章。 你可以在Page对象模型上看到我的博客文章here

所以你的对象可能就像下面那样。

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); 
    } 
} 

,然后测试类会像

[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)); 
    } 
} 
+0

感谢。我已经看到了页面对象模型模式,这是我们一定会探索的东西,更符合OOD。然而,我们决定从命令/程序方法开始(为什么?在这里解释太长......),并且我们面临着原始/非原始混合问题。到目前为止,我已经确定了更多原因来保持原始图元和非原始图元的分离,但我们仍然需要一点点。 – Sebastian 2010-08-25 14:05:16

+0

切换到POM。 我们很害怕它,因为我们预计应用程序的导航性有很大的变化,但现在它感觉是最好的方式。稍后我们将处理这些更改。谢谢。 – Sebastian 2010-08-26 16:21:46

+0

Page对象模型的思想是在导航更改发生时使更新测试更容易 – AutomatedTester 2010-08-26 20:04:19