本文将研究如何使用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