测试期间记录日志和预期的异常

时间:2019-03-16 05:00:34

标签: testing exception logging spock

在我的应用程序代码中,常见的情况是在应用程序使用过程中出现问题时,我想要尽可能多地记录有关情况的信息,包括(如果适用)包括已抛出的Exception的堆栈跟踪信息。

但是在测试过程中,我不想记录这些堆栈跟踪信息,使日志文件杂乱无章。

如果在这种情况下测试本身会创建一个Exception对象,则可以向其发送一条消息,将其标识为虚拟Exception,例如:

given:
    indexMgr.queryParser = Mock( QueryParser ){
        parse(_) >> { throw new Exception( 'dummy parse problem' )}
    }

,然后在应用代码中执行以下操作:

try {
    query = queryParser.parse(queryString)
}catch( e ) {
    log.debug( "QP exception msg: $e.message" )

    // we don't want a stack trace to be logged if this is a dummy Exception deliberately thrown during testing
    if( ! e.message.contains( 'dummy' )) {
        // this will log the stack trace of e
        log.error( 'query threw Exception in QP.parse()', e )
    }
    return false
}

...但这有两个问题:首先,并非总是由测试代码而不是应用程序代码创建预期的Exception,其次是感觉不对。在实际应用代码中检查是否有条件确定测试的进行。

有没有解决这个问题的“最佳实践”方法?

1 个答案:

答案 0 :(得分:1)

如果仅从行中删除堆栈跟踪就可以了,则可以在记录器的模式布局中配置异常转换逻辑。下面是使用log4j2的示例:

public class ExceptionOutput {
    private static final Logger LOG = LoggerFactory.getLogger(ExceptionOutput.class);

    public static void main(String[] args) {
        LOG.info("Foo", new NullPointerException("MESSAGE"));
    }
}

log4j2配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
                           alwaysWriteExceptions="false"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

记下alwaysWriteExceptions=false。它完全禁用异常输出。现在,如果我们运行代码,我们将得到:

01:04:50.151 [main] INFO  ExceptionOutput - Foo

但是如果您恢复为alwaysWriteExceptions=true,这也是默认的行为(如果省略了该参数),则会得到:

01:07:03.018 [main] INFO  ExceptionOutput - Foo
java.lang.NullPointerException: MESSAGE
    at ExceptionOutput.main(ExceptionOutput.java:8)

但是,这还有更多。为了获得更大的灵活性,您可以在模式中使用%throwable{...}转换字,如模式表中here所说明的那样,用于各个转换模式。为了将逻辑仅应用于测试,您可以按照here的说明在类路径上使用log4j2-test.xml。其他日志记录库也有类似的例外转换功能,例如logback

相关问题