【问题标题】:Combine two jUnit test cases into one将两个 jUnit 测试用例合二为一
【发布时间】:2017-09-28 17:03:44
【问题描述】:

我有以下两个junit测试用例:

@Test(expected=NullPointerException.class,timeout=2000)
public void X1()
{
    abc.xyz(null);
    fail("Car xyz() should throw NullPointerException when adding null items");
}

@Test(expected=NullPointerException.class,timeout=2000)
public void Y1()
{
    abc.pqr(null);
    fail("Car pqr() should throw NullPointerException when adding null items");
}

我想将以上两个测试用例合二为一。我该怎么办?

【问题讨论】:

    标签: java eclipse junit junit4 testcase


    【解决方案1】:

    真的不想将这些案例合二为一。他们正在测试完全不同的东西

    在您的第一个测试中,您使用null 测试xyz 的结果。在您的第二个中,您正在使用null 测试pqr。如果您想检查它们的边界条件,这两个测试都可以编写和使用。

    如果任一方法的行为发生变化,在此方案中,您只需重写一个测试。也就是说,如果pqr 突然变得容空,并且你在一个测试中将它们混合在一起,你仍然会因为xyz 不容空而导致测试失败。

    将这些分开。您既不想也不需要将这些测试用例组合在一起。

    【讨论】:

    • 我知道,我已经考虑过你提到的事情,但是我工作的组织希望我将测试用例合并为一个。我似乎别无选择:我
    • 测试这些东西的重点是单独测试它们。通过将这两者结合起来,您将面临测试脆弱和重构时信心不足的风险。将这些结合起来是一个错误,我不能说得足够强烈。虽然将它们组合起来很容易,但您想要这样做。
    • 组织为什么要合并它们?与@Makato 的回答相比,有什么好处/理由?
    • 我知道将它们组合起来没有任何用处,只是它对我的要求。你能帮我把它们组合起来吗?
    【解决方案2】:

    使用属性expected 是一个非常弱的解决方案,因为您无法控制方法的哪条指令将引发异常。

    即使我不明白加入他们的原因......这里有一些解决方案:

    JUNIT4

    @Test
    public void xyzAndPqr(){
    
      try {
        abc.pqr(null);
        fail("pqr does not throw NullPointerException");
      } catch(NullPointerException npe) {};
    
      try {
        abc.xyz(null);
        fail("xyz does not throw NullPointerException");
      } catch(NullPointerException npe) {};
    
    }
    

    注意:catch 只接受 NullPointerException,因此如果方法抛出其他类型的异常,则测试正确失败

    注意 1:在 catch 子句中,您可以检查其他条件(消息、原因等)

    注意2:测试在第一个不正确的方法上失败,而不检查其余方法。要始终检查所有方法,您可以使用 Collector Rule 。

    JUNIT5

    import static org.junit.jupiter.api.Assertions.*;
    @Test
    public void xyzAndPqr(){
       assertThrows(NullPointerException.class, () -> abc.pqr(null));
       assertThrows(NullPointerException.class, () -> abc.xyz(null));
    }
    

    注意:如果您需要检查其他条件(消息、原因等),assertThrows 返回有效引发的 Throwable

    注意1:测试在第一个不正确的方法上失败,而不检查其余方法。要始终检查所有方法,您可以使用 AssertAll 。

    import static org.junit.jupiter.api.Assertions.*;
    @Test
    public void xyzAndPqr(){
      AssertAll(
       () -> assertThrows(NullPointerException.class, () -> abc.pqr(null)),
       () -> assertThrows(NullPointerException.class, () -> abc.xyz(null))
      );
    }   
    

    带有 AssertJ 的 JUNIT(4 和 5) (见http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

    import static org.assertj.core.api.Assertions.*;
    @Test
    public void xyzAndPqr(){
       assertThatNullPointerException().isThrownBy( () -> abc.pqr(null) );
       assertThatNullPointerException().isThrownBy( () -> abc.xyz(null) );
    }
    

    注意:您可以在 assertJ 中使用流畅的语法:例如添加 .withMessage("...")

    注意1:测试在第一个不正确的方法上失败,而不检查其余方法。要始终检查所有方法,您可以使用 AssertAll(如果在 JUnit5 中)或 assertJ 软断言(在这两种情况下)

    【讨论】:

      【解决方案3】:

      同意 Makoto 的观点,这样做非常糟糕,并且违背了任何最佳实践。同样值得怀疑的是,为什么您的组织会关心单元测试的这种低水平实现......无论如何......

      @Test
      public void xyzAndPqr(){
      
      Throwable thrown;
      try{
         abc.pqr(null);
      catch(Throwable e){
         thrown = e;
      }
      
        //assert thrown
      assertThat(thrown,instanceOf(NullPointerException.class));
      //assert anything else, null var or create another...
      thrown = null;
      
      try{
          abc.xyz(null);
      catch(Throwable e){
         thrown = e;
      }
      
      assertThat(thrown,instanceOf(NullPointerException.class));
      //assert anything else
      

      如果需要,它们的公共库中还有一些 Apache ExceptionUtils 来获取消息等。

      如果您使用的是 Java8,AssertJ 库可以处理得更干净一些,

      http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

        assertThatNullPointerException().isThrownBy(() -> {   abc.pqr(null); })
        assertThatNullPointerException().isThrownBy(() -> {   abc.xyz(null); })
      

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 2013-04-08
        • 2015-12-30
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多