单元测试整合spring-test实践

简介: 本文主要是对Junit简介,以及结合说spring-test完善Junit不足,以及使用需要注意的问题。

单元测试在我们的软件开发整个流程中占有举足轻重的地位,我们可以通过编写单元测试来提高开发的效率、验证程序的有效性,并且减少程序的bug。每一样东西都有两面性,有优点也有缺点,先来说说Junit的优点。
1、提供API以便创建可重复的带有清晰的通过/不通过的结果的单元测试;
2、方便的组织、运行测试和展示结果;
3、可以把多个测试分组打包,成批处理;
4、添加,删除,屏蔽测试方法,不影响其他的测试方法;
5、减少重复工作,提高开发效率。
Junit提供一系列的方法、注解,方便我们进行单元测试的同时,也可以很直观地观察到测试结果。
@Test(expected=...)注解:

此注释标签的含义是,这是一个测试,期待一个异常的发生,期待的异常通过 xxx.class 标识,这个注解可以很方便地验证方法所产生的异常,如果产生期待的异常,则测试通过,否则测试失败;

@Test(timeout=...)注解:

可以给测试方法指定超时时间(毫秒级别),当测试方法的执行时间超过此值,则失败。
eg:
@Test
@Ignore
@Repeat(5)
public void testInsertException() {
    service.insertIfNotExist(null);
}

不可否认,在实际应用中,Junit还是有一些不足之处,有以下几点:
1、每次运行,都需要加载所需要的配置;
2、对数据库的操作无法进行回滚;
3、需要添加获取bean实例的代码,也就是无法自动注入。
另外,JUnit是不支持多线程代码的测试的,主线程运行完之后就结束整个测试了。如果想要实现多线程执行,需要继承Runner类,自己实现一个运行环境类。
接下来说说spring-test,spring-test的功能比较强大,可以与Junit完美集成,可以弥补刚刚说到的几个Junit的缺点。Spring 与 Junit 的集成也比较简单,只需在pom.xml中添加以下配置即可。

<dependency>                                  
  <groupId>org.springframework</groupId>    
  <artifactId>spring-test</artifactId>       
  <scope>test</scope>                       
</dependency>

如果应用中已经使用到Junit,那么在与spring-test集成的时候。原先的方法和注解都不需要改变,只需要在类的声明处,通过@Run With (Spring JUnit4 Class Runner.class)来启动 Spring 对测试类的支持,通过@Context Configuration注释标签来指定 Spring 配置文件或者配置类的位置,再使用@Transactional 用来启用自动的事务管理即可。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"file\:D:/xxx/xxx/src/main/webapp/WEB-INF/applicationContext.xml"})
@Transactional
public abstract class AbstractTestCase extends TestCase{ 
  ……
}  

spring-test还支持配置文件的缓存,使用@Dirties Context注解进行配置,缺省情况下,Spring 测试框架一旦加载applicationContext后,将一直缓存,不会改变。但由于Spring允许在运行期修改 applicationContext的定义。例如在运行期获取 applicationContext,然后调用registerSingleton方法来动态的注册新的bean。这样的情况下如果我们还使用Spring测试框架的被修改过applicationContext,则会带来测试问题,我们必须能够在运行期重新加载 applicationContext。这个时候,我们可以在测试类或者方法上注释: @Dirties Context,作用如下:

如果定义在类上(缺省),则在此测试类运行完成后,重新加载 applicationContext
如果定义在方法上,即表示测试方法运行完成后,重新加载 applicationContext。

最后,再说说使用Junit给我们带来的好处:
1、junit+spring-test整合单元测试,无需启动容器,测试更加便捷。
2、通过单元测试,由简及繁,降低复杂项目集成风险。
3、调整代码,通过已有测试用例,快速检查结果,降低测试城。

相关文章
|
17天前
|
安全 Linux 测试技术
提升龙蜥内核测试能力!探究持续性模糊测试优化实践
清华大学软件学院对Anolis OS使用靶向模糊测试方法将测试工作引向修改的代码,进而提高对业务代码的测试能力。
|
1月前
|
SQL 搜索推荐 测试技术
【Havenask实践篇】完整的性能测试
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。性能测试的目的在于评估搜索引擎在各种负载和条件下的响应速度、稳定性。通过模拟不同的用户行为和查询模式,我们可以揭示潜在的瓶颈、优化索引策略、调整系统配置,并确保Havenask在用户数量激增或数据量剧增时仍能保持稳定运行。本文举例对Havenask进行召回性能测试的一个简单场景,在搭建好Havenask服务并写入数据后,使用wrk对Havenask进行压测,查看QPS和查询耗时等性能指标。
65362 6
|
1月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
2月前
|
安全 测试技术
测试团队的一次复盘实践
测试团队的一次复盘实践
142 0
|
2月前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
3月前
|
安全 jenkins 测试技术
自动化测试与持续集成/持续交付(CI/CD)的实践与应用
自动化测试是现代软件开发不可或缺的环节,它可以有效地提高测试效率、降低测试成本。而持续集成/持续交付(CI/CD)则是一种基于自动化的软件开发流程,能够将代码的开发、构建、测试和部署等过程无缝连接起来,从而实现快速迭代和部署。本文将结合实际案例,介绍自动化测试和CI/CD的实践与应用。
144 2
|
3月前
|
Java 数据库连接 Spring
从零开始,探索Spring框架的魅力与实践
从零开始,探索Spring框架的魅力与实践
|
5天前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
14 6
Spring高手之路17——动态代理的艺术与实践
|
24天前
|
传感器 监控 算法
【软件设计师备考 专题 】模块测试的方法和实践
【软件设计师备考 专题 】模块测试的方法和实践
68 0
|
26天前
|
敏捷开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计理念与实践
随着敏捷开发和持续集成的理念深入人心,自动化测试在软件开发周期中扮演着越来越重要的角色。Selenium作为一个广泛使用的自动化测试工具,其设计理念和实践对于提高测试效率和质量具有指导意义。本文将深入探讨Selenium的核心设计原则、架构以及最佳实践,旨在帮助读者构建更稳定、高效的自动化测试系统。