【问题标题】:Placement of success and failure test cases of the same method放置相同方法的成功和失败测试用例
【发布时间】:2012-11-02 17:00:58
【问题描述】:

假设我有一个名为foo 的方法,对于某些输入值集,预期会成功完成并返回结果,而对于其他一些值集,预期会引发特定异常。此方法需要先进行一些设置,然后才能对其进行测试。

考虑到这些条件,最好将成功和失败测试集中在一个测试中,还是应该在单独的测试方法中维护这些案例?

换句话说,以下两种方法中哪一种更可取?

方法一:

@Test
public void testFoo() {
  setUpThings();
  // testing success case
  assertEquals(foo(s), y);
  // testing failure case
  try {
    foo(f);
    fail("Expected an exception.")
  } catch (FooException ex) {
  }
}

方法2:

@Test
public void testFooSuccess() {
  setUpThings();
  assertEquals(foo(s), y);
}

@Test
public void testFooFailure() {
  setUpThings();
  try {
    foo(f);
    fail("Expected an exception.")
  } catch (FooException ex) {
  }
}

【问题讨论】:

    标签: java unit-testing testing junit


    【解决方案1】:

    最好采用方法 #2。

    为什么:

    好吧,当断言失败时,不会评估该方法的其余部分... 因此,通过将测试放在 2 个单独的方法中,您可以确保至少执行这两个测试.. 失败与否。

    单元测试不仅应该关注一个特定的单元,还应该关注该单元的一个特定行为。一次测试多种行为只会使水变得混乱。 花时间将每个行为分成自己的单元测试。

    【讨论】:

      【解决方案2】:

      方法 3(2 的扩展)

      @Before
      public void setUpThings() {
        ...
      }
      
      @Test
      public void testFooSuccess() {
        assertEquals(foo(s), y);
      }
      
      @Test(expected=FooException.class)
      public void testFooFailure() {
        foo(f);
      }
      

      我很高兴有一次只针对一个条件进行的集中测试,因此失败的测试只能意味着一件事(方法 2)。如果它们都使用相同的设置,您可以将其移至通用设置方法 (@Before)。如果没有,也许最好考虑将相关案例分成不同的类,这样您不仅有更多关注的案例(方法),还有更多关注的固定装置(类)。

      【讨论】:

      • 我不需要在 all 测试之前致电setUpThings。 :)
      • 您需要在同一个班级进行所有测试吗?或许在不同的类中将具有不同特征(如设置方法)的那些分开是很好的。
      • 每个方法一个类听起来不太好。这是一种常见的做法吗?
      • 视情况而定。我在这门课上至少看到三个。
      【解决方案3】:

      我喜欢方法#2。单独测试更好。

      我不喜欢你做测试 2 的方式。我会这样做:

      @Test(expected = FooException.class)
      public void testFooFailure() {
        setUpThings();
        foo(f);
      }
      

      【讨论】:

      • 感谢您的意见。关于@Test(expected ...,我知道这一点,但由于某种原因,我的构建工具(gradle)无法正常工作(即测试总是失败),所以我做错了......手动。
      【解决方案4】:

      对我来说,方法 2 更可取。因为您首先测试快乐路径然后失败条件。 如果有人需要测试快乐的场景,只有你会拥有它。

      【讨论】:

        【解决方案5】:

        单独的测试用例更好有两个原因:

        1. 你的测试用例应该是原子的
        2. 如果第一个断言条件失败,则不会评估第二个。

        【讨论】:

          猜你喜欢
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 2019-03-13
          相关资源
          最近更新 更多