当前位置: 首页 > news >正文

温州建设信息港网站西安注册公司费用

温州建设信息港网站,西安注册公司费用,中文网站排行榜,上海环球金融中心观光厅引言 在执行单元测试时#xff0c;可以使用诸如H2内存数据库替代线上的Mysql数据库等#xff0c;如此在执行单元测试时就能尽可能模拟真实环境的SQL执行#xff0c;同时也无需依赖线上数据库#xff0c;增加了测试用例执行环境的可移植性。而使用H2数据库时#xff0c;通…引言 在执行单元测试时可以使用诸如H2内存数据库替代线上的Mysql数据库等如此在执行单元测试时就能尽可能模拟真实环境的SQL执行同时也无需依赖线上数据库增加了测试用例执行环境的可移植性。而使用H2数据库时通常会在执行单元测试前先初始化数据库即执行SQL脚本来对H2内存数据库进行初始化。 例如可通过如下配置指定H2的初始化脚本 注 如下配置中的 spring.sql.init.schema-locations spring.sql.init.data-locations 即对应数据库schematable定义、data数据插入的导入脚本。 spring:# Sql初始化配置sql:init:# 导入h2 table定义schema-locations: classpath:h2/demo-schema.sql# 导入h2 数据定义data-locations: classpath:h2/demo-data.sql# 数据库配置datasource:type: com.zaxxer.hikari.HikariDataSource# # 使用H2内存数据库 # driver-class-name: org.h2.Driver# 使用h2内存数据以mysql兼容模式运行url: jdbc:h2:mem:rbac;MODEMySQL;DATABASE_TO_LOWERTRUEusername: rootpassword: 123456相关SQL脚本示例如下 -- h2/demo-schema.sql定义 -- 注意create table前都先执行drop table脚本如此便可保证Sql脚本可以被覆盖执行 DROP TABLE IF EXISTS category; CREATE TABLE category (id bigint(20) NOT NULL COMMENT 主键ID,parent_category_id bigint(20) DEFAULT NULL COMMENT 上级分类ID,category_name varchar(64) NOT NULL COMMENT 分类名称,category_desc varchar(512) DEFAULT NULL COMMENT 分类描述,create_time datetime NOT NULL COMMENT 创建时间,update_time datetime DEFAULT NULL COMMENT 修改时间 ) ENGINE InnoDB;-- ------------------------------------------------------------------------ -- h2/demo-data.sql定义 -- 注意先执行schema定义sql再执行data定义sql多个sql脚本需考虑好先后执行顺序 INSERT INTO category (id, parent_category_id, category_name, category_desc, create_time, update_time) VALUES ( 1, null, 分类1, 查询测试专用数据, 2023-01-01T15:58:04.105, 2023-01-07T15:58:04.105), ( 11, 1, 分类1-1, 分类1-1描述, 2023-01-02T15:58:04.105, 2023-01-07T15:58:04.105); 但问题是如上SQL初始化配置会在Spring环境启动时仅执行一次后续的单元测试都是作用在这同一套脚本的基础之上不同的单元测试都对这套基础数据进行修改之后可能会导致数据混乱进而导致单元测试执行失败。 比较理想的状态就是在每个单元测试方法执行之前都执行一遍数据库初始化如此便能保证每个单元测试方法执行前的数据库数据都是固定的不受其他单元测试的影响如此在编写单元测试时都以统一的基础数据为基准无需考虑前后单元测试间的数据依赖减轻了单元测试方法的开发难度。 接下来本文主要介绍两种在每次单元测试方法执行前都会通过SQL脚本对数据库进行始化的方式。 方式1 Sql 可在单元测试类 或者 单元测试方法上使用Sql注解 import org.springframework.test.context.jdbc.Sql;Sql(//SQL初始化脚本会按照数组声明顺序依次执行Sql脚本scripts {classpath:h2/schema.sql,classpath:h2/data.sql},//SQL初始化执行阶段(BEFORE_TEST_METHOD: 测试方法执行前, AFTER_TEST_METHOD: 测试方法执行后)executionPhase Sql.ExecutionPhase.BEFORE_TEST_METHOD ) SpringBootTest public class MyBizTest {//具体方法上也可使用Sql注解此处Sql定义会覆盖类上的Sql//可通过在测试方法 或 测试类上 使用SqlMergeMode(MergeMode.OVERRIDE|MERGE)来设置方法的Sql是覆盖、还是合并类上的SqlTestvoid testMyBiz() {//......} }如果定义了基础测试类也可将Sql直接定义在基础测试类上 import org.springframework.test.context.jdbc.Sql;Sql(//SQL初始化脚本会按照数组声明顺序依次执行Sql脚本scripts {classpath:rbac-h2/schema.sql,classpath:rbac-h2/data.sql},//SQL初始化执行阶段(BEFORE_TEST_METHOD: 方法执行前, AFTER_TEST_METHOD: 方法执行后)executionPhase Sql.ExecutionPhase.BEFORE_TEST_METHOD ) SpringBootTest public class BaseTest {//...... }---public class MyBizTest extends BaseTest {Testvoid testMyBiz() {//......} }对Sql的支持是由org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener提供的并且它是默认启用的。 关于Sql、SqlConfig、SqlMergeMode、SqlGroup的更多使用可参见 https://docs.spring.io/spring-framework/docs/5.3.29/reference/html/testing.html#testcontext-executing-sql-declaratively 方式2ResourceDatabasePopulator 除了通过注解的方式也可以通过编程的方式执行数据库初始脚本。Spring提供了如下执行SQL脚本的工具类 org.springframework.jdbc.datasource.init.ScriptUtilsorg.springframework.jdbc.datasource.init.ResourceDatabasePopulatororg.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTestsorg.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests ScriptUtils提供了一组用于处理SQL脚本的静态实用程序方法主要用于框架内部使用。然而如果您需要完全控制SQL脚本的解析和运行方式ScriptUtils可能比稍后介绍的其他一些替代方案更适合您的需求。更多细节请参考ScriptUtils中各个方法的javadoc。 ResourceDatabasePopulator提供了一个基于对象的API通过使用在外部资源中定义的SQL脚本以编程方式填充、初始化或清理数据库。ResourceDatabasePopulator提供了配置在解析和运行脚本时使用的字符编码、语句分隔符、注释分隔符和错误处理标志的选项。每个配置选项都有一个合理的默认值。有关默认值的详细信息请参阅javadoc。要运行在ResourceDatabasePopulator中配置的脚本您可以调用populate(Connection)方法对java.sql.Connection运行populator或者调用execute(DataSource)方法对javax.sql.DataSource运行populator。 ResourceDatabasePopulator在内部委托ScriptUtils解析和运行SQL脚本。类似地AbstractTransactionalJUnit4SpringContextTests和AbstractTransactionalTestNGSpringContextTests中的executeSqlScript(…)方法在内部使用ResourceDatabasePopulator来运行SQL脚本。 如下使用ResourceDatabasePopulator 结合BeforeEach在每个Test方法执行前对数据库进行初始化 SpringBootTest public class MyBizTest {//注入数据源Resourceprivate DataSource dataSource;//BeforeEach即对应没个Test方法执行前//亦可通过BeforeAll指定在每个测试类执行前执行需在测试类上标注TestInstance(TestInstance.Lifecycle.PER_CLASS)BeforeEach public void beforeEachTestMethod() {//声明ResourceDatabasePopulator ResourceDatabasePopulator populator new ResourceDatabasePopulator();//加载SQL脚本此处直接使用ClassPathResource, 所以具体path无需以classpath:开头//会按照数组声明顺序依次执行Sql脚本ClassPathResource[] scriptResources Stream.of(h2/schema.sql,h2/data.sql).map(ClassPathResource::new).toArray(ClassPathResource[]::new);//添加SQL脚本populator.addScripts(scriptResources);//使用数据源执行SQL脚本populator.execute(this.dataSource);}Testvoid testMyBiz() {//......} }如果定义了基础测试类也可将BeforeEach逻辑直接定义在基础测试类上 SpringBootTest public class BaseTest {//注入数据源Resourceprivate DataSource dataSource; //BeforeEach即对应没个Test方法执行前//亦可通过BeforeAll指定在每个测试类执行前执行需在测试类上标注TestInstance(TestInstance.Lifecycle.PER_CLASS)BeforeEach public void beforeEachTestMethod() {//声明ResourceDatabasePopulator ResourceDatabasePopulator populator new ResourceDatabasePopulator();//加载SQL脚本此处直接使用ClassPathResource, 所以具体path无需以classpath:开头//会按照数组声明顺序依次执行Sql脚本ClassPathResource[] scriptResources Stream.of(h2/schema.sql,h2/data.sql).map(ClassPathResource::new).toArray(ClassPathResource[]::new);//添加SQL脚本populator.addScripts(scriptResources);//使用数据源执行SQL脚本populator.execute(this.dataSource);} }---public class MyBizTest extends BaseTest {Testvoid testMyBiz() {//......} }参考 https://docs.spring.io/spring-framework/docs/5.3.29/reference/html/testing.html#testcontext-executing-sql
http://www.zqtcl.cn/news/843923/

