39

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

例如:

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

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

4 回答 4

43

一般来说,避免这种情况。它很容易使测试变得更加脆弱。如果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
    }
}

或者,您可以使用辅助类并完全避免继承。断言等可以进入该somethingHelper()方法。

不要直接从TestClass1in调用方法TestClass2。测试用例以这种方式变得不那么可读,并且可能导致意大利面条菜肉馅煎蛋饼

于 2013-06-17T09:55:01.683 回答
13

像往常一样,您可以:

  1. 延伸TestClass2TestClass1
  2. TestClass1使用委托访问TestClass2

示例 1:

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

示例 2:

// Instantiate TestClass1 as a member of TestClass2
public TestClass2 {
    private TestClass1 one = new TestClass1();
    public void testSomethingAndSomethingElse1() {
         one.testSomething();
    }
}
于 2013-06-17T09:54:45.820 回答
4

这对于使用不同配置运行测试很常见。不要担心,继续前进。

第一步创建您自己的测试而不考虑任何配置:

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
    }
}

例如,可能有一个加密和解密过程,其中必须识别加密>解密的顺序。另一方面,当测试过程是独特的时,可以使用不同的算法。

于 2018-08-15T12:18:08.590 回答
0

从逻辑上讲,没有理由从另一种测试方法中调用一种测试方法。运行一个测试的任何工具都可以轻松地执行包中的所有测试。但是如果需要,您可以像在任何其他类中的任何其他方法一样调用它。

您最可能想要做的是为两种测试方法执行一些通用设置。您可以将that代码放在公共类的实用程序方法中,并在两个测试中调用公共代码。

于 2013-06-17T09:52:44.577 回答