java - 没有ParameterResolver的JUnit5中BeforeEach,AfterEach的参数化
问题描述
如何在 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 的类。
解决方案
如果不同浏览器的数量相当少,您可以使用简单的抽象测试类方法。这是一个草图:
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 现在将运行两个测试类:ChromeSmokeTest
和FirefoxSmokeTest
. 每个测试方法BaseSmokeTest
都将运行两次,每个具体测试类运行一次。
推荐阅读
- node.js - 有没有一种简单的方法可以使用 firebase auth 和 Node JS 来维护用户会话,并且仍然能够访问当前登录的用户的 UID?
- amazon-web-services - 如何从 AWS VPC 获取可用子网?
- javascript - 如何在 Vuejs 中插入 Echarts?
- node.js - 带有 Typescript 的 NodeJS 中的“TypeError:不是函数”
- mysql - 登录时mysql server 8.0 keyring迁移错误
- java - JPA / Hibernate - NamedEntityGraph 中的子类子图被忽略
- html - CSS Flex 基础孙子
- python - 使用python接收高速率的UDP数据包
- sql - PL/SQL 代码中的布尔变量声明和使用有什么问题?
- sql - SQL Server XML 查询