【问题标题】:Should I use the same variables throught entire Unit Test?我应该在整个单元测试中使用相同的变量吗?
【发布时间】:2022-01-02 00:03:17
【问题描述】:

我在 Java 中创建单元测试,并为每个方法创建相同的列表、变量等。另一方面,我当然认为我可以将所有这些变量创建为全局变量并在setup() 方法(在@Before 中),但我不确定在运行测试时是否会因多线程等原因更改值。那么,这种情况下最好的方法是什么?

【问题讨论】:

  • 另外,如果可能的话,您可以考虑使用更新的 JUnit 5(“Jupiter”)。您的注释将是@BeforeEach@BeforeAll。它还支持嵌套测试类、参数化测试、扩展、@DisplayName("…") 等花哨的东西……它甚至允许您交换完整的测试引擎——如果需要的话。
  • 是的,我也认为当然可以使用@BeforeEach 和@BeforeAll。但是,我只需要澄清关于重用相同变量的单元测试约定(例如,只在 @BeforeEach OR @BeforeAll 中定义一次,清除 @AfterEach 上的变量。那么,什么是这种情况的正确方法吗?我认为这是一种非常普遍的情况,必须有一个通用的方法。有什么想法吗?

标签: java unit-testing testing junit junit5


【解决方案1】:

没什么好担心的。 JUnit 将创建您的测试类的一个新实例,然后运行每个@Before 方法,然后才运行@Test 方法,它会为每个@Test 注释的每个@Test 重新执行该歌曲和舞蹈例程该类中的方法。您完全按照预期使用@Before:它用于存储该测试类中所有测试所需的初始化代码。

JUnit 这样做是因为“测试独立性”很好:测试,最好是独立于执行它们的顺序而失败或通过。

init 进程经常非常昂贵,以至于不值得为每次测试支付一遍又一遍地运行它的“成本”。注释@BeforeClass 专门用于 目的。 @BeforeClass 的 javadoc 甚至指出这会损害测试独立性,因此只有在您在这种方法中进行的设置工作足够昂贵(计算或其他方式)以进行权衡时才应使用。

换句话说:

您对测试独立性的担忧是真实的,但它们适用于@BeforeClass@Before 没有这个问题;每次测试都会重新运行该代码。

注意:如果你有 static 的东西,你可以把所有这些都扔到窗外。除非您真的知道自己在做什么,否则不要在测试代码中使用静态内容。我假设在这种情况下你没有那个 - 继续,你的测试是独立的。

【讨论】:

  • 非常感谢,有没有显示正确用法的示例代码?
  • 我不明白@BeforeClass@Before 之间的区别。任何澄清请?
  • 所有带有@Before 的方法都在每个测试之前运行。所有带有@BeforeClass 的方法在任何测试之前只运行一次。通常,您将static 设置为@BeforeClass,然后再使用它们(因此,测试不再是独立的)。您使用@Before 设置非静态内容,因此测试是独立的。只需阅读这些注释的文档。
  • @BeforeClass (JUnit 5: @BeforeAll) 对整个测试类运行一次,@Before (JUnit 5: @BeforeEach) 在每个测试方法之前运行。
  • 不清除列表。听起来您也应该玩弄一下,因为显然 SO 答案对您来说还不够。这是一个很好的直觉!只需.. 进行一些测试,将一些元素添加到在@Before 中仅初始化一次的列表中,然后打印一些内容 - 不删除任何内容。然后简单地观察会发生什么。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2016-07-23
  • 2017-07-26
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多