JUnit继承BaseTest时如何在@BeforeEach中获取子类运行的测试方法名
解决方案
以下实现方案均只需修改父类BaseTest,所有继承BaseTest的测试子类无需做任何调整即可适配。
方案1:JUnit 5(Jupiter,推荐)
JUnit 5原生支持在@BeforeEach方法中注入TestInfo对象,直接获取当前运行的测试方法信息:
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInfo; public class BaseTest { protected WebDriver driver; @BeforeEach public void setupTest(TestInfo testInfo) { // 直接获取当前执行的测试方法名 String methodName = testInfo.getTestMethod().get().getName(); driver = appName.open(driver, methodName); } }
方案2:JUnit 4
JUnit 4可以通过TestName Rule实现,Rule直接定义在父类中即可,子类不需要做任何额外配置:
import org.junit.Rule; import org.junit.rules.TestName; import org.junit.Before; public class BaseTest { protected WebDriver driver; // 父类声明public的TestName Rule,子类继承后自动生效 @Rule public TestName testName = new TestName(); @Before public void setupTest() { // 获取当前测试方法名 String methodName = testName.getMethodName(); driver = appName.open(driver, methodName); } }
你之前了解的「需要在子类实现Rule逻辑」是误区,只要父类中Rule的访问修饰符为public,继承的子类会自动应用该Rule,不需要添加任何代码。
不推荐的栈轨迹方案
你之前通过栈轨迹获取方法名的方式也可以调整实现,但稳定性差、适配性低,不建议生产环境使用:需要遍历栈帧查找带@Test注解的方法名,不同测试框架、不同运行环境的栈结构可能有差异,容易出现不兼容问题。
内容的提问来源于stack exchange,提问作者Nick Schuette
相关产品推荐
相关产品推荐

