JUnit,Logback,带有Maven 3的Maven

在本系列中,我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的主题了。 但是,在我们涉足更深的领域之前,让我们先进行一些基础设置。

单元测试

我不是TDD传播者。 我在那里说了。 我从来没有能够编写任何软件的地方,对于每段代码,我都先编写了一个测试,然后编写了代码。 如果您已经这样做并且被编码所雇用,请告诉我。 我很想了解你。 说真的

我对TDD的意见分歧到此为止。 除了在代码之前编写测试(某种程度上我根本无法动动脑筋)之外,我还是单元测试的大力支持者。 我坚信使用JUnit测试所有功能(公共但非getter设置器,方法)。 我非常喜欢使用cobertura报告代码覆盖率。 我是maven的忠实拥护者,它使我只需一个命令就可以将它们整合到一个漂亮HTML报告中。

我将在本系列中使用JUnit 4。 让我们添加依赖项。

档案:\ pom.xml

<properties>                                                     
    <junit.version>4.10</junit.version>
</properties>  

<!-- Unit testing framework. -->       
<dependency>                           
    <groupId>junit</groupId>           
    <artifactId>junit</artifactId>     
    <version>${junit.version}</version>
    <scope>test</scope>                
</dependency>

让我们添加一个哑类来演示测试。

文件:/src/main/java/org/academy/HelloWorld.java

package org.academy;

public class HelloWorld {
  private String message = 'Hello world. Default setting.'; 
  public String greet(){
    return message; 
  }
  
  public String getMessage() {
    return message;
  }
  public void setMessage(String message) {
    this.message = message;
  }
}

最后是JUnit对其进行测试。

文件:src / test / java / org / academy / HelloWorldTest.java

package org.academy;

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {

  @Autowired
  HelloWorld helloWorld;
  
  private final static Logger logger = LoggerFactory
      .getLogger(HelloWorldTest.class);

  @Test
  public void test() {    
    logger.debug(helloWorld.greet());
    assertEquals(helloWorld.greet(), 'Hello world, from Spring.');
  }
}

您可能已经注意到,单元测试中的helloWorld从未在代码中初始化。 这就是Spring的IoC魅力 。 为了使这项工作有效,我们使用了@ RunWith,@ ContextConfiguration和@Autowired。 而且我还为Spring提供了足够的信息,使其能够创建HelloWorld实例,然后将其注入到HelloWorldTest.helloWorld中。 另外,assertEquals正在检查与HelloWorld类中实际硬编码的消息完全不同的消息。 这是在下面提到的xml文件中完成的。 请注意在Maven结构中文件的位置。

文件:/src/test/resources/org/academy/HelloWorldTest-context.xml

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p'
  xmlns:context='http://www.springframework.org/schema/context'
  xsi:schemaLocation='http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd'>

  <bean id='helloWorld' class='org.academy.HelloWorld'>
    <property name='message' value='Hello world, from Spring.' />
  </bean>
</beans>

我可以通过多种方式将此配置文件提供给单元测试。 @RunWith(SpringJUnit4ClassRunner.class)是很不错的添加,但不是必需的 。 我在这里提供的只是在大多数情况下都可以使用的香草方法,但我鼓励观众进行试验。

单元测试范围/代码范围。

对于个人/开发人员和技术主管而言,我认为关于自动/半自动/简便的代码覆盖率报告的重要性还没有足够的评论。 除非您虔诚地实践TDD(以我之前从未提到过的方式进行过实践),否则即使是单个开发人员也绝对不可能知道单元测试是否涵盖了代码的所有逻辑分支。 我什至不打算谈论团队/组织的技术负责人如何确保其产品经过充分的单元测试。 我个人认为,任何未经足够的单元测试和报告测试范围的软件产品,都是无法接受的风险。 期。 诚然有一点硬性立场,但事实就是如此。

我对强硬立场的坚定信念来自这样一个事实,即报告测试覆盖率是如此容易。 在此示例中,我将使用cobertura。 您需要将cobertua添加到Maven pom。

档案:pom.xml

