Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Junit登录TDD_Java_Logging_Junit - Fatal编程技术网

Java 使用Junit登录TDD

Java 使用Junit登录TDD,java,logging,junit,Java,Logging,Junit,最近有人告诉我,我们一般不应该登录JUnit测试用例或TDD。由于我已经开始使用TDD,它对我帮助很大,我将TDD视为代码的一部分,并使用log4j作为我的测试方法。我的理由是:我在JUnit的TDD测试用例中编写代码,所以我也应该使用日志记录 关于这件事的普遍看法是什么,我在上面搜索了一下,但在谷歌上找不到任何与此相关的东西。我的示例测试方法如下所示,其中destinationFileName是在@BeforeTest方法中初始化的类实例变量。。。告诉我这个日志记录是好的还是不应该添加到测试方

最近有人告诉我,我们一般不应该登录JUnit测试用例或TDD。由于我已经开始使用TDD,它对我帮助很大,我将TDD视为代码的一部分,并使用log4j作为我的测试方法。我的理由是:我在JUnit的TDD测试用例中编写代码,所以我也应该使用日志记录

关于这件事的普遍看法是什么,我在上面搜索了一下,但在谷歌上找不到任何与此相关的东西。我的示例测试方法如下所示,其中destinationFileName是在@BeforeTest方法中初始化的类实例变量。。。告诉我这个日志记录是好的还是不应该添加到测试方法中

  @Test
    public void testProcessDestinationByStAX() throws Exception {
        logger.info("Testing processDestinationByStAX");
        DestinationProcessor destinationProcessor = new DestinationProcessor();
        int expResult = numOfDestinations;
        logger.info("parsing  " + destinationFileName);
        List<Destination> result = destinationProcessor.processDestinationByStAX(destinationFileName);
        logger.info("Successfully Parsed  : " + result.size() + " destinations ...");
        assertEquals(expResult, result.size());
    }
@测试
public void testProcessDestinationByStAX()引发异常{
logger.info(“测试过程由税务局指定”);
DestinationProcessor DestinationProcessor=新的DestinationProcessor();
int expResult=numOfDestinations;
info(“解析”+destinationFileName);
列表结果=destinationProcessor.processDestinationByStAX(destinationFileName);
logger.info(“成功解析:”+result.size()+“destinations…”);
assertEquals(expResult,result.size());
}

我认为日志记录在大多数情况下都很有用。例如,测试超时并且没有抛出异常。日志可能会帮助您找到问题。当我们运行一个测试用例时,您可能会看到日志以查看它在哪个进程中,而且我们还可以检查一些难以用assert检查的内容

下面的观点有点不同。它的关键点是,有时可以跟踪日志信息,也可以在自动工具中维护日志以供审查或其他用途


在我看来,大多数测试用例不需要log4j来维护日志。对于大多数场景,System.out.println()就足够了断言消息更为重要

但是有一些特殊情况,log4j将非常有用。 例如,

有时我仍然需要自己运行一个测试用例,在这种情况下 需要配置log4j

在这种情况下,他有时需要它自己运行,并且需要为它维护一个日志

当然,如果您有一个teamcity来维护每个构建日志,那么您也可以使用System.out.println。因为teamcity或其他自动工具可以帮助您维护日志。如果您不使用这些工具,并且仍然希望多次运行测试用例,那么还需要知道测试用例何时在哪个构建中失败,以及使用哪个签入。那么log4j就很有用了

总之,如果没有特殊要求,我认为应该避免在一般Junit测试用例中使用log4j


我认为这与TDD无关,或者说,这不是最重要的事情。

IHMO,如果日志记录有助于确定正在进行的工作,那么它应该在代码中,而不是在测试中。JUnit将记录测试名称(该名称应提供有关测试内容的信息),并且代码应具有调试日志以帮助确定流。考虑到这两件事,我通常会建议在测试中登录会造成混乱,也会使日志变得混乱

我还发现测试应该尽可能简单。这是因为人们不喜欢维护。测试中的代码行(包括日志语句)越多,它们就越复杂。人们会花时间试图弄清楚你的代码是做什么的。他们不会花时间试图弄清楚您的测试是做什么的。因此,亲吻是测试的关键

综上所述,我认为很难有人认为在测试中添加日志记录有什么内在的错误

另一个问题可能是,您是否应该测试日志记录?您的单元测试应该验证预期的日志记录是否发生。我没有看到太多关于这方面的讨论,但是IMHO,应该验证警告级别或更高级别的日志记录

有一点值得注意的是,看看你的测试,你并不知道测试的方法是什么。考虑将您的测试格式化如下:

 @Test
public void testProcessDestinationByStAX() throws Exception {
    // setup
    logger.info("Testing processDestinationByStAX");
    DestinationProcessor destinationProcessor = new DestinationProcessor();
    int expResult = numOfDestinations;
    logger.info("parsing  " + destinationFileName);

    // test
    List<Destination> result = destinationProcessor.processDestinationByStAX(destinationFileName);

    // verify
    logger.info("Successfully Parsed  : " + result.size() + " destinations ...");
    assertEquals(expResult, result.size());
}
@测试
public void testProcessDestinationByStAX()引发异常{
//设置
logger.info(“测试过程由税务局指定”);
DestinationProcessor DestinationProcessor=新的DestinationProcessor();
int expResult=numOfDestinations;
info(“解析”+destinationFileName);
//试验
列表结果=destinationProcessor.processDestinationByStAX(destinationFileName);
//核实
logger.info(“成功解析:”+result.size()+“destinations…”);
assertEquals(expResult,result.size());
}

这使您的测试更加清晰,因为应该只有一个被测试方法的调用,并且进行格式化可以很容易地找到该调用。

您似乎在讨论log4j是否是正确的日志机制,然而问题是:是否应该进行日志记录。我喜欢格式化部分是的,它确实提供了很多代码可见性