相关文章:

  • 汕头市网站建设分站公司站长网站大全
  • c2c的网站名称和网址深圳设计公司办公室
  • 建设银行企业版网站做微网站平台
  • 北京企业网站建设电话长沙建设工程信息网
  • 大型综合门户网站开发扁平化个人网站
  • 怎么做代理人金沙网站长沙 网站运营
  • 商城网站开发的目的和意义鲜花类网站建设策划书范文
  • 什么类型的公司需要做建设网站的iis7 网站权限设置
  • 信誉好的商城网站建设火车头 wordpress 发布
  • 龙岩做网站抚顺 网站建设
  • wordpress怎么设置广告位青州网站优化
  • 网站的备案编号高端网站建设谷美
  • 佛山智能网站建设地址设计资溪做面包招聘的网站
  • 荆州网站建设多少钱国外网站设计理念
  • 网站备案成功后wordpress文字加框
  • 中小企业怎么优化网站西安网站建设求职简历
  • 网站开发者模式怎么打开商城网站建设特点有哪些
  • 网站登录按纽是灰色的做网站的前途怎么样
  • 常州城乡建设局网站霸榜seo
  • 网站响应样式如何制作自己的公众号
  • 网站的友情连接怎么做免费收录链接网
  • 太原网站设计排名wordpress 设置语言
  • 南京模板建站定制网站网站单页面怎么做的
  • 宁夏住房建设厅网站石家庄最新今天消息
  • 写网站软件tomcat部署wordpress
  • 怎么做下载网站吗分析一个网站
  • 网站建设禁止谷歌收录的办法做挂网站
  • 佛山优化网站公司做购物网站需要多少钱
  • 山东网站建设维护营销型网站是什么样的
  • 长沙营销网站建设苏州风险区域最新