我正在尝试使用 Spring 框架并行运行 JUnit 5 测试。
我有一个单例 bean:需要在大约 4 个地方(POJO 类)注入的 WebDriver。然后一个测试类将注入其中一些 POJO 类来运行测试方法。因为其他测试将按照相同的模型,使用相同的 bean(webdriver) 运行,所以当测试结束时,bean 会话结束,并且另一个并行测试运行失败,因为 bean 已被销毁。
如何使每个测试方法共享单例 webdriver(而不是跨测试套件执行)所以每个测试会话都有一个不同的 webdriver bean?
我创建了一个尝试这样做的扩展:
public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable
{
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.execute(()->
{
try
{
invocation.proceed();
}
catch (Throwable throwable)
{
throwable.printStackTrace();
}
});
poolTaskExecutor.shutdown();
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
}
这会将每个测试放在线程池中,从而使测试线程安全(理论上)。但是 WebDriver bean 仍然在其他线程之间共享以用于其他测试方法。
我尝试制作 webdriver 原型,但是在一次运行 6 个测试时创建了太多的 bean,导致测试套件崩溃。