【问题标题】:Which runner for testing with hamcrest哪个跑步者用 hamcrest 进行测试
【发布时间】:2018-01-15 20:10:00
【问题描述】:

从我的教授那里,我得到了一个类似这样的测试文件:

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;

public class SomeObjectTest {

    @Test
    public void testIstPalindrom() {
        SomeObject obj = new SomeObject();

        assertThat("MSG 1", obj.someFunction(" "), is(equalTo(true)));
        assertThat("MSG 2", obj.someFunction("A"), is(equalTo(true)));
        assertThat("MSG 2", obj.someFunction("B"), is(equalTo(false)));
    }
}

由于我从未使用过hamcrest,我现在有点困惑。通常我只会对每个Test 使用一个assert 调用。我使用以下命令编译并运行此测试:

javac -cp ".;hamcrest-all-1.3.jar;junit-jupiter-api-5.1.0.jar" SomeObjectTest.java
java  -cp ".;hamcrest-all-1.3.jar;junit-jupiter-api-5.1.0.jar;junit-4.12.jar;" org.junit.runner.JUnitCore SomeObjectTest

当我运行这个测试时,如果只有一个 assert 调用失败,它也会失败。这是因为他们都在一个测试中,还是我应该在这里使用另一个测试运行器?

【问题讨论】:

    标签: java unit-testing junit hamcrest


    【解决方案1】:

    JUnit 测试方法在该方法中第一个失败的断言上失败。 assert 方法会抛出一个java.lang.AssertionError,它会中止方法的执行。异常被测试夹具捕获并报告。

    【讨论】:

      【解决方案2】:

      通常我只会对每个测试使用一个断言调用

      测试方法并非旨在执行总是 一个断言。
      相反,它必须执行尽可能多的断言来验证验收测试,即预期的方法行为。
      它可能是一个,但也可能是更多个断言。
      如果在测试特定案例时使断言独立更有意义,您应该创建多个测试方法:

      @Test
      public void someFunction_with_no_character() {
          SomeObject obj = new SomeObject();
          assertThat("MSG 1", obj.someFunction(" "), is(equalTo(true)));
      }
      
      @Test
      public void someFunction_with_A_character() {
          SomeObject obj = new SomeObject();
          assertThat("MSG 2", obj.someFunction("A"), is(equalTo(true)));
      }
      
      @Test
      public void someFunction_with_B_character() {
          SomeObject obj = new SomeObject();
          assertThat("MSG 2", obj.someFunction("B"), is(equalTo(false)));
      }
      

      当我运行这个测试时,如果只有一个断言调用失败,它也会失败

      当一个断言失败时,测试方法不会更进一步并传递给下一个测试方法(如果存在)。
      所以实际行为是正常的。
      无论如何,您只使用 JUnit,或者将它与 Harmcrest 或任何测试匹配器 API 混合使用,测试方法总是以这种方式设计的。

      这是因为它们都在一个测试中还是我应该使用 另一个测试运行器在这里?

      其实你用的是JUnit Jupiter引擎,没问题。
      事实上,Harmcrest 和更普遍的测试匹配器库不使用特定的测试运行器。
      这些库不执行测试,它们是helpers,提供以更流畅/更有意义的方式进行断言的功能。
      就个人而言,我更喜欢 AssertJ,而不是使用更友好的 Harmcrest。

      【讨论】:

      • @aetheria 我不这么认为。一般来说,这个想法是通过场景来测试方法,而不是通过没有意义的断言来测试方法。
      • @Downvoter 请不要对正确答案投反对票,因为这对访问该帖子的 OP 和其他用户没有帮助。如果您认为答案在客观上很糟糕并且没有正确回答问题,请注意解释。
      • 您好,我认为令人沮丧的人可能认为问题与测试模式有关。例如:测试中有多少个断言?何时在测试中使用多个断言?
      • @holi-java op 提到了这些问题,我想我会回答它们。
      • 也许你是对的,但我认为问题在于如何编写 op 想要的测试。在这种情况下,操作员似乎应该为每个assert 编写单独的@Test 并使用固定装置来共享公共代码,因为它们每个都检查指定的情况并独立。换句话说,操作者希望查看所有失败的测试,而不是只查看一个失败的测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2021-08-06
      • 2012-01-26
      • 2013-03-10
      相关资源
      最近更新 更多