java test教學 - 獲取JUnit 4中當前正在執行的測試的名稱




6 Answers

JUnit 4.7使用TestName-Rule添加了這個特性。 看起來像這會讓你的方法名稱:

import org.junit.Rule;

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());
    }
}
example tutorial

在JUnit 3中,我可以像這樣獲取當前正在運行的測試的名稱:

public class MyTest extends TestCase
{
    public void testSomething()
    {
        System.out.println("Current test is " + getName());
        ...
    }
}

這將打印“當前測試是測試的東西”。

在JUnit 4中是否有任何即裝即用或簡單的方法?

背景:顯然,我不想僅打印測試的名稱。 我想加載存儲在與測試同名的資源中的特定於測試的數據。 你知道, 通過配置和所有這一切。

謝謝!




考慮使用SLF4J(Simple Logging Facade for Java)使用參數化消息提供了一些簡潔的改進。 將SLF4J與JUnit 4規則實現相結合可以提供更高效的測試類記錄技術。

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.rules.TestWatchman;
import org.junit.runners.model.FrameworkMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingTest {

  @Rule public MethodRule watchman = new TestWatchman() {
    public void starting(FrameworkMethod method) {
      logger.info("{} being run...", method.getName());
    }
  };

  final Logger logger =
    LoggerFactory.getLogger(LoggingTest.class);

  @Test
  public void testA() {

  }

  @Test
  public void testB() {

  }
}



試試這個:

public class MyTest {
        @Rule
        public TestName testName = new TestName();

        @Rule
        public TestWatcher testWatcher = new TestWatcher() {
            @Override
            protected void starting(final Description description) {
                String methodName = description.getMethodName();
                String className = description.getClassName();
                className = className.substring(className.lastIndexOf('.') + 1);
                System.err.println("Starting JUnit-test: " + className + " " + methodName);
            }
        };

        @Test
        public void testA() {
                assertEquals("testA", testName.getMethodName());
        }

        @Test
        public void testB() {
                assertEquals("testB", testName.getMethodName());
        }
}

輸出如下所示:

Starting JUnit-test: MyTest testA
Starting JUnit-test: MyTest testB

注意:如果您的測試是TestCase的一個子類,這不起作用! 測試運行,但@Rule代碼從未運行。




String testName = null;
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for (int i = trace.length - 1; i > 0; --i) {
    StackTraceElement ste = trace[i];
    try {
        Class<?> cls = Class.forName(ste.getClassName());
        Method method = cls.getDeclaredMethod(ste.getMethodName());
        Test annotation = method.getAnnotation(Test.class);
        if (annotation != null) {
            testName = ste.getClassName() + "." + ste.getMethodName();
            break;
        }
    } catch (ClassNotFoundException e) {
    } catch (NoSuchMethodException e) {
    } catch (SecurityException e) {
    }
}



@ClassRule
public static TestRule watchman = new TestWatcher() {
    @Override
    protected void starting( final Description description ) {
        String mN = description.getMethodName();
        if ( mN == null ) {
            mN = "setUpBeforeClass..";
        }

        final String s = StringTools.toString( "starting..JUnit-Test: %s.%s", description.getClassName(), mN );
        System.err.println( s );
    }
};



我建議你從測試數據集中分離測試方法名稱。 我將建模一個DataLoaderFactory類,它從您的資源加載/緩存測試數據集,然後在您的測試案例中調用一些接口方法,該方法返回測試用例的一組測試數據。 將測試數據綁定到測試方法名稱假設測試數據只能使用一次,在大多數情況下,我建議使用多個測試中使用的相同測試數據來驗證業務邏輯的各個方面。




Related