暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用JOOQ实现数据库自动化

原创 eternity 2022-09-26
541

本文将研究如何使用Java中的JOOQ库在End 2 End自动化中自动化数据库交互。

当我们对应用程序进行End 2 End自动化时,我们通常考虑2个部分。

  • 输入部分:(像UI前端这样的应用程序的入口点。)

  • 输出部分:(应用程序的存储点,如数据库后端。)

整个应用程序如下所示:

1661490799205.png

在End 2End自动化透视图中,用户通过UI前端输入数据,业务逻辑获取数据以执行所有业务操作。最终输出数据存储在数据库中。在自动化脚本中,我们必须自动化输入部分和输出验证部分。

我们的最终目标是用预期数据验证输出数据,以便我们首先从数据库中获取数据进行验证;这里的JOOQ库帮助我们以一种简单易行的方式与数据库交互。

市场上有很多工具可以帮助输入UI自动化意味着UI前端应用程序,但当我们必须自动化应用程序的输出数据库端时,选项非常有限。

JOOQ库帮助我们实现了自动化数据库部分

使用JOOQ库,我们可以轻松编写在End 2 End应用程序自动化中使用的数据库交互代码。

在下面的部分中,我将演示使用JOOQ的数据库交互代码。

先决条件:

1.我们需要一个包含一些应用程序数据的数据库。

对于本例,我们使用的是H2数据库,因此请根据您的操作系统下载并安装H2数据库。

2.使用以下SQL脚本创建虚拟表和虚拟数据:

CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
);

INSERT INTO PERSONS (PersonID, LastName, FirstName, Address,City) VALUES (1, 'TOM', 'CHERRY', 'NOIDA','DELHI');
INSERT INTO PERSONS (PersonID, LastName, FirstName, Address, City) VALUES (2, 'TOMMY', 'SUNNY', 'NOIDA','DELHI');
复制

H2数据库:

1661488187605.png

3.创建maven java项目并添加以下依赖项:

<dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.21</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.jooq/jooq -->
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq</artifactId>
            <version>3.17.3</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>  
复制

数据库自动化JOOQ

要连接数据库,我们必须首先创建一个文件,在其中可以保存与数据库相关的所有信息,如URL、用户名和密码等。为此,我们创建了“database.yaml”,并将其放在资源文件夹下。

1661340049107.png

要读取yaml文件,我们使用snake yaml库。

package yaml;


import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

import java.io.InputStream;

public class YamlFileReader {

    public DBYamlModel getYamlData()  {
        Yaml yaml = new Yaml(new Constructor(DBYamlModel.class));
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("database.yaml");
        DBYamlModel db = yaml.load(inputStream);
        return db;
    }
}
复制

使用public ResultgJOOQ库中,我们编写了一些方法来从数据库中获取数据。

public Result<Record> getQueryResult(String sqlQuery) throws SQLException {
    try (Connection c = getDBConnection()) {
        return DSL.using(c).fetch(sqlQuery);
    }
}

public <T> List<T> getQueryResultWithType(String sqlQuery, Class<T> className) throws SQLException {
   return getQueryResult(sqlQuery)
            .stream().map(e -> e.into(className)).toList();

}
复制

请参阅连接H2数据库并使用SQL查询获取数据的完整代码:

package database;

import org.jooq.Result;
import org.jooq.Record;
import org.jooq.impl.DSL;
import yaml.DBYamlModel;
import yaml.YamlFileReader;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

public class DatabaseUtil {


    private Connection getDBConnection() throws SQLException {
        YamlFileReader yamlFileReader = new YamlFileReader();
        DBYamlModel yamlData = yamlFileReader.getYamlData();
        return DriverManager.getConnection(
                yamlData.getUrl(),
                yamlData.getUsername(),
                yamlData.getPassword());

    }


    public Result<Record> getQueryResult(String sqlQuery) throws SQLException {
        try (Connection c = getDBConnection()) {
            return DSL.using(c).fetch(sqlQuery);
        }
    }

    public <T> List<T> getQueryResultWithType(String sqlQuery, Class<T> className) throws SQLException {
       return getQueryResult(sqlQuery)
                .stream().map(e -> e.into(className)).toList();

    }

}

复制

这是一个java类,我们在其中显示一个查询的最终数据库输出结果。

package database;

public class DBQueryTesting {

    public static void main(String[] args) throws Exception {
        String sqlQuery = "Select * from Persons";
        DatabaseUtil databaseUtil = new DatabaseUtil();
        
        databaseUtil
                .getQueryResult(sqlQuery)
                .forEach(System.out::println);
    }
}
复制

有一种方法可以将数据库结果响应转换为java类。

例如,我们有一个带有5列的数据库表PERSONS,因此我们创建了一个带有示例字段的Person记录。现在,我们可以轻松地将数据库响应映射到java代码,并且只能使用java字段获取列值。

public record Persons(Integer Id,String LastName,String FirstName, String Address, String City) {
}
复制
package database;
import Data.Persons;

public class DBQueryTesting {

    public static void main(String[] args) throws Exception {
        String sqlQuery = "Select * from Persons";
        DatabaseUtil databaseUtil = new DatabaseUtil();

        databaseUtil
                .getQueryResultWithType(sqlQuery, Persons.class)
                .forEach(System.out::println);

    }

}
复制

这是一种我们可以编写数据库交互代码的方法,我们可以在End 2 End自动化中使用它,我们从数据库中获取数据并执行数据验证。

import Data.Persons;
import database.DatabaseUtil;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.sql.SQLException;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class DBCheckTest {
    DatabaseUtil databaseUtil;

    @BeforeEach
    void setUp(){
        databaseUtil = new DatabaseUtil();
    }

    @DisplayName("Test the Persons table should contains one record with Firstname as CHERRY")
    @Test
    void testPersonsFirstName() throws SQLException {
        String sqlQuery = "Select * from Persons";
        List<Persons> persons=databaseUtil.getQueryResultWithType(sqlQuery, Persons.class).stream()
                .filter(e ->e.FirstName().equals("CHERRY")).toList();

        assertEquals(1, persons.size());
        assertEquals("TOM", persons.get(0).LastName());
    }

    @DisplayName("Test the Persons table should contains two record with city as DELHI")
    @Test
    void testPersonsCityCount() throws SQLException {
        String sqlQuery = "Select * from Persons";
        List<Persons> persons=databaseUtil.getQueryResultWithType(sqlQuery, Persons.class).stream()
                .filter(e ->e.City().equals("DELHI")).toList();

        assertEquals(2, persons.size());
    }

}
复制

请查找GitHub回购。

这只是一个小例子。JOOQ支持的特性太多了。

JOOQ库以函数风格提供了如此多的方法、类和操作,这确实有助于我们以简单、简单和简洁的方式编写代码,以便每个人都能轻松理解业务上下文。

原文标题:Database Automation with JOOQ
原文作者:Ravi Kumar
原文链接:https://dzone.com/articles/e2e-automation-database-with-jooq

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论