【问题标题】:Parallelizing Selenium tests and being thread safe并行化 Selenium 测试并保证线程安全
【发布时间】:2019-11-15 16:22:10
【问题描述】:

我正在尝试并行化我的 Selenium 测试。我发现Selenium's IWebDriver is not thread safe。我不知道没有线程安全测试是否有严重的危险,但我想在任何情况下尝试解释任何“不良做法”。在我的代码中,我使用了以下设计。

public abstract class Parent
{
    public IWebDriver driver;
    public Parent(IWebDriver driver) { this.driver = driver; }
    public bool ElementExists(By by) { 
        if (this.driver.FindElement(by) != null) 
            return true; 
        return false;
    }
}

public class Child1 : Parent 
{
    public Child1(IWebDriver driver) : base(driver) { }
}

public class Child2 : Parent 
{
    public Child2(IWebDriver driver) : base(driver) { }
}

这个代码线程安全吗?

据我了解,由于我将 IWebDriver 实例传递给构造函数,因此我不必担心子类错误地使用相同的 IWebDriver。但是,仅从非线程安全代码示例来看,在抽象 Parent 类中包含 IWebDriver 字段是一个问题。

【问题讨论】:

  • 只要您为每个运行的测试用例初始化和拆除WebDriver 实例,您的代码就应该是线程安全的。当对多个测试使用相同的 WebDriver 实例时会出现问题,即使没有并行也是不好的做法。
  • @Christine 明白了。是的,我正在我的每个 [TestMethod]s 中创建新的 WebDriver 实例

标签: c# selenium thread-safety


【解决方案1】:

据我所知,如果您在每个测试用例之前和之后设置和拆除 WebDriver 实例——而不是使用相同的 WebDriver 实例进行多个测试——那么你已经练习线程安全。这在Selenium docs 中暗示了线程安全。

如果您确实希望使用多线程 WebDriver 实例(即通过线程在多个驱动程序上运行多个测试),那么您可以使用 ThreadLocal 类:

public static ThreadLocal<IWebDriver> driver =
    new ThreadLocal<IWebDriver>(() =>
    {
        return new ChromeDriver();
    });

ThreadLocal 是 C# 实践线程安全编码的方式,适用于任何对象,而不仅仅是 WebDriver。可以使用Dispose()方法释放资源,使用threadLocalDriver.Value访问WebDriver实例。

您可以在每次测试之前运行的 [SetUp] 类中声明和实例化 ThreadLocal 驱动程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多