如何在另一个测试类中重用现有的JUnit测试?

mnowg1ta  于 2023-10-20  发布在  其他
关注(0)|答案(5)|浏览(140)

如何在另一个测试类中重用JUnit测试?
举例来说:

public TestClass1 {
    @Test
    public void testSomething(){...}
}

public TestClass2 {
    @Test
    public void testSomethingAndSomethingElse() {
        // Somehow execute testSomething()
        // and then test something else
    }
}
snvhrwxg

snvhrwxg1#

一般来说,避免这种情况。它倾向于使测试更加脆弱。如果TestClass1失败,则TestClass2隐式失败,这至少是出于以下原因而不可取的:

  • 代码被多次测试,这浪费了执行时间。
  • 测试不应该相互依赖,它们应该尽可能地解耦
  • 如果这成为一种模式,那么通过查看哪些测试失败来识别代码的哪个部分被破坏将变得更加困难,这是测试的一部分

偶尔共享测试代码部分是有用的,特别是对于集成测试。以下是您可以在不依赖于测试本身的情况下如何做到这一点:

public abstract BaseTests {

    protected void somethingHelper() {
        // Test something
    }
}

public TestClass1 extends BaseTests {
    @Test
    public void testSomething(){
        somethingHelper();
    }
}

public TestClass2 extends BaseTests {
    @Test
    public void testSomethingAndSomethingElse() {
        somethingHelper();
        // and then test something else
    }
}

或者,你可以使用一个助手类,完全避免继承。Assert和类似的东西可以放在somethingHelper()方法中。
不要直接在TestClass2中调用TestClass1的方法。这样测试用例的可读性会降低,并可能导致spaghetti frittata

tkclm6bt

tkclm6bt2#

像往常一样,你可以:
1.从TestClass1扩展TestClass2
1.使用委派从TestClass2访问TestClass1
例一:

// Instantiate TestClass1 inside test method
public TestClass2 {
    public void testSomethingAndSomethingElse1() {
         new TestClass1().testSomething();
    }
}

例二:

// Instantiate TestClass1 as a member of TestClass2
public TestClass2 {
    private TestClass1 one = new TestClass1();
    public void testSomethingAndSomethingElse1() {
         one.testSomething();
    }
}
xe55xuns

xe55xuns3#

这在使用不同的配置运行测试时很常见。别担心,继续吧。
在第一步中,创建您自己的测试,而不考虑任何配置:

public abstract BaseTests {
    @Test
    protected void somethingHelper() {
        // Test something
    }
}

然后,扩展测试类并添加一些配置:

public TestClass1 extends BaseTests {
    @Before
    public void setup(){
         // TODO: config
    }
}

不需要进行特定的配置,但这在可配置系统中非常常见(系统的主要功能必须对每个配置有效)。
在另一个测试用例中:

public TestClass2 extends BaseTests {
    @Before
    public void setup(){
         // TODO: other config
    }
}

例如,可能存在加密和解密过程,其中必须识别加密>解密的序列。另一方面,当测试过程是唯一的时,有不同的算法要使用。

zzlelutf

zzlelutf4#

从逻辑上讲,没有理由从一个测试方法调用另一个测试方法。任何运行一个测试的工具都可以轻松地运行包中的所有测试。但如果需要,可以像调用其他类中的其他方法一样调用它。
您最可能要做的是为这两种测试方法执行一些通用设置。您可以将that代码放在公共类的实用方法中,并在两个测试中调用公共代码。

yzuktlbb

yzuktlbb5#

根据以上所有答案,扩展类主要在父类具有Autowired依赖项时起作用。
接下来,不要忘记将@Disabled添加到父类中。这将确保您的测试只运行一次。扩展测试类时,首先运行所有父测试用例,然后运行子类测试。这就造成了口是心非。将@Disabled添加到父类不会直接运行父类测试用例。这些测试用例将在子类测试用例运行时运行。

相关问题