单元测试
我不是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 {@AutowiredHelloWorld helloWorld;private final static Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Testpublic 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)是很不错的添加,但不是必需的 。 我在这里提供的只是在大多数情况下都可以使用的香草方法,但我鼓励观众进行试验。
单元测试范围/代码范围。
我对强硬立场的坚定信念来自这样一个事实,即报告测试覆盖率是如此容易。 在此示例中,我将使用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的代码覆盖率报告。 此报告将允许您单击被测试的源代码,并为单元测试的代码提供漂亮的绿色补丁,而对于那些通过裂缝的代码则为您提供红色的补丁。
记录中
如果没有适当的日志记录,您可能会走很长一段路。 但是,我花了太多周末和晚上来追踪生产问题,而企业却深呼吸,希望有某种方法可以知道应用程序中发生的事情,而不用一味猜测。 如今,借助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 tooTestNG 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