[java] 獲取JUnit 4中當前正在執行的測試的名稱



Answers

JUnit 4.9.x和更高版本

從JUnit 4.9開始, TestWatchman類已被棄用,以支持具有調用的TestWatcher類:

@Rule
public TestRule watcher = new TestWatcher() {
   protected void starting(Description description) {
      System.out.println("Starting test: " + description.getMethodName());
   }
};

JUnit 4.7.x - 4.8.x

以下方法將打印類中所有測試的方法名稱:

@Rule
public MethodRule watchman = new TestWatchman() {
   public void starting(FrameworkMethod method) {
      System.out.println("Starting test: " + method.getName());
   }
};
Question

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

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

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

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

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

謝謝!




基於之前的評論,並進一步考慮我創建了TestWather的擴展,您可以在您的JUnit測試方法中使用此擴展:

private static final Logger LOGGER = Logger.getLogger(ImportUtilsTest.class);   
@Rule
public TestWatcher testWatcher = new JUnitHelper(LOGGER);

下一個測試助手類是:

public class JUnitHelper extends TestWatcher {
private Logger LOGGER;

public JUnitHelper(Logger LOGGER) {
    this.LOGGER = LOGGER;
}

@Override
protected void starting(final Description description) {
    LOGGER.info("STARTED " + description.getMethodName());
}

@Override
protected void succeeded(Description description) {
    LOGGER.info("SUCCESSFUL " + description.getMethodName());
}

@Override
protected void failed(Throwable e, Description description) {
    LOGGER.error("FAILURE " + description.getMethodName());
}
}

請享用!




JUnit 5中有依賴注入,它簡化了提供給測試方法的元數據。 例如:

@Test
@DisplayName("This is my test")
@Tag("It is my tag")
void test1(TestInfo testInfo) {
    assertEquals("This is my test", testInfo.getDisplayName());
    assertTrue(testInfo.getTags().contains("It is my tag"));
}

查看更多: JUnit 5用戶指南TestInfo javadoc




對於測試用例來說,JUnit 4沒有任何開箱即用的機制來獲取它自己的名字(包括在安裝和拆卸過程中)。




您可以使用Slf4jTestWatcher來實現此TestWatcher

private static Logger _log = LoggerFactory.getLogger(SampleTest.class.getName());

@Rule
public TestWatcher watchman = new TestWatcher() {
    @Override
    public void starting(final Description method) {
        _log.info("being run..." + method.getMethodName());
    }
};



複雜的方法是通過繼承org.junit.runners.BlockJUnit4ClassRunner來創建自己的Runner。

然後你可以做這樣的事情:

public class NameAwareRunner extends BlockJUnit4ClassRunner {

    public NameAwareRunner(Class<?> aClass) throws InitializationError {
        super(aClass);
    }

    @Override
    protected Statement methodBlock(FrameworkMethod frameworkMethod) {
        System.err.println(frameworkMethod.getName());
        return super.methodBlock(frameworkMethod);
    }
}

然後對於每個測試類,您需要添加@RunWith(NameAwareRunner.class)註釋。 或者,如果您不想每次都記住它,則可以將該註釋放在Test超類上。 這當然會限制你對選手的選擇,但這可能是可以接受的。

此外,可能需要一點功夫才能將當前的測試名稱從Runner中移出並放入框架中,但這至少可以讓您獲得名稱。




Related