首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JUnit 4 獲取測試類與方法名稱:TestName Rule 實戰

     編輯:Java 相關知識

需求背景

測試執行時動態獲取當前測試類名與方法名,用於:

  • 日誌標記:[UserServiceTest#testLogin] 開始測試
  • 截圖/報表命名:UserServiceTest_testLogin_failure.png
  • 資料隔離:以方法名為前綴建立臨時目錄。

JUnit 4 內建:TestName Rule

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;

public class SampleTest {
    @Rule
    public TestName name = new TestName();

    @Test
    public void testA() {
        System.out.println("類名:" + name.getMethodName()); // 僅方法名
    }
}

缺點:TestName 僅提供方法名,無類名。

自訂 Rule 同時獲取類名與方法名

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class FullTestName implements TestRule {
    private String fullName;

    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                fullName = description.getClassName() + "." + description.getMethodName();
                try {
                    base.evaluate();
                } finally {
                    fullName = null; // 避免記憶體洩漏
                }
            }
        };
    }

    public String getFullName() {
        return fullName;
    }
}

使用範例

public class OrderServiceTest {
    @Rule
    public FullTestName testName = new FullTestName();

    private TestLogger logger = new TestLogger();

    @Test
    public void testCreateOrder_success() {
        logger.info("開始測試:" + testName.getFullName());
        // 測試邏輯...
    }

    @Test
    public void testCreateOrder_fail_invalidParam() {
        logger.info("開始測試:" + testName.getFullName());
        // 測試邏輯...
    }
}

JUnit 5 (Jupiter) 現代做法

JUnit 5 原生支援 TestInfo 注入:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

class JUnit5Demo {
    @Test
    void testSomething(TestInfo testInfo) {
        String displayName = testInfo.getDisplayName(); // 可自訂 @DisplayName
        String className = testInfo.getTestClass().orElseThrow().getSimpleName();
        String methodName = testInfo.getTestMethod().orElseThrow().getName();
        System.out.println(className + "." + methodName + " | " + displayName);
    }
}

總結

JUnit 4 使用自訂 TestRule 封裝 Description 即可輕鬆獲取完整測試標識。遷移至 JUnit 5 後,直接注入 TestInfo 更簡潔且功能更強(支援顯示名稱、標籤、巢狀測試等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved