首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

策略模式案例II-看DBRider如何导入数据

value属性指定的数据文件users.yml插入到数据库中,通过strategy属性指定数据库的插入方式为先清空数据库文件中涉及到的目标表,然后插入数据文件中提供的数据。...不过其中的CompositeOperation说明这其中还使用了组合模式,这个可以在后续解读。 策略抽象类 策略模式通过一个接口或者抽象类定义策略的运行方法。...; import java.sql.SQLException; import org.dbunit.DatabaseUnitException; import org.dbunit.database.IDatabaseConnection...数据库导入操作类 策略模式中,一般都会有一个Context类来作为使用某种策略的类。 DBRider定义了一个DataSetExecutorImpl,用于实现对数据库的各项操作。...DatebaseOperation策略类,并执行其中的execute方法。

70630

基于dbunit进行mybatis DAO层Excel单元测试

DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,H2。...database.schemaNames=teams #配置数据库方言 database.dialect=mysql #需设置false,否则我们的测试函数只有在执行完函数体后,才将数据插入的数据表中...#InsertLoadStrategy:只插入数据 #RefreshLoadStrategy:有同样key的数据更新,没有的插入 #UpdateLoadStrategy:有同样key的数据更新,没有的不做任何操作...执行流程 dbunit通过@DataSet注解读取模拟数据Excel文件,流程如下: Excel文件 --> @DataSet --> DbUnitModule --> DataSetFactory -...return resolvedFile; } //调用DataSetFactory.createDataSet()向数据库中注入Excel数据后,直接返回DataSet,不对DataSet执行清零操作

1.9K00
您找到你想要的搜索结果了吗?
是的
没有找到

dbunit实现原理及最佳实践

@DatabaseSetup注解有一个type属性,其作用是指定初始化测试数据的方式,取值范围如下: public enum DatabaseOperation { UPDATE, INSERT,...其实如果数据库不支持事务的化,当前面说的type值为REFRESH时,由dbunit实现事务将会非常复杂,因为这意味着dbunit不仅仅需要考虑单测前数据表中的数据,还得考虑单测过程中对数据表所做的修改...@Test public void test() { //执行数据表操作,此处略 } 当我们将DatabaseSetup的操作方式(type)改成refresh后,我们必须要在...当DatabaseSetup的操作方式(type)改成refresh后dbunit执行过程可以总结如下: 第一步:如果单测配置了事务则开启事务;否则没有第一步; 第二步:将@DatabaseSetup...注解对应的数据初始化到数据表中,已存在的数据字段被更新,不存在的数据则插入; 第三步:执行单测里的数据表操作; 第四步:执行sql语句将数据表中对应的数据查出来,和@ExpectedDatabase注解中的数据进行匹配验证

73340

测试工具中的设计模式之组合模式

在笔者之前一篇介绍策略模式案例II-看DBRider如何导入数据的文章中有提到为了支持某些操作的组合,在这个策略模式中还混合使用了组合模式。 首先还是通过策略模式来看一下类图。 ?...组合模式依据树形结构组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。...由于这是一个关于结构型的设计模式,是一个比较静态的呈现,会让人感觉有些抽象,以下是笔者从知乎上面一篇文章中抠的一张图,通过UML序列图的方式表达组合模式,就更为直观了。 ?...前面有提到@DataSet注解有一个strategy属性,指定了若干的数据集插入数据库的策略,这主要是通过SeedStrategy 这个枚举类实现的。...INSERT操作

49610

DBUnit数据库测试

DBUnit数据库测试: DBUnit一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象和封装。...我们先单纯用JUnit做一个普通的数据库测试,以此查看这种测试的弊端。 1.准备一个有些许数据的数据库表格: ?  ...4.编写一个类,用于将Student属性数据写入到数据库,这个类具有更新、插入、删除、查询数据的方法: ? ? ? ? 5.编写测试类,进行测试,在这里我只测试了插入数据方法: ? ?...先介绍一下DatabaseOperation类,该类是一个抽象类代表了对数据库的操作,例如CUD以及其组合等, 它采用了退化的工厂模式,可直接通过它获取其具体的子类,使用这个类可以在测试完后还原数据库的表格数据...: DatabaseOperation: NONE:不执行任何操作,是getTearDownOperation的默认返回值。

95720

DataSet导入三个坑

如果在数据库中插入该表的记录,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值。...往往就会产生冲突, 1)导入记录中需指定自增ID的主键值,以保证被导入数据的完整性。 2)待导入的数据源自数据库之前的某一次导出的数据集。随后数据库经历了反复插入删除等操作后,自增主键值已经向后偏移。...例如针对某个场景有多个测试用例需要导入数据导同一个表。后续用例的执行上下文于是受到了前面执行用例的影响。...其次是在数据导入时的问题,DBUnit一个著名的bug是在导入XML、CSV格式的文件时,如果待导入文件的第一条记录的Nullable列的数据正好是Null,那么DBUnit会忽略该列,整列数据都会被丢失...解决办法2:XML导入时指定DTD DBUnit给出的一个解决办法是,在导出XML文件的同时,再导出一份XML_DTD,指明数据库的列。导入数据时,利用DTD指定数据列,如下例: <!

