当前位置: 首页 > 面试题库 >

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

程鸿畅
2023-03-14
问题内容

目前,我正在阅读“ JUnit in action”一书。在这本书中,我发现以下内容:

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,我找到了一种对许多测试方法使用相同的变量计数的方法。

那么,如何看待书中所述方法的真正好处呢?


问题答案:

如何看书中所述方法的真正好处?

单独实例的目的不是为了任何好处,而是为了保持合同,即每个测试应独立执行而不会影响先前测试的执行。除了为每个测试使用不同的实例之外,没有其他方法可以确保此合同。

例如,Spring事务管理确保默认情况下回滚测试对数据库所做的所有更改,以维护相同的合同。

因此,通常不建议在测试中使用静态变量,因为这样做会破坏每个测试一个实例的整体目的,即为每个测试提供一个清晰的表述。



 类似资料:
  • 我有一个测试方法,看起来像: 并行工作使用可关闭的资源来控制生命周期,该资源在方法中关闭: 问题是:方法是在完成工作之前和等待超时到期之前调用的。 怎么可能?那我该怎么解决呢?

  • 问题内容: 我有一个测试套件,可以在其中退出系统并在中关闭浏览器。我尝试使用每种测试方法都使用Selenium拍摄失败的测试屏幕截图。我手动检查了它只在每个之前运行,但我想在它之前和之后进行设置。我找不到简单的解决方案。任何帮助将不胜感激。 我得到的输出是 问题答案: 由于规则的设置方式,因此不能有@before之后或@after之后的规则。您可以想到放在测试方法上的诸如shell之类的规则。要进

  • 所以我一直试图弄清楚类和实例在python中是如何工作的,并且一直在制作一个基于文本的游戏来尝试和第一手了解它。 我知道重复你的话通常意味着你做错了什么,但我就是不知道该怎么做。我的代码如下所示: desc是对房间的描述,command是用来访问房间的单词,secret是关于房间的额外信息,x和y是放置在xy轴上的房间 我一直在努力解决这个问题,因为我需要它来检查命令,看看它需要移动多少x和y空间

  • 问题内容: 在Selenium-webdriver中创建webdriver实例的最佳实践是什么?每个测试方法,每个测试类别或每个测试运行一次? 启动它们似乎相当(非常!)昂贵,但是在测试之间保持开放很可能会泄漏测试方法之间的信息。 还是有其他选择-单个webdriver实例是单个浏览器窗口(不包括弹出窗口),还是有一种方法可以从给定的驱动程序实例启动新窗口/会话? 谢谢马特 问题答案: 我发现在使

  • 问题内容: 使用Java(1.6)更好地在List上调用clear()方法还是重新实例化引用? 我有一个ArrayList,其中充满了未知数量的对象,并定期“刷新”-处理对象并清除列表。刷新后,列表将再次填充。刷新发生在随机时间。列表中的数字可能较小(10个对象)或较大(数百万个对象)。 那么,让“ flush”调用clear()或new ArrayList()更好吗? 甚至值得担心这种问题,还是

  • 问题内容: 从另一个问题中,我了解到在Java中 可以为Enum的每个实例定义特定的方法 : 让我感到惊讶的是,这甚至是可能的,每个实例专用的“专有方法”是否都有 名称 来查找文档? 另外, 应该如何使用 ?由于下一个未编译: 我应该如何使用这些“专有”方法? 问题答案: 您不能引用这些方法,因为您正在有效地为每个枚举创建匿名(*)类。由于它是匿名的,因此只能从匿名类本身内部或通过反射引用此类方法