JUnit 5 中与 TestName 规则相当的是什么?

38

如何在JUnit 5中获取测试方法的名称?

4个回答

41
在你的测试方法中声明一个类型为TestInfo的参数,JUnit会自动为该方法提供一个实例。
@Test
void getTestInfo(TestInfo testInfo) { // Automatically injected
    System.out.println(testInfo.getDisplayName());
    System.out.println(testInfo.getTestMethod());
    System.out.println(testInfo.getTestClass());
    System.out.println(testInfo.getTags());
}

你可以从上面显示的TestInfo实例中获取测试方法的名称(以及更多信息)。

5
这很好,但如果您有稍微复杂的测试,则必须在方法更改时传递测试信息,这会使它们变得不必要地复杂。@Test void test(TestInfo info) { complicatedValidation(info); } - Michael McCallum
@MichaelMcCallum 请看下面我的回答。 - zr0gravity7
请记住,testInfo.getDisplayName()将返回空格、特殊字符甚至表情符号。这是专门为IDE设计的。对于编程方法,需要添加一些正则表达式或在每个测试中使用@Display自定义名称。 - Miguel Ortiz

28

除了已经提到的将TestInfo注入到测试方法中之外,还可以将TestInfo注入到使用@BeforeEach@AfterEach注释的方法中,这有时可能会很有用:

@BeforeEach
void setUp(TestInfo testInfo) {
  log.info(String.format("test started: %s", testInfo.getDisplayName()));
}
@AfterEach
void tearDown(TestInfo testInfo) {
  log.info(String.format("test finished: %s", testInfo.getDisplayName()));
}

这对于我面临的情况非常有用,我们有一个基本测试类,每个其他测试都是从它继承的 - 在这里将TestInfo变量分配给实例方法意味着我们只需要在一个地方添加我们的修复! - Lorcan O'Neill
1
这似乎是我在这个问题上找到的最好、最干净的解决方案。 - Kajzer

7
在JUnit 4中,全局可用的测试名称的替代方案是使用TestInfo接口在设置方法中自行模拟该功能以实现。从JUnit文档中关于“构造函数和方法的依赖注入”: " TestInfo "然后可用于检索有关当前容器或测试的信息,例如显示名称、测试类、测试方法和相关标记。在此,我们利用内置解析程序将与当前容器或测试对应的TestInfo实例作为类型为TestInfo的参数值提供给生命周期钩子(这里使用@BeforeEach)注释的方法。
import org.junit.jupiter.api.TestInfo;

public class MyTestClass {
  String displayName;

  @BeforeEach
  void setUp(TestInfo testInfo) {
    displayName = testInfo.getDisplayName();
    // ... the rest of your setup
  }
}

这个例子可以让你在其他非测试方法(例如各种实用方法)中引用当前测试名称,而无需在从初始测试方法到该实用方法的每个函数调用中包含测试名称作为参数。
您可以对当前容器或测试的其他信息执行相同操作。
唯一的缺点似乎是:
  • 实例变量不能被设置为final,因为它是动态设置的。
  • 可能会污染您的设置代码。

作为参考,以下是如何在JUnit 4中实现TestName-Rule

public class MyTestClass {
  @Rule
  public final TestName name = new TestName();
}

0

这里已经覆盖了OP的问题,但为了完整起见,我在这里添加一个Baeldung article的链接,该文章涵盖了JUnit 5和JUnit 4中如何获取测试名称的主题,以防有人在寻找如何在JUnit 4中获取测试名称时偶然发现这个问题。

正如已经提到的那样,对于JUnit 5,可以利用TestInfo类,在测试方法或使用@BeforeEach注释的方法中将其实例作为参数注入。对于JUnit 4,则需要使用带有@Rule注释的TestName实例。此处链接的文章还涉及处理参数化测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接