1.1K10

数据库测试的新选择Database-Rider

()); FlatXmlDataSet.write(dataset, new FileOutputStream(file)); 上述操作完成了将数据库内容导出到了一个DBUnit自定义的...另外,DBUnit还提供了在数据库读取、插入数据时的操作 DatabaseOperation.UPDATE DatabaseOperation.DELETE DatabaseOperation.DELETE_ALL...随着Spring框架逐步成为MVC开发模式的事实上的标准,统治JAVA WEB类的项目,基于注解的开发方式流行了开来。...基本上所有的数据库操作都可以通过注解完成,如下例: @Test @DataSet(transactional=true) @ExpectedDataSet(value = "yml...劣势- 又一个轮子,期待合体 本质上这还是基于DBUnit一个新轮子,包含了DBUnit使用中会遇到的所有的坑(这个足够写比本文长3倍的文章吐槽)。其实造一个新轮子,不如把旧轮子焕新。

1.2K40

告别祈祷式编程|单元测试在项目里的正确落地姿势

对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。...「好处:」 可以使用单元测试完成模块功能的一个测试 使用单元测试可以更好的完成模块的回归测试 「在开发中一般要进行如下测试:」 单元测试:一般情况下就是完成我们模块功能的一个检测 回归测试:当我们开发好一个功能之后...) @After //对象销毁的时候用的 @AfterClass //对象销毁的时候用的(只是执行一次) @Test(expected=xxx.class、timeout=...5000) (测试:期望出现某一类异常) 3、Hamcrest的使用(Junit的一个补充) 「使用原因:」 使用过Junit的应该有体验:在实际开发中,一些基本的断言,equal,null,true...的使用 「主要用途:」 dbunit是专门用来测试DAO层的,以后开发中DAO的测试就可以使用dbunit进行 「使用流程:」 备份所有的表 private void backAllTable(

1.2K30

告别祈祷式编程|单元测试在项目里的正确落地姿势

对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。...「好处:」 可以使用单元测试完成模块功能的一个测试 使用单元测试可以更好的完成模块的回归测试 「在开发中一般要进行如下测试:」 单元测试:一般情况下就是完成我们模块功能的一个检测 回归测试:当我们开发好一个功能之后...) @After //对象销毁的时候用的 @AfterClass //对象销毁的时候用的(只是执行一次) @Test(expected=xxx.class、timeout=...5000) (测试:期望出现某一类异常) 3、Hamcrest的使用(Junit的一个补充) 「使用原因:」 使用过Junit的应该有体验:在实际开发中,一些基本的断言,equal,null,true...的使用 「主要用途:」 dbunit是专门用来测试DAO层的,以后开发中DAO的测试就可以使用dbunit进行 「使用流程:」 备份所有的表 private void backAllTable(

1.3K10

有赞单元测试实践

构造参数及打桩(stub):调用方法需要传递入参,有时候一个入参十几个参数需要 set,set 方法写完,代码已经写了十行了。 执行测试:这一步比较简单,直接调用被测方法即可。...2.3 单元测试结果校验缺失 例如一个 SaveItem() 接口,执行完成后除了要验证执行成功以外,还应该验证落库数据的正确性,而编写这部分测试代码需要大量的使用原生 jdbc 接口查询 sql,并逐字段验证正确性...4.1 数据准备 单测依赖的 Db 数据,通过添加测试方法监听器,在 Junit 执行前通过 DbUnit 工具类,加载初始化文件,写入 H2 数据库;单测的入参,通过 param.json 文件,以...enablePrepare 声明需要准备数据,prepareDateConfig 声明数据准备的文件路径,prepareDateType 是数据准备的类型,xml -> DB,当然也支持更多的文件类型,...,这个需要编写者自行验证,另一个是写入数据库的值,这部分是通过在方法上添加注解,告诉单元测试框架要验证的语句,执行验证语句并与期望值比较。

