【问题标题】:Parametrization for BeforeEach, AfterEach in JUnit5 without ParameterResolver没有ParameterResolver的JUnit5中BeforeEach,AfterEach的参数化
【发布时间】:2019-12-04 14:02:30
【问题描述】:

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

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

我想为每个浏览器运行参数化测试。对我来说唯一的解决方案是使用 String 参数参数化 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();
}

编辑:我还应该说明这些参数化测试的所需功能将是并行化 - 每个浏览器都应该在其自己的会话中并行启动。

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

【问题讨论】:

  • 简单的解决方案:使用带有抽象getBrowserName方法和两个具体子类的抽象测试类。
  • 我很不理解您提出的解决方案。当我有一种层次结构类型时,每个 SmokeTest 都扩展 BaseSmokeTest 以防止代码重复(我想为将要测试的任何可能的浏览器参数化 BaseSmokeTest),实现两个具体的子类有什么帮助?此外,BaseSmokeTest 将如何使用这两个子类,正如我之前所说的 - 没有 ParameterResolver 的 BeforeEach 方法就不能进行参数化?

标签: java selenium cross-browser junit5 parallel-testing


【解决方案1】:

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

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 中的每个测试方法将运行两次,每个具体测试类运行一次。

【讨论】:

  • 这对我没有帮助。拥有 BaseSmokeTest 的目的是将初始化功能组合在一起,以便其他类(如 LoginSmokeTest 和 LogoutSmokeTest)只关心实际测试,而不会复制任何不必要的代码。因此, BaseSmokeTest 不应该有任何测试。它仅用作特定测试类的父级(例如,每个测试类可以包含 100 多个测试用例 - 然后不可能将所有内容分组到 BaseSmokeTest 中)。答案中指定的想法和测试结构与我的问题无关。
  • 在这种情况下,不要将任何测试放在基类中,而是将它们全部放在具体的测试类中。
  • 对不起,我的规范缺乏,我认为这很明显,但现在我发现我没有在任何地方提到它。我会更准确地编辑问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2019-01-23
相关资源
最近更新 更多