2013-03-06 89 views
5

是否有任何工具或策略用于在(Java,log4j)上生成“日志范围”报告?像代码覆盖率一样,但要确保没有大的方法,类或包不记录任何内容。Java日志覆盖工具

在编写Web服务时,我的团队不写很多日志语句。在运行生产代码时调试实时问题时,我们总是希望得到。不可避免地,我们试图在附加的调试器或添加额外的日志语句的情况下重现我们的测试环境中的错误,这取决于所涉及的结构和相互操作可能非常困难。

有没有人使用它作为代码质量指标?

+1

这听起来像是你的测试的一个症状,而不是测试错误条件。生产不是你应该看你的课程破碎的第一个地方。 – djechlin 2013-03-06 04:35:02

+1

@djechlin虽然我理论上同意,但在实践中没有人写无错代码。 – 2013-03-06 06:39:05

+0

代码完整:“不成熟的测试组织往往对每个脏测试都有大约5次干净测试,成熟的测试组织往往对每次干净测试都有5次脏测试,这个比例不会因为减少干净测试而被逆转,而是通过创建25多次脏测试。“我认为这是一个很好的问题,并赞成这样做,但这绝对引起了我的注意,因为缺乏肮脏的测试。 – djechlin 2013-03-06 16:02:53

回答

1

代码覆盖率需要特殊的工具,因为您正在试图找出是否有任何测试执行了一段生产代码。你所要求的更加模糊一点,可能要简单得多(“是否为这个大班级做了任何记录?”),或者更难以达到不可能的程度(“我们记录了在生产中将要破坏的方法?“)。

对于第一个问题,你可以很快拿出一个shell脚本来完成这项工作。例如,这里是Perl中的一个框架。在这里,我假设我们正在使用SLF4J,并且看到“LoggerFactory”的导入足以证明有一个记录器。

while ($filename = shift) { 
    open my $in, "<$filename"; 
    my $loc = 0; 
    my $log = "NO LOGGER"; 
    while (<$in>) { 
     $loc++; 
     if (m/import org.slf4j.LoggerFactory/) { 
      $log = "has logger"; 
     } 
    } 
    print "$filename : $loc LOC $log\n"; 
    $total{$log} += $loc; 
} 
print "\n\nTOTAL LOGGED: $total{'has logger'}\nTOTAL UNLOGGED: $total{'NO LOGGER'}\n"; 

,我可以从我的shell中运行此选项可通过在一个小项目中的所有Java文件与

$ find . -name \*.java -exec perl haslog.pm {} \+ 

运行这仅适用于小型项目的作品,这是相当脆弱,但它止跌做一个更加健壮的版本并不是一件容易的事情。

0

很多日志可能是噪音,以我的经验,我总是发现通过日志痛苦追踪。话虽如此,如果日志管理良好,您可以获得良好的诊断/报告。代码未被正确测试的原因之一是因为生产代码中有大量日志。开发人员倾向于在开发时检查代码作品时添加一条日志语句,因此它鼓励不要使用正确的断言编写测试。你需要的是很多经过良好测试组合在一起的小类。断言应该完全告诉你为什么测试失败。

让我们说在你的代码路径中,你期望发生什么是它的主要责任(例如创建一个数据库条目来注册用户/或某人登录),当我说它的主要责任时,我不是在谈论一方效果发生在你的代码路径中。如果在主代码路径中有错误情况,则应该将堆栈中的异常记录下来并将其转换为用户友好的消息。 RuntimeExceptions在这里是一个很好的例子,因为你不想捕捉这些异常,直到它一直到视图层。副作用也可以被记录,因为它们就像信息/警告。