3.3K30

数据库断言的8种姿势-基于DBRider

数据的某些列,时间戳、序列号 数据表的某些列中的数据,在自动化用例每次执行时,可能其结果是会变化的。如以下的两个场景 在很多金融系统的应用中,要求记录操作的人员和时间来作为后续的审核用。...由于用例执行时间的不同,每次得的结果会不一样。 另外,在进行创建新的申请、下一个订单等类型的操作时,通常都会给记录一个序列号。...由于自动化用例在执行时,可能没有去重置Sequence或者用例执行的顺序不一致,导致获取到的序列号也会各不相同。...DBRider还提供了DateTimeReplacer解决一部分日期时间替换的问题,这样前述提到的操作日期等数据列也可以实现断言了。...新建一个用户A,则会比较该用户是否在User表中,至于User表中的其它内容,则不需要比较或者无法比较(如其它用例中也新建了用户,影响了User表的内容且未回退)。

1.4K10

这些测试工具和框架你了解吗

3 Selenium Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。...官网:http://rest-assured.io/ 5 Mockito 一般使用Mockito的步骤: 模拟任何外部依赖并将这些模拟对象插入测试代码中 执行测试中的代码 验证代码是否按照预期执行...还有一个 Spring Test DbUnit,它集成了 Spring Test 框架和 DbUnit;以及 Spring Test MVC HtmlUnit,集成了 Spring Test MVC 框架和...你可以使用它测试分布式异构应用程序,其中验证需要涉及多种技术,可用于前端, 服务端, 接口, 移动端等的自动化测试解决一体式方案....它还能够将压缩包部署到容器中,并在容器中执行测试并捕获结果并创建报告。 Arquillian集成了熟悉的测试框架,JUnit 4、TestNG 5,并允许使用现有的IDE启动测试。

2.2K20

确定能搞懂幻读?

我们这里所说的事务大多数是指数据的事务,事务是指一个业务操作一个业务操作内部包含多个小的子操作,这些操作要目全部一起执行成功,要么全部执行失败,不存在说一部分成功一部分失败的情况。...3、隔离性(Isolation) 多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 4、持久性(Durability) 已被提交的事务对数据库的修改应该永久保存在数据库中 何为脏读?...一个事务在执行的过程中读取到了其他事务还没有提交的数据。 这个还是比较好理解的。 何为读已提交 从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。...事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读) 何为可重复读 一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的。...何为幻读 脏读、不可重复读、可重复读、幻读,其中最难理解的是幻读 以mysql为例: 幻读在可重复读的模式下才会出现,其他隔离级别中不会出现 幻读现象例子: 可重复读模式下,比如有个用户表,手机号码为主键

54010

数据库测试-上下文控制

"" strategy DataSet 数据文件的导入策略,这一部分是与DBUnit保持一致的,包括了: CLEAN_INSERT, TRUNCATE_INSERT, INSERT,REFRESH and...false executeStatementsBefore 用例执行前可以先执行SQL语句,类似的还有executeScriptsBefore {} executeStatementsAfter 用例执行后再执行指定的...SQL语句,类似的还有executeScriptsAfter {} 那么这个@dataset注解提供的这么多操作,在导入数据的过程中是如何执行的呢?...在真正导入数据的操作执行前,会执行以下操作, DisableConstraints CleanBefore ExecuteStatementsBefore ExecuteScriptsBefore 而在...DataSet执行过程中,为了对数据进行一些处理,还会依次执行以下的操作 performSequenceFiltering(dataSetConfig, resultingDataSet); performTableOrdering

55310

爬虫入门指南(2):如何使用正则表达式进行数据提取和处理

正则表达式 正则表达式是一种用于匹配和处理文本的工具,可以定义规则和模式查找、替换和提取目标数据。Python中内置的re模块可用于操作正则表达式。 正则表达式中常用的元字符和特殊序列 ....如果re.search()函数找到了匹配的结果,它将返回一个Match对象,否则返回None。 接着,使用条件语句if match检查是否找到了匹配结果。如果找到了匹配,就执行以下代码块。...在Python中,我们可以使用相应的数据库驱动程序(mysql-connector-python、sqlite3和pymongo)连接数据库并执行操作。...插入数据: 使用INSERT INTO语句插入新的数据行。指定表格名称和要插入的值。你可以插入指定的列或者省略列名插入所有列。...然后,我们定义了一条SQL语句,用于向名为"users"的表中插入数据。最后,我们使用cursor.executemany()方法批量执行插入操作,并通过conn.commit()保存更改。

