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

tk2*_*000 31 java junit unit-testing

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

例如:

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

public TestClass2 {
    @Test
    public void testSomethingAndSomethingElse() {
        // Somehow execute testSomething()
        // and then test something else
    }
}
Run Code Online (Sandbox Code Playgroud)

sea*_*ges 36

一般来说,避免这种情况.它很容易使测试更加脆弱.如果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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你说的单元测试案例是正确的.那些子场景依赖于父场景并且每个兄弟姐妹彼此独立的集成或功能测试案例呢? (2认同)

Ale*_*exR 9

像往常一样,你可以:

  1. 延伸TestClass2TestClass1
  2. 访问TestClass1TestClass2使用授权:

例1:

// Instantiate TestClass1 inside test method
public TestClass2 {
    public void testSomethingAndSomethingElse1() {
         new TestClass1().testSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

例2:

// Instantiate TestClass1 as a member of TestClass2
public TestClass2 {
    private TestClass1 one = new TestClass1();
    public void testSomethingAndSomethingElse1() {
         one.testSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)


Mos*_*afa 5

使用不同的配置运行测试是很常见的。不要担心,继续吧。

第一步创建您自己的测试,无需考虑任何配置:

public abstract BaseTests {
    @Test
    protected void somethingHelper() {
        // Test something
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public TestClass1 extends BaseTests {
    @Before
    public void setup(){
         // TODO: config
    }
}
Run Code Online (Sandbox Code Playgroud)

没有必要进行特定的配置,但这对于可配置的系统来说很常见(系统的主要功能必须对每个配置都有效)。

在另一个测试用例中:

public TestClass2 extends BaseTests {
    @Before
    public void setup(){
         // TODO: other config
    }
}
Run Code Online (Sandbox Code Playgroud)

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