本文将研究如何使用Java中的JOOQ库在End 2 End自动化中自动化数据库交互。
当我们对应用程序进行End 2 End自动化时,我们通常考虑2个部分。
-
输入部分:(像UI前端这样的应用程序的入口点。)
-
输出部分:(应用程序的存储点,如数据库后端。)
整个应用程序如下所示:

在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数据库:

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”,并将其放在资源文件夹下。

要读取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 Result
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




