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

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

例如:

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

像往常一样,你可以:

  1. TestClass1扩展TestClass1
  2. 使用委托从TestClass2访问TestClass1

例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(); } } 

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

或者,您可以使用帮助程序类并完全避免inheritance。 断言等可以在somethingHelper()方法中进行。

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

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

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

这通常用于运行具有不同配置的测试。 不要担心,继续。

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

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

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

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

没有必要进行特定配置,但它在可配置系统中非常常见(系统的主要function必须对每个配置有效)。

在另一个测试用例中:

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

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