我的目标是在一台机器上并行运行多个测试。为此,我将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