硒批判

时间:2008-09-19 05:29:11

标签: unit-testing selenium automated-tests ui-testing

我只是想从运行Selenium(http://selenium.openqa.org)的人那里得到一些意见我已经有很多使用WaTiN的经验,甚至还为它写了一套录音套件。我有它生成一些结构良好的代码,但只是由我维护,似乎我的公司几乎放弃了它。如果你已经运行了硒,你有很多成功吗?我将使用.NET 3.5,Selenium能很好地使用它吗?生成的代码是干净的还是只是所有交互的列表? (http://blogs.conchango.com/richardgriffin/archive/2006/11/14/Testing-Design-Pattern-for-using-WATiR_2F00_N.aspx)分布式测试套件的公平程度如何?

非常感谢系统上的任何其他抱怨或称赞!

5 个答案:

答案 0 :(得分:26)

如果您使用Selenium IDE生成代码,那么您只需获取selenium将执行的每个操作的列表。对我来说,Selenium IDE是一个很好的方式来开始或快速“尝试看”测试。但是,当您考虑可维护性和更易读的代码时,您必须编写自己的代码。

获得良好的selenium代码的好方法是使用Page Object Pattern代码表示导航流的方式。这是我在Coding Dojo Floripa(来自巴西)中看到的一个很好的例子:

public class GoogleTest {

    private Selenium selenium;

    @Before
    public void setUp() throws Exception {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox",
                            "http://www.google.com/webhp?hl=en");
            selenium.start();
    }

    @Test
    public void codingDojoShouldBeInFirstPageOfResults() {
            GoogleHomePage home = new GoogleHomePage(selenium);
            GoogleSearchResults searchResults = home.searchFor("coding dojo");
            String firstEntry = searchResults.getResult(0);
            assertEquals("Coding Dojo Wiki: FrontPage", firstEntry);
    }

    @After
    public void tearDown() throws Exception {
            selenium.stop();
    }

}


public class GoogleHomePage {

    private final Selenium selenium;

    public GoogleHomePage(Selenium selenium) {
            this.selenium = selenium;
            this.selenium.open("http://www.google.com/webhp?hl=en");
            if (!"Google".equals(selenium.getTitle())) {
                    throw new IllegalStateException("Not the Google Home Page");
            }
    }

    public GoogleSearchResults searchFor(String string) {
            selenium.type("q", string);
            selenium.click("btnG");
            selenium.waitForPageToLoad("5000");
            return new GoogleSearchResults(string, selenium);
    }
}

public class GoogleSearchResults {

    private final Selenium selenium;

    public GoogleSearchResults(String string, Selenium selenium) {
            this.selenium = selenium;
            if (!(string + " - Google Search").equals(selenium.getTitle())) {
                    throw new IllegalStateException(
                                    "This is not the Google Results Page");
            }
    }

    public String getResult(int i) {
            String nameXPath = "xpath=id('res')/div[1]/div[" + (i + 1) + "]/h2/a";
            return selenium.getText(nameXPath);
    }
}

希望能帮助

答案 1 :(得分:7)

我正在使用Selenium Remote Control来测试ASP.Net应用程序(这也是我假设你也会瞄准目标),而且效果很好。

如果您从未使用过Selenium,请观看部分screencasts以使用Selenium IDE。这将让您对“Selenium”的工作原理有所了解。 IDE是一个firefox插件,基本上可以让你随时开发快速记录和播放测试。对于较大的测试套件或编写真正可维护的测试,我建议使用Selenium Remote Control。 (如果你刚刚开始,那么IDE非常棒。)

Selenium Remote Control允许您使用自己喜欢的语言和单元测试框架来驱动Web浏览器以执行测试。如果你对C#/ NUnit最熟悉,你可以用这种方式编写测试并使用你喜欢的所有NUnit好东西。 (例如,Test-Driven.net插件)。此外,由于您的测试是用高级语言编写的,因此您可以执行从特定测试类继承的操作,您可以使用它来使您的实际测试方法代码更加清晰。 (或者至少就是我编写测试的方式。它让我测试复杂的场景,使我的测试方法行数保持合理的数量。)

你提到分布式测试。不幸的是,我还没有找到一种方法来使用NUnit的Selenium Grid项目。 Selenium Grid允许您在多个不同的计算机和浏览器实例上执行测试套件。因此,不是一个接一个地说出200个测试方法(即,连续地),而是在一台机器或多台机器上将负载分散到四个网格实例(即,一次在四个不同的浏览器实例中运行)上。关于你想要分配的方式。

如果你用Java或PHP编写测试,你可能会有更好的运气。我希望通过NUnit发布NUnit2.5,包括pNUnit进行并行测试。

如果您对硒有任何疑问,请澄清您的原始问题,我将很乐意帮您解决。 (Selenium只是我每天使用的工具之一,所以我喜欢帮助新人开始使用它。)

答案 2 :(得分:3)

我从Selenium IDE和Selenium Core开始。这些绝对是让你入门的好工具。但它们并不是很强大,因为你只能使用Selenium,Selenium的基于HTML的命令语言。

现在我使用Selenium Remote Control和Ruby驱动程序,这使我可以利用Ruby提供的功能。我测试了许多环境:Windows 2000,XP,Vista,Mac 10.4 / 10.5,以及适用的每个环境,Safari 2/3,Firefox 2/3,Internet Explorer 6/7。

Selenium声称与所有这些操作系统和浏览器兼容,尽管我目前在使用Internet Explorer时遇到了问题(实际上我在StackOverflow上的第一个问题就是这个问题)。但我不知道任何其他功能如此强大,并且适用于这么多平台。

我使用Selenium遇到的最大问题是DOM解析。 JavaScript的childNodes是不可靠的,因为Safari / Firefox忽略了空格和评论节点,而Internet Explorer没有。 Internet Explorer中的XPath比SF / FF慢10-20倍。 innerHTML在IE中并不总是可靠的。

答案 3 :(得分:1)

Selenium是相当不错的工具,但有几点需要注意:

  • Selenium IDE和Selenium核心不共享100%相同的功能。例如,IDE支持右键单击,但当前的核心版本没有它。但是,使用其存储库中的较新版本可以解决这个问题。

  • 对于ext js,gwt等确保您的显示元素具有适当的ID,而不是自动生成的(随机)ID。

  • 维护测试用例。我已经看到了在Selenium测试和良好覆盖方面投入了大量精力的案例。后来测试开始失败,因为创建它们的人忙于其他任务而没有其他人想要触摸它们。但这是管理层的问题,而不是Selenium。

答案 4 :(得分:1)

我是Selenium的忠实粉丝。但是,提前了解的一个主要问题是Selenium IDE在弹出窗口方面遇到了很多麻烦。这些问题在Selenium RC中并不存在,但它可能使开发变得有点头疼。