19710

MySQL8.0实战(二) - 数据库设计

1 简介 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。...4.2 模式的适用场景 配合列存储的数据报表应用 由于宽表中,所有数据存在于一个表中,因此在查询时,无需多表查询,SQL执行效率较高,且存在的上述问题在报表应用中都不是大问题 既然宽表不适合我们的当前业务...是不是只能用课程章节的PK记录呢?...&章节联系表合并 成为新的课程章节表 [主标题,章节名](PK),说明,章节编号 虽然违反了第二范式,但是减少了一个表的查询,提高了查询性能,在频繁查询操作的系统中,这很值得!...内容综述 数据库的逻辑设计规范 MySQL的常用存储引擎及其选择方法 MySQL的常用数据类型及其选择方法 如何为表选择适合的存储类型 如何为表起一个好名 参考 数据库设计 MySQL慎用 ENUM

59721

Spring认证中国教育管理中心-Spring Data MongoDB教程三

插入和保存操作之间的区别在于,如果对象尚不存在,则保存操作执行插入操作。 使用保存操作的简单情况是保存一个 POJO。在这种情况下,集合名称由类的名称(非完全限定)确定。...您还可以使用特定的集合名称调用保存操作。您可以使用映射元数据覆盖存储对象的集合。 插入或保存时,如果Id未设置该属性,则假设其值将由数据库自动生成。...您可以通过为@Document注释提供不同的集合名称对此进行自定义。您还可以通过提供您自己的集合名称作为所选MongoTemplate方法调用的最后一个参数来覆盖集合名称。...insertAll:将一个Collection对象作为第一个参数。此方法根据之前指定的规则检查每个对象并将其插入到适当的集合中。 save:保存对象,覆盖任何可能具有相同id....“更新”集合中的文档 与执行updateFirst操作相关,您还可以执行“upsert”操作,如果找不到与查询匹配的文档,它将执行插入操作插入的文档是查询文档和更新文档的组合。

2.1K10

PHPUnit 手册【笔记】

* --testsuite,只运行名称与给定模式匹配的测试套件 * --group,只运行来自指定分组(可以多个)的测试。...* --stop-on-incomplete,首次碰到不完整的测试时停止执行 * --verbose,输出更详尽的信息,如不完整或跳过的测试的名称 * --debug,输出调试信息,一个测试开始执行时输出其名称...* 验证结果 * 拆除基境(fixture) 2.数据库扩展进行测试的流程: * 清理数据库:在所有表上执行TRUNCATE操作清空 * 建立基境:将迭代所有指定的基境数据行并将其插入到对应的表里...XML、YAML、CSV文件或者PHP数组等方式表达 3.在测试中,数据库断言的工作流由三个步骤组成: * 用表名称指定数据库中的一个或多个表(实际上是指定一个数据集) * 用你喜欢的格式(YAML...实例,需要为其指定名称和所使用的SQL查询,当涉及到结果/表的断言这个方法会很方便 * getRowCount()提供了一种方便的方式取得表中的行数,并且还可以选择附加一个WHERE子句在计数前对数据行进行过滤

1.7K40

Visual Studio 2005 IDE 技巧和窍门

在“Command”属性中为快捷方式所要绑定的命令指定规范的命令名称。“Scope”属性总是为“Global”,因此这里不再赘述。此操作过程中最困难的部分可能就是确定特定命令的规范名称。...图 6 显示了我是如何为这个窗口布局布置工具窗口的,不过您可以随意将其调整为您喜欢的方式。然后,转到“工具”>“导入和导出设置”,启动“导入和导出设置向导”。...它可以避免单调乏味的输入过程(例如键入 for 循环),使您能够快速插入代码段,它还可以提供可完成特定任务(通过网络发送数据)的模板。...我将通过一个示例说明如何操作。我经常会编写一些应急的实用程序帮助我完成工作。其中的许多实用程序都有通用的模式:打开某个文件,执行一些处理,然后关闭该文件。以下是我的代码段的创建步骤。...>“环境”>“导入和导出设置”完成此操作。选择(选中)“使用团队设置文件”复选框,指定团队设置文件的路径。 图 12.

2.1K40
领券