IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> H2单元测试与业务数据隔离之内嵌模式 -> 正文阅读

[开发测试]H2单元测试与业务数据隔离之内嵌模式

目录

H2支持数据库模型

URL编写构造器

H2Helper用于建表、插入和查询操作

单元测试示例


在日常编码过程中,单元测试作为代码的质量校验最重要的手段之一,必须做好数据隔离和代码充分的测试。数据侵入会造成测试困扰。为规范日常单元测试,通常使用H2内存数据库来实现单元测试数据库数据持久化校验。h2分为三种使用场景:内嵌模式、服务器模式和混合模式。本篇讲述的是内嵌模式。

H2支持数据库模型

h2支持的数据库模型如下

 public static enum ModeEnum {
        REGULAR,
        DB2,
        Derby,
        MSSQLServer,
        HSQLDB,
        MySQL,
        Oracle,
        PostgreSQL,
        Ignite;

        private ModeEnum() {
        }
    }

URL编写构造器

下面是本地化的文件和内存数据库实现的Builder

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class H2URLBuilder {

    final String start="jdbc:h2:";
    Mode.ModeEnum mode;
    String scriptPath;
    boolean isInit;
    boolean isDbCloseDelay;

    public String getURL(){
        StringBuilder sb = new StringBuilder();
        sb.append(start).append(isInit?"~/test":"mem:test");
        if(null == mode){
            throw  new UnsupportedOperationException("mode can not be null");
        }
        sb.append(";MODE=").append(mode);
        if(isInit){
            if(StringUtils.isNullOrEmpty(scriptPath)){
                throw  new UnsupportedOperationException("scriptPath is null you need set " +
                        " like ./src/test/resources/createTable.sql");
            }
            sb.append(";INIT=runscript from '").append(scriptPath).append("'");
        }
        if(isDbCloseDelay){
            sb.append(";DB_CLOSE_DELAY=-1");
        }
        return sb.toString();
    }
}

H2Helper用于建表、插入和查询操作

@Slf4j
public class H2Helper {

    /**
     * getJdbcTemplate
     * @param dataSource
     * @return
     */
    public static JdbcTemplate getJdbcTemplate(DataSource dataSource){
        Assert.notNull(dataSource,"dataSource is null");
        return new JdbcTemplate(dataSource);
    }

    /**
     * getJdbcTemplate
     * @param builder
     * @return
     */
    public static JdbcTemplate getJdbcTemplate(H2URLBuilder builder){
        DataSource dataSource = H2Helper.getDataSource(builder);
        Assert.notNull(dataSource,"dataSource is null");
        return new JdbcTemplate(dataSource);
    }

    /**
     * getDataSource
     * @return
     */
    public static DataSource getDataSource(H2URLBuilder builder){
        JdbcDataSource ds = new JdbcDataSource();
        String url = builder.getURL();
        log.debug("URL--->{}",url);
        ds.setURL(url);
        ds.setUser("sa");
        ds.setPassword("");
        return ds;
    }

    /**
     * createTable
     * @param jdbcTemplate
     * @param sql
     */
    public static void createOrDropTable(JdbcTemplate jdbcTemplate,String sql){
        try (Connection connection = jdbcTemplate.getDataSource().getConnection()){
            TransactionSynchronizationManager.initSynchronization();
            connection.setAutoCommit(false);
            jdbcTemplate.execute(sql);
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            TransactionSynchronizationManager.clearSynchronization();
        }
    }

    /**
     * save
     * @param jdbcTemplate
     * @param sql
     * @param args
     */
    public static void save(JdbcTemplate jdbcTemplate,String sql,Object[] args){
        try (Connection connection = jdbcTemplate.getDataSource().getConnection()){
            TransactionSynchronizationManager.initSynchronization();
            connection.setAutoCommit(false);
            jdbcTemplate.update(sql,args);
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            TransactionSynchronizationManager.clearSynchronization();
        }
    }

    /**
     * query
     * @param jdbcTemplate
     * @param sql
     * @param args
     * @return
     */
    public static List<Map<String,Object>> select(JdbcTemplate jdbcTemplate,String sql,Object[] args){
        List<Map<String,Object>> queryForList =jdbcTemplate.queryForList(sql,args);
        Assert.notNull(queryForList,"queryForList is null");
        return queryForList;
    }
}

单元测试示例

此处测试脚本文件和内存建库操作

@Slf4j
@SpringBootTest
public class H2HelperTest {

    String insert = "insert into `user`(id,name,mobile) values(?,?,?) ";

    String select = "select * from `user`";

    Object [] args = new Object[]{"id_test","name_test","mobile_test"};

    @Test
    public void initMode(){
        H2URLBuilder builder = H2URLBuilder.builder()
                .isInit(true)
                .mode(Mode.ModeEnum.MySQL)
                .scriptPath("./src/test/resources/createTable.sql")
                .build();
        DataSource dataSource =H2Helper.getDataSource(builder);
        Assert.notNull(dataSource,"dataSource is null");

        JdbcTemplate jdbcTemplate = H2Helper.getJdbcTemplate(builder);
        // save
        H2Helper.save(jdbcTemplate,insert,args);
        // query
        H2Helper.select(jdbcTemplate,select,null);
    }

    @Test
    public void memMode(){
        H2URLBuilder builder = H2URLBuilder.builder()
                .isInit(false)
                .mode(Mode.ModeEnum.MySQL)
                .build();
        DataSource dataSource =H2Helper.getDataSource(builder);
        Assert.notNull(dataSource,"dataSource is null");

        JdbcTemplate jdbcTemplate = H2Helper.getJdbcTemplate(builder);
        String createTable = "CREATE TABLE `user`  (\n" +
                " `id` char(32)  NOT NULL,\n" +
                " `name` varchar(255)  NOT NULL,\n" +
                " `mobile` varchar(64) DEFAULT NULL\n" +
                ")";
        // createTable
        H2Helper.createOrDropTable(jdbcTemplate,"DROP TABLE IF EXISTS `user`");
        H2Helper.createOrDropTable(jdbcTemplate,createTable);
        // save
        H2Helper.save(jdbcTemplate,insert,args);
        // query
        H2Helper.select(jdbcTemplate,select,null);
    }
}

测试结果:

参考文章:运行模式 · leaning-h2

?项目地址:daily-code-cache: Spring cache的相关使用。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:12:40  更:2022-04-18 18:13:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 15:34:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码