<!-- Reporting -->                                              
<plugin>                                                              
  <groupId>org.apache.maven.plugins</groupId>                       
  <artifactId>maven-site-plugin</artifactId>                        
  <version>3.0</version>                                            
  <configuration>                                                   
    <reportPlugins>                                               
      <!-- Reporting on success / failure of unit tests -->     
      <plugin>                                                  
        <groupId>org.apache.maven.plugins</groupId>           
        <artifactId>maven-surefire-report-plugin</artifactId> 
        <version>2.6</version>                                
      </plugin>                                                 
      <!-- Reporting on code coverage by unit tests. -->        
      <plugin>                                                  
        <groupId>org.codehaus.mojo</groupId>                  
        <artifactId>cobertura-maven-plugin</artifactId>       
        <version>2.5.1</version>                              
        <configuration>                                       
          <formats>                                         
            <format>xml</format>                          
            <format>html</format>                         
          </formats>                                        
        </configuration>                                      
      </plugin>                                                 
    </reportPlugins>                                              
  </configuration>

完成此操作并添加JUnit并添加实际的JUnit测试后,您只需要运行

mvn -e clean install site

创建一个漂亮的基于HTML的代码覆盖率报告。 此报告将允许您单击被测试的源代码,并为单元测试的代码提供漂亮的绿色补丁,而对于那些通过裂缝的代码则为您提供红色的补丁。

记录中

Log4j很好, Logback更好 。 只是不要使用System.out.println()进行日志记录。

如果没有适当的日志记录,您可能会走很长一段路。 但是,我花了太多周末和晚上来追踪生产问题,而企业却深呼吸,希望有某种方法可以知道应用程序中发生的事情,而不用一味猜测。 如今,借助slf4j之类的成熟api和诸如logback之类的稳定实现,开发人员只需为每个类添加一条额外的行即可利用企业级日志记录基础架构。 从任何项目开始就不使用正确的日志记录只是没有意义的。

添加slf4j并重新登录到Maven依赖项。

文件:\ pom.xml。

<!-- Logging -->                            
<dependency>                                
  <groupId>ch.qos.logback</groupId>       
  <artifactId>logback-classic</artifactId>
  <version>${logback.version}</version>   
</dependency>

确保排除了Spring的默认日志记录,即公共日志。 如果您想知道logback是否真的那么好,我声称这就是为什么Spring不选择它作为开始。 在我的辩护中,这是Spring官方博客上的链接 ,他们说:“如果我们可以倒计时并现在作为一个新项目启动Spring,它将使用不同的日志记录依赖性。 首选的可能是Java的简单日志记录外观(SLF4J),……”

文件:\ pom.xml。

<!-- Support for testing Spring applications with too
  TestNG This artifact is generally always defined 
  the integration testing framework and unit testin
<dependency>                                         
  <groupId>org.springframework</groupId>           
  <artifactId>spring-test</artifactId>             
  <version>${org.springframework.version}</version>
  <scope>test</scope>                              
  <exclusions>                                     
    <exclusion>                                  
      <groupId>commons-logging</groupId>       
      <artifactId>commons-logging</artifactId> 
    </exclusion>                                 
  </exclusions>                                    
</dependency>

提供用于注销的配置。

文件:/src/main/resources/logback.xml

<?xml version='1.0' encoding='UTF-8'?>
<configuration>
  <appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'>
    <encoder>
      <pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern>
    </encoder>
  </appender>

  <logger name='org.springframework'>
    <level value='INFO' />
  </logger>

  <root>
    <level value='DEBUG' />
    <appender-ref ref='CONSOLE' />
  </root>
</configuration>

最后,在每个需要记录的类(应该是所有类)的开始处添加一个魔术贴。

文件:src / test / java / org / academy / HelloWorldTest.java

[...]                                                    
private final static Logger logger = LoggerFactory  
  .getLogger(HelloWorldTest.class);           
[...]
logger.debug(helloWorld.greet());
[...]

你们都在那里准备好了。 现在是时候深入春天了。

快乐的编码。

想了解更多吗?

这里是本系列早期文章的链接。
Hello World with Spring 3 MVC
使用Spring 3 MVC处理表单

而且,当然强烈推荐
Spring 3使用JUnit 4进行测试。
使用Spring Framework运行单元测试 @RunWith JUnit4以及SpringJUnit4ClassRunner和参数化 Junit和Spring的问题。

Tech for Enterprise博客上,来自我们的JCG合作伙伴 Partho的 参考资料: JUnit,Logback,Maven和Spring 3


翻译自: https://www.javacodegeeks.com/2012/07/junit-logback-maven-with-spring-3.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值