我的目标是在一台机器上并行运行多个测试。为此,我在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();
}
}**
}
答案 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