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



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

 [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();
        }
    }**
}

我一直在并行使用MbUnit和Selenium,我可以向您保证MbUnit是完全线程安全的,并且在您正确实例化WebDriver后可以完美工作。你只要锁就可以了。

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

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

我不知道MBunit是如何工作的,但协同和并行之间存在差异。我认为硒测试可以很好地集成到并行执行的概念中。无论如何,讨论可能会令人困惑。那么,该怎么做呢。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

相关内容

  • 没有找到相关文章

最新更新