【问题标题】:How to obtain test case name in JUnit 4 at runtime? [duplicate]如何在运行时获取 JUnit 4 中的测试用例名称? [复制]
【发布时间】:2010-11-07 08:30:33
【问题描述】:

我想在执行 JUnit 测试时做一些日志记录。在 JUnit 3.x 中,无论如何实例化测试用例,获取当前运行的测试用例的名称总是很容易:

public void testFoo() throws Exception() {
  String testName = this.getName();
  // [...] do some stuff
}

在 JUnit 4 中,事情似乎并不那么容易。有谁知道解决这个问题?是否有任何选项可以反映到当前的 Runner 实例中?

【问题讨论】:

标签: java reflection junit


【解决方案1】:

在 JUnit 4.7 中,您还可以获得当前执行的测试方法的名称。登录时可能会很好。

取自 JUnit 4.7 发行说明(阅读它们here at github):

public class NameRuleTest {
    @Rule public TestName name = new TestName();
    
    @Test public void testA() {
        assertEquals("testA", name.getMethodName());
    }
    
    @Test public void testB() {
        assertEquals("testB", name.getMethodName());
    }
}

【讨论】:

    【解决方案2】:

    好的。我发现了另一种方法 [在 Internet 上的某个地方](http://www.nabble.com/What-happened-to-getName()--td23456371.html):

        @RunWith(Interceptors.class) 
        public class NameTest { 
                @Interceptor public TestName name = new TestName(); 
    
                @Test public void funnyName() { 
                        assertEquals("funnyName", name.getMethodName()); 
                } 
        } 
    

    【讨论】:

    • 这似乎正是我正在寻找的方向。我明天试试看。
    • 不幸的是,这个解决方案只会在即将发布的 JUnit 4.7 最终版本中发布。同时,我不得不坚持使用包含在客户框架架构中的早期版本。但是,这是问题的最佳答案。
    • 这个拦截器类在哪里?我在 4.11 Javadoc 中没有看到它
    • @Peter 使用 Rule 注释的答案是 junit 现在的答案。
    【解决方案3】:
    public class FooTest {
        @Rule
        final public TestRule traceTestWatcher = new TestWatcher() {
            @Override
            protected void starting(Description d) {
                System.out.println(d);
            }
        };
    
        @Test
        public void testBar() {
            ...
        }
    
        @Test
        public void testBaz() {
            ...
        }
    }
    

    【讨论】:

      【解决方案4】:

      有什么问题:

      @Test
      public void foo() throws Exception() {
         String testName = this.getName();
         // [...] do some stuff
      }
      

      ?

      【讨论】:

      • 在 JUnit 4 中,测试类不再扩展通用框架类。所以没有继承方法 getName 了。
      • 好的。我仍然不明白 `this.getName() 是关于什么的。它与 this.getClass().getName() 有何不同? (我为你找到了另一个答案)
      • 在 JUnit 3 中,TestCase.getName() 返回测试方法的名称。当您运行 JUnit3 测试用例时,会创建测试类的多个实例,每个实例具有不同的名称。见junit.sourceforge.net/doc/cookstour/cookstour.htm
      【解决方案5】:

      我知道这是旧的,但这是一个有用的(非 junit)方法,我把它放在我所有测试的顶部。

      public static void printTestName(){
          final StackTraceElement[] ste = new Throwable().getStackTrace();
          int buffer = 35 - ste[1].getMethodName().length();
          System.out.println("*******************************************************");
          System.out.println("*            TEST:  " + ste[1].getMethodName() + getBuffer(buffer) + "*");
          System.out.println("*******************************************************");
      }
      
      private static String getBuffer(int offset){
          StringBuilder buffer = new StringBuilder("");
          for(int i = 1; i < offset; i++){
              buffer.append(" ");
          }
          return buffer.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 2011-05-31
        • 2011-12-09
        • 1970-01-01
        相关资源
        最近更新 更多