java - 在没有 ParameterResolver 的 JUnit5 中对 BeforeEach、AfterEach 进行参数化

标签 java selenium cross-browser junit5 parallel-testing

如何在 Junit 5 中参数化 @BeforeEach/@AfterEach 注解的方法?该方法应该从传递的流或对象列表中获取参数。

假设您有一个基类 BaseSmokeTest,其中在 @BeforeEach 带注释的名为prepare() 的方法中初始化了 WebDriver。现在,其他类(例如 LoginSmokeTest 或 LogoutSmokeTest)扩展了 BaseSmokeTest,因此它们不关心 WebDriver 初始化。

我想为每个浏览器运行参数化测试。对我来说唯一的解决方案是使用字符串参数参数化prepare()方法,该参数将指定要使用的浏览器 - void prepare(String browserName)

我尝试使用ParameterResolver来解析prepare方法的参数,但如果我理解正确的话,ParameterResolver只解析@BeforeEach/@AfterEach方法的参数一次。

我还尝试参数化构造函数,但同样 - ParameterResolver 只解析构造函数的参数一次。

我正在寻找可以执行以下操作的解决方案:

@ValueSource(strings = {"firefox", "chrome"})
@BeforeEach
public void prepare(String browserName) {
    WebDriver driver = initializeWebDriver(browserName);
    WebDriverRunner.initialize(driver);
}

@AfterEach
public void cleanup() {
    WebDriverRunner.closeWebDriver();
}

编辑:我还应该指出,这些参数化测试所需的功能将是并行化 - 每个浏览器应该在自己的 session 中并行启动。

Edit2:我还应该提到 BaseSmokeTest(尽管有名称)根本不包含任何测试,只是运行其他测试所需的 Web 驱动程序的初始化。测试仅包含扩展 BaseSmokeTest 的类。

最佳答案

如果不同浏览器的数量相当小,您可以使用简单的抽象测试类方法。这是一个草图:

abstract class BaseSmokeTest {
  abstract String getBrowserName();

  @BeforeEach
  public void prepare() {
    WebDriver driver = initializeWebDriver(getBrowserName());
    WebDriverRunner.initialize(driver);
  }

  @Test
  void test1() {}

  @Test
  void test2() {}
}

class FirefoxSmokeTest extends BaseSmokeTest {
  String getBrowserName() { return "firefox"; }
}


class ChromeSmokeTest extends BaseSmokeTest {
  String getBrowserName() { return "chrome"; }
} 

Jupiter 现在将运行两个测试类:ChromeSmokeTestFirefoxSmokeTestBaseSmokeTest 中的每个测试方法将运行两次,每个具体测试类运行一次。

关于java - 在没有 ParameterResolver 的 JUnit5 中对 BeforeEach、AfterEach 进行参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57216420/

相关文章:

java - jstring/c++ 的 Ljava/lang/String 错误

c# - 如何简化 href 属性,这样我就不会得到 "the given paths format is not supported"?

javascript - 如何找出浏览器应用程序窗口的大小,包括边框、页眉和页脚?

http - 是否存在不支持相对重定向的 HTTP 客户端的已知案例?

java - Oracle 数据库的 JDBC 连接错误

java - 同步关键字在内部如何工作

java - 如何使用 Katalon 将图像滑出屏幕

ios - 使用 Selenium 和 ios-driver 从 Windows 计算机测试 iOS 移动应用程序

python - 元素有时出现有时不出现,如何继续脚本?

css - Firefox:使用最小宽度和最大高度时如何防止水平滚动条?