使用Spring中Transcation进行数据库集成测试

使用 Spring 进行单元测试 (转) 转: http://www.ibm.com/developerworks/cn/java/j-lo-springunitest/index.html#ibm-pcon 概述 单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量。这里,我们... 阅读详情

数据库是程序中几乎必不可少的一部分,那么如何对于数据库进行测试呢?

如果多个测试同时使用同一个数据库,我们怎么能够保证不同测试之间的测试数据不会相互影响呢?

这里我们可以使用事务(transaction)进行数据库的测试。

一、数据库的基本测试

直接上代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:application-test.xml"
})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class PeopleIntegrationTest {
    @Autowired
    private PeopleDao peopleDao;

    @Before
    public void setUp() throws Exception {
        peopleDao.clear();
    }

    @Test
    public void should_success_add_a_people() {
        peopleDao.insertPeople(new People("firstName", "lastName"));
        assertThat(peopleDao.getPeopleCount(), is(1));
    }
}

在Spring的spring-test中有@TransactionConfiguration这么一个annotation。在使用了这个annotation以后,当测试方法执行完毕以后,事务会自动回滚(rollback),不会影响已经存在的数据;同时,当不同的测试同时执行时,因为事务没有提交,不同的测试之间也不会相互影响。

二、针对cache的测试

在项目中,我们经常对数据库使用cache从而减少我们访问数据库的次数,提高程序的效率。但是,cache在测试中会带给我们一定的麻烦。举个例子,我们在测试A中执行过程中的结果可能会被cache。而测试B执行时,可能就会直接使用A中cache的值,从而导致测试失败。

假设我们有两个测试用例,这两个测试用例都调用了getPeopleCount。

    @Test
    public void should_success_add_a_people() {
        peopleDao.insertPeople(new People("firstName", "lastName"));
        assertThat(peopleDao.getPeopleCount(), is(1));
    }

    @Test
    public void should_success_add_two_people() {
        peopleDao.insertPeoples(
                of(new People("firstName1", "lastName1"),
                   new People("firstName2", "lastName2")));
        assertThat(peopleDao.getPeopleCount(), is(2));
    }

但是,当getPeopleCount被标明为cacheable的时候,第二次执行的getPeopleCount很可能是上一次被缓存的结果,这样测试就会出现错误。

解决方法就是在测试类名上加上一个@DirtiesContext

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

使用@DirtyContext,加上@DirtyContext以后,标示测试使用的ApplicationContext已经Dirty,需要重新加载,此时cache的数据就会被清空。Dirties中的classMode是一个枚举类型,

@DirtiesContext还有很多的细节,可以根据实际需要去查看文档。


更多参考资料:http://docs.huihoo.com/spring/3.0.x/en-us/ch09s03.html

http://www.javabeat.net/2013/05/cache-abstraction-spring-cacheable-cacheevict/



数据集成测试支持工具 在数据测试中,ETL脚本的测试是个难题。一般而言,采用高集成度的测试方式(即运行ETL并比对结果,下文称集成测试)是更有效的做法。但是,这类测试的编写和维护却有较高的成本。如何降低ETL集成测试的成本呢?本文尝试从数据工具的角度分享一些我们的经验。...... 阅读详情

相关推荐

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4042

Innodb Transaction实验

Mysql Transaction 实验环境 数据库版本 Read Uncommitted

wuxianglaur1的博客 268

Unity 数字孪生实战:PiXYZ Plugin工业模型高效处理指南

本文是Unity数字孪生实战指南,重点介绍了如何使用PiXYZ Plugin高效处理工业CAD模型。针对工业模型导入Unity时面临的格式壁垒、数据爆炸和资产混乱等核心痛点,文章提供了从环境安装、基础导入到智能减面、资产清理的完整解决方案,并分享了预设自动化、运行时导入等高级技巧与性能优化策略,帮助开发者快速打通工业设计与实时交互流程。

weixin_29009501的博客 255

你真的需要 @DirtiesContext?

测试又随机挂了,该怎么办?加上 @DirtiesContext 试试。真棒,修好了。 WAIT! WAIT! WAIT! 为什么加 @DirtiesContext 就修好,有没有什么副作用? @DirtiesContext is a spring test annotation which is used to indicate tha...

