Java:如何找到/知道代码是否有任何问题?

时间:2013-06-21 22:21:14

标签: java

我编写了一个Custom Log4J Appender,它负责将日志消息发送到第三方服务asyncronsly

所以预计这会被称为每毫秒

这是我的自定义Appender代码

我在这段代码上运行了 Findbugs ,它没有报告任何异常。

但在将此代码发布到生产之前,我怎么知道这段代码是否有任何问题。

是否有用于此目的的工具?

请提前感谢您分享您的想法。

package com;

import java.util.ArrayList;
import java.util.Iterator;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

public class MyAppender extends AppenderSkeleton {

    public MyAppender() {

    }

    public void append(LoggingEvent event) {
        ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
        buffer.add(event);
        flushBuffer(buffer);
    }

    public void flushBuffer(ArrayList<LoggingEvent> buffer) {
        for (Iterator<LoggingEvent> i = buffer.iterator(); i.hasNext();) {
            try {
                LoggingEvent logEvent = (LoggingEvent) i.next();
                String messageRecievied = (String) logEvent.getMessage();
                //System.out.println(messageRecievied);

            } catch (Exception e) {

            }

        }

    }

    @Override
    public void close() {

    }

    @Override
    public boolean requiresLayout() {

        return false;
    }

}

3 个答案:

答案 0 :(得分:3)

测试。

弄清楚用例是什么,包括边缘情况 进行单元测试。

考虑部署环境中可能破坏代码的任何变量 创建集成测试以确保这些方案都能正常工作。

创建一个假接收器并对其进行测试 您需要为接收器创建测试,以确保它正确验证。

答案 1 :(得分:1)

能够使用任意输入预测任意代码的结果是an NP-Complete问题。因此,没有100%可靠的方法来保证代码没有问题(至少在宇宙热死之前。因此,你完全处于风险管理领域。

那你做什么?

<强> TEST 单元和系统测试可以帮助您确信您的代码没有错误。使用类似JUnit的内容来执行此操作。使用此类套件,您可以提供特定输入并检查以确保输出有效。但请注意,这只会针对您提供的输入进行测试,而不是针对任何输入进行测试,因此即使是非常好的测试套件也可能会给您带来虚假的信心。因此,第二道防线是......

<强> METRICS 确保您正在测量并了解您可以做的一切。如果您将新代码投入生产并且对数据库的写入增加了十倍......您可能会遇到问题。或许您的错误消息速度增加 - 或者降至零。除非您正在监控关键指标,否则无法确定系统的运行状况。但如果出现问题会发生什么?

功能控制 在您添加新功能的任何复杂系统中,对这些功能进行控制是个好主意。将此视为全局切换,可让您在旧代码路径和新代码路径之间进行选择。例如:

public void append(LoggingEvent event) {
    if (FeatureController.isActive(this.FEATURE_NAME)){
      ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
      buffer.add(event);
      flushBuffer(buffer);
    }
}

这可让您在新功能出现问题时快速关闭。

答案 2 :(得分:0)

不存在这样的工具,否则它将是人工智能,并且会在不需要你的情况下编写整个代码; - )

但是如果可能的话写单元测试。通过良好的单元测试,您可以部署许多任务,并且第一次运行时没有任何错误。 (该工具称为JUnit)

第二个工具:EclEmma eclipse插件: 它显示了junit测试覆盖率。你有80%或更多的报道?没有? (对你感到羞耻; - ))

看看appache log4j的src,我记得他们有一些单元测试,也许有一些现有的appender。