【问题标题】:How to link @BeforeEach method with specific @Test methods (Java, JUnit)如何将@BeforeEach 方法与特定的@Test 方法(Java、JUnit)链接起来
【发布时间】:2020-12-17 14:36:04
【问题描述】:

例如,我们有 2 个类:BaseTest 和 Test。测试扩展了 BaseTest。

BaseTest.class 包含 2 个带有 @BeforeEach 注释的方法。

@BeforeEach
  void setUp1() {}

@BeforeEach
  void setUp2() {}

Test.class 包含 2 个带有 @Test 注释的方法。

@Test
  void test1() {}

@Test
  void test2() {}

有没有办法将@BeforeEach 方法与@Test 方法联系起来,这样setup1() 将只在test1() 之前运行,而setup2() 将只在test2() 之前运行?

【问题讨论】:

    标签: java junit qa web-api-testing


    【解决方案1】:

    一个明显的非回答:不要那样做!

    单元测试的目的是帮助您快速识别生产代码中的缺陷。因此,一个基本规则是:保持一个非常简单的结构。

    良好单元测试的一个方面是:您查看测试方法,就知道发生了什么。如果有的话,您必须滚动到上面的某个 setUp() 方法(同一个文件!)才能查看发生了什么。

    您打算做的事情要求未来的读者不仅要了解该基类,还必须了解使用不同机制的一些复杂逻辑 per 测试方法。

    所以,是的,避免代码重复对于单元测试也很重要。但是您可以通过应用与生产代码相同的模式来避免“到达那里”。

    【讨论】:

    • 另外,我想说不要陷入生产代码中的类需要 1:1 映射到测试代码中的类的想法。看起来您的问题可能会通过拥有两个单独的测试类来解决,每个测试类都有自己的 @BeforeEach 仅与该类中的测试相关。
    • 我是 qa 并且想将此技术用于后端 api 测试,而不是单元测试。
    • 我认为这可能仍然适用,尽管没有关于 1:1 映射的评论。更多、更小的类总是比更少更复杂的类更好。
    【解决方案2】:

    您不能真正做到这一点,但您可以将测试用例与 @Nested 类捆绑在一起。

    public class Test {
    
    
        @BeforeEach
        void setUpForAll() {}
    
        @Nested
        class TestCasesWithPrecondition1{
    
            @BeforeEach
            void setUp1() {}
            
            @Test
            void test1() {}
        }
    
        @Nested
        class TestCasesWithPrecondition2{
    
            @BeforeEach
            void setUp2() {}
    
            @Test
            void test2() {}
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2018-09-01
      • 2016-10-18
      相关资源
      最近更新 更多