weixin_33738982的博客 3435

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1880

富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传

文章目录一、蓝牙协议栈启动流程1.1 初始化代码1.2 初始化流程1.3 回调函数里的初始化二、notify实现2.1 notify介绍2.2 notify实现2.3.1 定义数据2.3.2 获取连接号conidx2.3.3 gatt_notification函数的使用三、notify温度上传测试3.1 蓝牙调试工具3.2 蓝牙调试器设置3.3 测试结果四、参考链接   基于sdk开发的好处是方便项目的快速落地,现在用的是SDK里面的源文件,目前只是学习FR801xH芯片的特性,裁剪这个SDK需要点时间,

weixin_43810563的博客 4318

注解含义集合 @ 什么什么-不断更新

@ComponentScan、@Configuration 属于 JavaConfig 代码,配置自动扫描发现被@Component等标注的类注册为 Spring 的bean,功能上等同于<context:component-scan base-package=""> @Co..

༺ bestcxx的专栏 ༻ 1696

【一键搞定】ThinkPHP6.0.2+PHPStudy+Composer极速安装指南——附完整下载包与避坑技巧

本文提供了一份ThinkPHP6.0.2的完整下载包,并详细介绍了如何配合PHPStudy和Composer进行极速安装与配置。指南涵盖了环境准备、Composer国内镜像加速、项目部署及常见避坑技巧,旨在帮助开发者,尤其是内网或网络不佳的用户,快速搭建可运行的TP6开发环境,绕过依赖下载的繁琐步骤。

assembly8low的博客 1006

测试Spring应用可以使用的注解

测试Spring应用可以使用的注解

听海边涛声 1385

七天征服AutoSAR/SomeIP_01速成配置并代码生成

本文为AutoSAR中SomeIP配置开发的实操指南摘要,重点介绍通过通信矩阵快速构建SomeIP工程的方法。核心内容包括:1)基于Excel通信矩阵生成系统描述文件(arxml);2)在AutoSAR工具中导入文件自动生成协议栈配置,涵盖ETHIF、SoAd等模块;3)关键报错处理(COM/PDUR/SOAD/SD模块的配置修正);4)SomeIPXF的数据编解码配置;5)SWC组件与RTE任务映射。教程强调"先完成再完美"的实践原则,指导开发者快速生成基础代码框架,为后续协议调试奠定

大叔带刺的博客 302

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4170

Spring框架注解指南-最好玩

  Spring框架注解指南 这是几乎所有Spring Framework的注解,包括Core,Spring Cloud,Spring MVC,Spring REST和Spring Boot。 Java编程语言为Java 5.0以后的注释提供了支持。领先的Java框架很快就采用了注释,Spring Framework开始使用2.5版本的注释。由于它们的定义方式,注释在其声明中提供了大量上...

开发猫 1670

AD9914数字斜坡模式使用

类似的,如果DRG输出处于负斜率斜坡中间,DRCTL引脚由逻辑0变为逻辑1,那么DRG会立即切换成正斜率参数,恢复在两个限值之间振荡输出。当两个非驻留位同时设置时,每次DRG输出达到编程设定的上限值或下限值后(假定DRG过输出使能位(0x01[13])已设置),DROVER信号会产生一个正脉冲(两个DDS时钟周期)。不过,在非驻留操作中,DRG输出不一定保持在上下限值。例如,设置数字斜坡非驻留高位,则当达到上限值时,DRG会自动(立即)跳到下限值(这一过程并非以斜坡方式返回下限值,而是直接跳至下限值)。

wangjie36的博客 3864

Spring Integration Testing(集成测试)- @IntegrationTest

先上代码如: @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) @WebAppConfiguration @IntegrationTest @SpringApplicationConfiguration(classes = {RibbonDiscoveryFilterTest.Application.class}) @RunWith(SpringJUnit4ClassRunner.class) public class RibbonDiscoveryF

zzy7075的专栏 1687

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Use DirtiesContext Annotation in Spring Boot Test

This is working as designed. Spring Framework's test framework will, by default, cache contexts for possible reuse by multiple test classes. You have two tests with different configuration (due to @Te...

ldc9001的专栏 384

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【高级测试技巧】:利用@DirtiesContext控制@MockBean重置的代价与收益

