zoukankan      html  css  js  c++  java
  • h2数据库

    使用h2数据库进行单元测试

    一、下载h2数据库

    官网:http://www.h2database.com/html/main.html
    下载完成后解压,找到bin目录下的h2.bat打开h2数据库
    添加参数jdbc:h2:~/test;AUTO_SERVER=TRUE
    如下图:

    输入用户名密码登入h2数据库
    打开完成后,右下角工具栏会出现h2的图标

    二、准备数据库文件

    1. 将之前的数据库导出为sql文件,使用数据传输功能导出为文件
    2. 将sql文件中有主外键关系的建表顺序修改合适,
    3. 文件头添加SET FOREIGN_KEY_CHECKS=0;来取消主外键的影响,(建表和插入)
    4. 删掉sql文件中的USING BTREE ,防止建表失败

    三、项目中配置h2

    1. pom.xml中配置maven
        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
          <groupId>com.h2database</groupId>
          <artifactId>h2</artifactId>
          <version>1.4.200</version>
          <scope>test</scope>
        </dependency>
    
    1. 新建testresources
    2. 将sql文件放入testresouces文件夹中
    3. 新建.proterties配置文件,配置其中的内容 ,这里使用的是jdbc.properties
    driver=org.h2.Driver
    url=jdbc:h2:mem:default;MODE=MySQL;INIT=RUNSCRIPT FROM 'classpath:uolab817.sql'
    username = root
    password = root
    

    注意 URL后面要加 jdbc:h2:~/test;AUTO_SERVER=TRUE AUTO_SERVER =TRUE
    多个进程可以访问同一个数据库,而不必手动启动服务器。为此,添加.....。无论数据库是否已经打开,您都可以使用相同的数据库网址。

    这里要说到一个单元测试时读取文件的机制:
    先从单元测试的目录文件资源testresoueces去找数据库连接文件 否则会回去找resources目录下的数据库连接文件

    四、配置junit5

    1. pom.xml中配置
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.5.2</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.junit.platform</groupId>
          <artifactId>junit-platform-runner</artifactId>
          <version>1.5.1</version>
        </dependency>
    
    1. 新建AllTest()测试类
    @RunWith(JUnitPlatform.class)
    @SelectPackages("com.ychs.dao")
    @SelectClasses(
    //选择之后会按照顺序来执行
            {CollegeMapperTest.class,
            MajorMapperTest.class,
            ClazzMapperTest.class,
            MemberMapperTest.class,
            }
    public class AllTest {
    
    }
    
    1. junit5断言时使用Assertions而不是Assert
    2. 注意junit5的导包:
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    

    junit5提供了displayName来备注

    h2数据库不支持MySql的一些语法:

    // 不支持时间格式化format函数DATE_FORMAT(take_time,'%Y-%m') = #{takeTime},使用范围来代替
    take_date &gt;'${takeDate}-01' AND take_date &lt;'${takeDate}-31'
    

    如果连接数据库失败:

    1.注释掉test
    2.Maven的问题 打开repository文件夹 找到h2需要的jar包 在IDEA下面新建一个lib文件夹 将jar包粘贴 并在工程结构中重构。再执行
    断言 不管插入多少条 永远是1 但如果用MySQL 不断向数据库插入信息,无法保证断言时存在的值是否为1
    @before
    @after 来恢复原始数据库内容
    最后运行时要运行整个test类 实现执行完整个测试文件断言全部显示为1.

    h2数据库在每次获得一个新的session时,都会删库,新建库,用h2数据库测试时不要关闭session

    工具类应该如下:

    package com.ychs.util;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * copyright(c)2020 YCKJ.ALL rights Reserved
     * <p>
     * 描述: session 工具类
     *
     * @author caoning
     * @version 1.0
     * @date 2020.7.23
     */
    public class Dbutil {
        private static Logger logger = LogManager.getLogger(Dbutil.class);
        static SqlSessionFactory sqlSessionFactory = null;
        private static SqlSession session = null;
        //静态初始化块,只执行一次
        static {
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                logger.error("初始化数据库连接失败", e);
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }
        }
    
        public static SqlSession getSession() {
            if(session != null){
                return session;
            } else if (sqlSessionFactory != null) {
                session = sqlSessionFactory.openSession();
                return session;
            } else {
                return null;
            }
        }
    
    }
    
  • 相关阅读:
    快速求平方根,这个好牛逼
    学一下gconv, gprof等知识
    sigprocmask, sigpending, sigsuspend的用法
    boost::asio与ACE的对比
    类模版静态成员初始化
    C++虚表的原理,很好
    valgrind的说明使用和原理
    reactor与proactor模式
    三种new
    iterator的使用和封个问题
  • 原文地址:https://www.cnblogs.com/cn9826/p/13500409.html
Copyright © 2011-2022 走看看