Kotlin 让logger在其执行期间生成的所有日志上始终前置测试方法名称的优雅方法是什么?

Kotlin 让logger在其执行期间生成的所有日志上始终前置测试方法名称的优雅方法是什么?,kotlin,log4j,testng,Kotlin,Log4j,Testng,请考虑以下设置: @Test class MyTest { @Test fun testX(sessionId: String) { methodName = object {}.javaClass.enclosingMethod.name LOGGER.info("Test {}: Doing", methodName) helper(methodName) LOGGER.info("Test {}: Done"

请考虑以下设置:

@Test
class MyTest {

    @Test
    fun testX(sessionId: String) {
        methodName = object {}.javaClass.enclosingMethod.name
        LOGGER.info("Test {}: Doing", methodName)
        helper(methodName)
        LOGGER.info("Test {}: Done", methodName)
    }

    fun helper(methodName: String) {
        LOGGER.info("Test {}: Helping", methodName)
    }
}
我想知道是否有一种更优雅的方式来配置记录器,使其始终在测试范围s,t内完成的所有日志中预先添加测试名称(如上所述)。我不必到处传递方法名


我能想到的一个选择是MDC()。但是,我可以看出它在TestNG中不太好,因为同一个类实例在测试用例之间共享(与JUnit不同)。

我建议使用TestNG侦听器

这里有一个小例子。创建一个实现
ITestListener
的类:

class MyListener: ITestListener {
    private val logger: Logger = getLogger(MyListener::class.java)

    override fun onTestStart(result: ITestResult?) {
        logger.info("Test {}: doing", result?.name)
    }
}
然后,将其注册到此批注:

import org.testng.annotations.Listeners
import org.testng.annotations.Test

@Listeners(MyListener::class)
class MyTest {
    @Test
    fun testX() {
        // ...
    }

    @Test
    fun testY() {
        // ...
    }

    @Test
    fun testZ() {
        // ...
    }
}
因此,运行测试时,您应该得到如下结果:

13:38:57.008 [Test worker] INFO MyListener - Test testX: doing
13:38:57.015 [Test worker] INFO MyListener - Test testY: doing
13:38:57.016 [Test worker] INFO MyListener - Test testZ: doing

希望这能有所帮助

但这并没有解决我的问题。。我感兴趣的是在测试执行范围内发出的每个日志行中都有测试名称。此外,您上面提到的解决方案可以通过@BeforeMethod@user1836155,当然它是可以实现的,但@beforethod不适用于此类用途。如果确实需要仅使用Log4j追加方法名,则可以使用
M
占位符调整转换模式以包括方法名。由于性能问题,不建议使用此方法。关于细节,我知道。但是,我怀疑%M是否适用于调用helper()的情况。