如何在一台机器上使用Selenium WebDriver执行并发测试?

时间:2012-02-24 23:46:19

标签: selenium webdriver mbunit

我的目标是在一台机器上并行运行多个测试。为此,我在Firefox和Mbunit上使用Selenium WebDriver。不幸的是,看起来像Selenium中的驱动程序创建不是线程安全的,我必须用全局锁包装这部分代码。这不是世界末日,但我的问题是,这是我需要做的全部还是有其他部分需要同步?另一种选择是在MBUnit中使用AppDomain或Process隔离,但我不确定这是否已实现。

 [TestFixture]
[Parallelizable]
public class Class1
{

    public static object padlock = new object();

    [Test]
    [Parallelizable]
    public void Test1()
    {
        var driver = CreateDriver();
        driver.Navigate().GoToUrl("http://www.mozilla.org");
        driver.FindElementByCssSelector("a[href='/projects/']").Click();
        Thread.Sleep(TimeSpan.FromSeconds(5));
        driver.Quit();
    }

    [Test]
    [Parallelizable]
    public void Test3()
    {
        var driver = CreateDriver();
        driver.Navigate().GoToUrl("http://www.mozilla.org");
        driver.FindElementByCssSelector("a[href='/contribute/']").Click();
        Thread.Sleep(TimeSpan.FromSeconds(5));
        driver.Quit();
    }

    **private FirefoxDriver CreateDriver()
    {
        lock(padlock)
        {
            return new FirefoxDriver();
        }
    }**
}

2 个答案:

答案 0 :(得分:1)

我一直在使用MbUnit和Selenium,我可以向你保证MbUnit是完全线程安全的,并且一旦你正确地实例化WebDriver就可以正常工作。你应该没事锁。

我想指出使用您的代码示例,您的测试不会正确失败。在任何失败的断言或抛出异常时,您将无法访问代码的Quit()部分。这就是Setup / Teardown方法通常用于启动/停止浏览器的原因。

仅供参考,你仍然可以并行使用setup / teardown方法,你只需要一种存储/引用驱动程序的方法。您可以使用TestStep名称引用的IDictionary。

答案 1 :(得分:-1)

我不知道MBunit是如何工作的,但是cocnurency和parallelism之间存在差异。 我认为,硒测试可以很好地集成在并行执行的概念中。无论如何,讨论可能会令人困惑。 那么,怎么做呢。 1.创建一个实现Runnable或扩展Thread类的类。这个类将启动测试,如下所示:

 class MyClass implements Runnable
 {
    private Thread t;
    public MyClass()
    {
       t=new Thread (this);
       t.start();
    }

    @Override
    public void run() {
       WebDriver w = new FirefoxDriver();
       // begin your test
    }

 }

在Main类中,创建MyClass的多个实例。他们每个人都会对自己的线程进行测试。 这是Thread类文档的链接:http://docs.oracle.com/javase/1.3/docs/api/java/lang/Thread.html