JUnit的:调用每一个@Test方法之前新的实例。 有什么好处?(JUnit: new ins

2019-07-17 12:26发布

目前,我正在读“行动中的JUnit”的书。 在这本书中,我发现下面的文字:

JUnit的调用每个@Test方法之前创建测试类的新实例。 这有助于测试方法之间提供独立,避免了测试代码无意的副作用。 由于每个测试方法上的一个新的测试类实例运行,我们不能在测试方法重复使用实例变量的值。

现在,我看不出这种方法多点:

例如:

public class CalculatorTest {
    @Test
    public void testAdd_1() {
        Calculator calculator = new Calculator();
        double result = calculator.add(1, 1);
        assertEquals(2, result, 0);
    }

    @Test
    public void testAdd_2() {
        Calculator calculator = new Calculator();
        double result = calculator.add(2, 2);
        assertEquals(4, result, 0);
    }
}

对于测试类CalculatorTest没有任何好处。

好吧,让我们去注意的另外一个例子:

public class OneTest {

    static byte count;

    public OneTest() {
        count++;
    }

    @Test
    public void test1() {
        System.out.println(count);
    }

    @Test
    public void test2() {
        System.out.println(count);
    }
}

对于测试类OneTest我找到了一种方法来使用相同的变量数为众多测试方法...

那么,如何看到书中描述的方法的真正好处?

Answer 1:

如何看到在书中描述的方法的真正好处?

单独的实例的目的不是用于但要保持每一个测试应当毫不以前的测试的执行的任何影响被独立地执行合同的任何益处。 只是有没有其他的办法,以确保本合同不是使用一个不同的实例为每个测试等。

例如,Spring事务管理确保回滚通过测试在默认情况下对数据库进行的,所有的变化,以保持相同的合同。

因此,在测试使用静态变量一般不提倡,因为它会打败一个实例,每个测试的整个目的有一个干净的石板为每个测试。



Answer 2:

保持状态干净的测试方法之间是很有用的单元测试,但在方式得到了功能测试,在测试之间有依赖关系往往是必要的(例如,当您正在测试使用Selenium网页,是非常有用的没有打扰的运行测试某一页,如果登录页面的测试失败)。

这就是为什么我创建的主要原因之一TestNG的 ,它不会实例每个方法之间的一类新的,所以给你的选择,而不是你强加这个决定。

TestNG的还支持测试,多线程测试的依赖,有组的概念(“只运行Servlet测试”)和更多的功能。



Answer 3:

如果你正在测试一个可变类,还有在每个测试方法的开始具有已知状态的测试对象是伟大的价值,从而使测试执行的顺序并不重要。 实现这个最简单的方法是创建一个类为每个测试的新实例,并避免静态字段。

在你的计算器例子中,我们发现您的Calculator类是不可变和方法调用的结果,仅在参数依赖。 所以一个测试影响的另一个风险是不存在。

我不太看你的第二个示例的重点。 你写的注释为方法@Test使用共享静态字段,但是你的方法没有断言,并没有真正测试什么。

如果你想要做的使用静态字段或确实守住和被测重复使用类的一个实例,它肯定能够如此,而是为了让自己的测试工作,并保持相互独立往往会需要更多的照顾。



文章来源: JUnit: new instance before invoking each @Test method. What are the benefits?