首页 > 解决方案 > 有没有办法控制配置方法在 TestNG 中使用哪个线程?

问题描述

我最近切换到在我的测试套件中使用 ThreadLocal,虽然它在并行测试中效果很好,但它现在已经破坏了非并行测试。我有 @BeforeClass/@BeforeMethod 方法来处理基于测试类的驱动程序实例策略创建 WebDriver 的新实例。但是,当他们创建 WebDriver 的新实例时,它与“Test Worker”的线程相关联,该线程仅用于配置方法,如@BeforeClass 和@BeforeMethod。在启用并行化的情况下运行时不会发生这种情况。这是一个非常简化的示例:

public class DriverWrapper () {
   private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
 
   public DriverWrapper() {}

   public void newInstance(){
      driver.set(new ChromeDriver());
   }

   public WebDriver getDriverInstance(){
      return driver.get();
   }
}

abstract public class AbstractTest {
   DriverPolicy policy;
   DriverWrapper driver;
 
   public AbstractTest(DriverPolicy policy){
      this.policy = policy;
   }
 
   @BeforeClass
   public void setUpClass() {
      if (policy == DriverPolicy.NEW_INSTANCE_PER_CLASS) {
         driver = new DriverWrapper();
         driver.newInstance();
      }
   }   

   @BeforeMethod
   public void setUp() {
      if (policy == DriverPolicy.NEW_INSTANCE_PER_METHOD) {
         driver = new DriverWrapper();
         driver.newInstance();
      }
   }
}

public class SomeTest {
   public SomeTest() {
      super(DriverPolicy.NEW_INSTANCE_PER_CLASS);
   }

   @Test
   public void doSomeThings() {
      SomePageFactoryClass somePageFactoryClass = new SomePageFactoryClass(driver.getDriverInstance());
      // it does some pagefactory stuff 
      somePageFactoryClass.login(); 
      // login() tries to do some WebDrivery stuff
      // It's here that I hit the NPE because the thread ID that got assigned to the WebDriver in
      // DriverWrapper is different from the thread ID in @Test, so it's just null.
   }
}

运行这些测试的我的 testng.xml 仅在禁用并行时遇到此问题。一旦我启用了并行,@BeforeClass 和@BeforeMethod 方法就会与它们的类的@Test 方法在同一个线程上运行。

我想出了一个混乱的工作,我只是在每个单独的@Test 方法中创建 DriverWrapper 的新实例,但是当我已经将代码放在 AbstractTest 中时感觉很浪费。

我有什么明显的遗漏吗?也许我不应该将 ThreadLocal 用于非并行测试?

标签: javamultithreadingseleniumparallel-processingtestng

解决方案


推荐阅读