【问题标题】:Junit test to fail without failure traceJunit 测试失败,没有失败跟踪
【发布时间】:2015-05-22 18:41:51
【问题描述】:

我正在从 Eclipse 运行 JUnit 测试,并且每当我想要导致测试失败时都使用命令 Assert.fail(message)。问题是我总是得到消息以及整个故障跟踪。 JUnit 有没有办法只显示消息,而不显示堆栈跟踪?

【问题讨论】:

  • 如何运行测试? Maven、Eclipse、独立的 JUnit 运行器?
  • 我正在使用来自 Eclipse 的测试套件

标签: java eclipse junit


【解决方案1】:

可通过 Window --> Preferences --> Java --> Junit 获得的 Eclipse JUnit 设置 允许切割某些异常类的堆栈跟踪:

使用这些设置,测试的堆栈跟踪:

@Test
public void test() {
    fail("Not yet implemented");
}

被过滤:

现在尝试取消选择“org.junit.*”(或“junit.framework.Assert”,具体取决于您使用的 JUnit 版本),然后重新运行测试。堆栈跟踪立即变得可怕:

也许这是您正在寻找的功能。

【讨论】:

    【解决方案2】:

    如果测试抛出错误,测试通常会自动失败且不显示任何消息。您当然可以捕获异常并在 catch 子句中让测试失败。像这样的:

    @Test
    public void test()  {
       try {
          // your test
      } catch (Exception e) {
          fail("I caught an " + e.class.getSimpleName());
       }
    }
    

    当然,在处理异常时,要尽可能准确。

    【讨论】:

    • 如果测试抛出异常,那么我确实希望它会因异常数据以及可能的堆栈跟踪而失败。但是,如果我试图强制测试失败(例如由于扭曲结果),使用 Assert.fail(message),我想要的只是让测试在失败跟踪中显示该消息
    • 那么我关于捕获异常的建议应该有效。我添加了一个例子来说明我的意思。
    • 这似乎给了我与 Assert.fail() 相同的行为。我仍然看到报告消息后的跟踪
    • @n00bprogrammer 你在代码中的任何地方都有e.printStackTrace() 之类的东西吗?似乎不是测试运行器正在写入输出。
    【解决方案3】:

    我找到了一种方法来使测试崩溃而不会显示很长的失败跟踪。我没有使用 Assert.fail(),而是创建了自己的异常,并将失败跟踪设置为最小:

    public static void failTest(String message) throws MyTestFailure {
        System.err.println(message);
        MyTestFailure exception = new MyTestFailure(message);
        StackTraceElement elem = new StackTraceElement("com.my.package.Utils", "failTest", "failTest", 3);
        StackTraceElement elem1[] = new StackTraceElement[1];
        elem1[0] = elem;
        exception.setStackTrace(elem1);
        throw exception;
    }
    

    这样我只打印我想要打印的消息,然后是一行

    【讨论】:

      【解决方案4】:

      我会简单地为我的自定义 Throwable 覆盖 printStackTrace() 方法:

      • 异常 -> 错误

      • AssertionError -> 失败

      import java.io.PrintStream;
      import java.io.PrintWriter;
      
      public class TestErrorException extends Exception{
      
          private static final long serialVersionUID = -3486394019411535690L;
          private String message;
      
          public TestErrorException(String message) {
              this.message = message;
          }
      
          @Override
          public void printStackTrace() {
              System.err.println(message);
          }
      
          @Override
          public void printStackTrace(PrintStream s) {
              s.println(message);
          }
      
          @Override
          public void printStackTrace(PrintWriter s) {
              s.println(message);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-03-04
        • 1970-01-01
        • 2012-09-03
        • 2011-03-29
        • 2019-05-02
        • 2015-07-04
        • 2016-04-01
        • 2013-03-10
        • 2021-08-27
        相关资源
        最近更新 更多