掌握Spring Boot Test @MockBean 的重置难题,本文详解如何通过@DirtiesContext精准控制测试上下文刷新,避免副作用累积。适用于集成测试场景,平衡隔离性与性能开销,提升测试可靠性。方法实用,值得收藏。

FastCompile的博客 822

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Boot多数据源单元测试隔离:@DirtiesContext的终极指南

在Spring Boot应用开发中,多数据源配置能有效提升系统性能与扩展性,但单元测试时数据源状态污染常导致测试失败。本文将详解如何利用`@DirtiesContext`注解实现多数据源测试隔离,让你的测试更可靠、更高效! ## 为什么多数据源测试需要隔离? 🧪 多数据源环境下,不同测试方法可能操作相同的数据源连接池或事务管理器,若前一个测试修改了数据源状态(如创建表、插入测试数据),后一个

gitblog_00487的博客 1123

数据库集成测试与 H2 内存数据库的使用

数据库集成测试与 H2 内存数据库的使用

weixin_45428910的博客 1069

Java单元测试实践-03.使用spring-test进行单元测试

1. spring-test 参考 https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/#overview-testing 。 spring-test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。它提供Spring ApplicationContext的持续加载,以及这些上下文的缓存,还提供了可用于测试的独立于代码的mock对象。 1.1. 基本配置 1

adrninistrat0r的博客 3425

Spring基于注解TestContext 测试框架使用详解

原创整理不易,转载请注明出处:Spring基于注解TestContext 测试框架使用详解 代码下载地址:http://www.zuidaima.com/share/1775574182939648.htm 概述 spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点: 基于注解的 IoC 功能;基于注解驱动的 Spring

xygg0801的博客 480

集成测试如何做?

集成测试被定义为一种测试类型,其中软件模块在逻辑上集成并作为一个组进行测试。一个典型的软件项目由多个软件模块组成,由不同的程序员编码。此级别测试的目的是在集成这些软件模块时,暴露它们之间交互中的缺陷集成测试的重点是检查这些模块之间的数据通信。因此,它也被称为“I & T”(集成和测试),“字符串测试”,有时也称为“线程测试”。

YLF123456789000的博客 941

数据库测试规范

特别说明:本文虽归类于原创,但并非原创,实收集整理于网络! 一、数据库测试概论 随着软件业的迅猛发展,我们的开发也从以前的单层结构进入了三层架构甚至现在多层架构的设计,而数据库从以前一个默默无闻的后台仓库,逐渐成为了数据库系统,而数据库开发设计人员成为了炙手可热的核心人员。以前我们往往把数据库操作写在应用层,从而提高各个模块的独立性和易用性,而现在越来越多的数据库操作被作为存储过程直接放在...

hekaiping20的博客 1105

《Spring 5官方文档》11集成测试 (二)

11.3 JDBC测试支持 org.springframework.test.jdbc是包含JdbcTestUtils的包,它是一个JDBC相关的工具方法集,意在简化标准数据库测试场景。特别地,JdbcTestUtils提供以下静态工具方法: countRowsInTable(..):统计给定表的行数。 countRowsInTableWhere(.....

weixin_33835103的博客 205

Spring Test 中重置自增字段

在集成测试中,对于保存数据到数据库的方法,我们需要验证是否数据被正确地保存到数据库中。对于使用 Spring 的项目,可以使用 Spring Test DbUnit 和 DbUnit 进行测试。然而,在数据对比的时候,自增的字段就成了一个障碍,因为自增字段是自动生成的,在测试的时候,我们无法确定下一个插入数据的自增字段的值。

zsensei的博客 1921

数据库测试(百科)

数据库测试是依据数据库设计规范对软件系统的数据库结构、数据表及其之间的数据调用关系进行的测试。 集成测试是主要针对接口进行的测试工作,从数据库的角度来说和普通测试稍微有些区别对于数据库测试来说,需要考虑的是: 数据项的修改操作; 数据项的增加操作; 数据项的删除操作; 数据表增加满; 数据表删除空; 删除空表中的记录; 数据表的并发操作; 针对存储过程的接口测试; 结合业务

marysa的专栏 680
上一篇: 使用spring jdbc的batchUpdate功能提高性能
下一篇: 在IntelliJ下使用instance method替换static method
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值