如何让我的Selenium测试变得不那么脆弱?

时间:2009-01-21 20:23:50

标签: asp.net testing selenium

我们使用Selenium来测试ASP.NET应用程序的UI层。许多测试用例测试跨越多页的更长的流程。

我发现测试非常脆弱,不仅通过实际更改页面的代码更改而且还通过无关重构(例如重命名控件)来破坏(因为我需要将控件的clientID传递给Selenium的Click方法等等) )或用转发器替换gridview。因此,我发现自己“浪费”时间在我的测试用例中更新字符串值,以便修复损坏的测试。

有没有办法编写更易维护的Selenium测试?或者更好的Web UI测试工具?

编辑添加: 通常,通过在IDE中记录测试来创建初稿。 (第一步可以由QA人员执行。)然后我重构生成的C#代码(提取常量,提取重复代码的方法,可能用不同的数据重复测试用例等)。但是每个测试用例的一般代码流程仍然与最初生成的代码相当接近。

8 个答案:

答案 0 :(得分:12)

我发现PageObject模式非常有用。

http://code.google.com/p/webdriver/wiki/PageObjects

更多信息: - What's the Point of Selenium? - Selenium Critique

开始的一个好方法是逐步重构你的测试用例。

我使用与selenium + c#

相同的场景

以下是我的代码的样子:

测试方法看起来像这样的想法

    [TestMethod]
    public void RegisterSpecialist(UserInfo usrInfo, CompanyInfo companyInfo)
    {
        var RegistrationPage = new PublicRegistrationPage(selenium)
              .FillUserInfo(usrInfo)
              .ContinueSecondStep();
        RegistrationPage.FillCompanyInfo(companyInfo).ContinueLastStep();
        RegistrationPage.FillSecurityInformation(usrInfo).ContinueFinishLastStep();
        Assert.IsTrue(RegistrationPage.VerifySpecialistRegistrationMessagePayPal());
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        paypal.LoginSandboxPage(usrInfo.sandboxaccount, usrInfo.sandboxpwd);
        Assert.IsTrue(paypal.VerifyAmount(usrInfo));
        paypal.SubmitPayment();
        RegistrationPage.GetSpecialistInformation(usrInfo);
        var bphome = new BPHomePage(selenium, string.Format(Resources.GlobalResources.LoginBPHomePage, usrInfo.AccountName, usrInfo.Password));
        Assert.IsTrue(bphome.VerifyPageWasLoaded(usrInfo));
        Assert.IsTrue(bphome.VerifySpecialistProfile());
        bphome.Logout();
    }

页面对象将是这样的

public class PublicRegistrationPage
{
    public ISelenium selenium { get; set; }

    #region Constructors
    public PublicRegistrationPage(ISelenium sel)
    {
        selenium = sel;
        selenium.Open(Resources.GlobalResources.PublicRegisterURL);
    }
    #endregion
    #region Methods

    public PublicRegistrationPage FillUserInfo(UserInfo usr)
    {
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserFirstName", usr.FirstName);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserLastName", usr.LastName);
        selenium.Select("ctl00_cphComponent_ctlContent_wizRegister_ddlUserCountry", string.Format("label={0}",usr.Country ));
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserEmail", usr.Email );
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserDirectTel", usr.DirectTel);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserMobile", usr.Mobile);
        return this;
    }

}

希望这有帮助。

答案 1 :(得分:3)

如何创建Selenium测试,通过录制并播放它们?我们所做的是围绕页面构建一个对象模型,这样你就可以调用像“clickSubmit()”这样的方法,而不是点击一个id(带有这些id的命名约定),这样就可以让selenium测试在很多变化中存活下来。

答案 2 :(得分:2)

您可能会也可能无法编写对重构具有弹性的测试。以下是如何使重构不那么痛苦:持续集成是必不可少的。

每天或每次构建时运行它们。它越早修复越容易。

确保开发人员可以自行运行测试。再一次,它越早被看到并修复,就越容易。

保持少量硒测试。他们应该关注关键路径/ pri 1测试场景。深度测试应在单元测试级别(或jsunit测试)进行。集成测试总是昂贵且价值较低。

答案 3 :(得分:2)

在端到端测试中使用任何低级概念,例如 XPath、CSS 选择器或 ID,都会导致测试不稳定。 我建议使用 testRigor 生成在您运行/更改/改进应用程序时不会中断的测试。 类似于上面的页面对象的代码如下所示:

    enter "Peter" into "First Name"
    enter "Pen" into "Last Name"
    enter "US" into "Country" below "User Data"
    enter stored value "email" into "Email"
    enter stored value "password" into "Password"
    enter "415-123-4567" into "Direct Telephone"
    enter "415-123-4568" into "Mobile Number"
    click "Submit"

testRigor 会将看起来像标签的文本与输入相关联,这样一旦从最终用户的角度来看,您的页面看起来相同,那么 testRigor 脚本就会变成绿色。这是doc

免责声明:我是 testRigor 的联合创始人。我共同创立了它,因为我们自己也有这些问题。

希望这会有所帮助。

答案 4 :(得分:1)

在测试自动化方面没有无害的变化;)

我们将SAFS framework与Rational Robot(RRAFS)一起使用,以最大限度地减少对自动化脚本的影响。仍然需要维护应用程序映射,但脚本在大多数情况下仍保持稳定。 SAFS框架听起来与cynicalman提到的方法非常相似,但已经打包了你在脚本中使用的通用方法。

SAFS网站表示对Selenium有部分支持,所以这可能适合你。

答案 5 :(得分:1)

我发现在Selenuium-RC中使用XPath表达式增加了很多测试的稳健性。

我以类似的方式写测试。第一遍通常通过IDE / Record写入,以获得我的大部分页面流和点击操作。一旦我有了这个,我开始通过Selenium-RC添加断言并将绝对小部件定位器更改为更易读和友好的Xpath表达式来逐步完成测试。 (以及记录测试!:))

有一件事需要注意..如果你的测试是xpath-heavy,它们可能在IE6中运行速度稍慢,因为它的javascript执行能力很差。 (我有一些测试套件,在IE下执行需要花费的时间比在FF下长一个小时。它是可管理的,但在编写测试时需要记住一些。)

答案 6 :(得分:0)

Selenium理论上有一个名为 UI元素的抽象(文档为here)。

功能将是

  • 抽象定位器,独立于html实现;这将很好地映射到Web框架的组件或小部件的概念,

  • 汇总规则,允许将多个命令合并为一个更抽象的命令。

我已经挣扎了几天才能利用这个功能,但最终我决定放弃它,原因如下:

  • 某些概念,例如偏移定位器的概念(将它们视为组件的一部分)未完全或有用地开发;
  • 格式化程序并不完全支持该功能,格式化程序越新,支持的功能就越少,暗示Selenium的核心演变正在抛弃此功能;
  • 它没有完全集成在Selenium 2.0(WebDriver)中。

答案 7 :(得分:-1)

我认为Xpath是确保强大的硒测试的最佳方法。 我目前正在开发一个库,以帮助更轻松地编写xpath表达式。

如果有兴趣,可以在这里查看: http://www.unit-testing.net/CurrentArticle/How-To-Write-XPath-for-Selenium-Tests.html