[JAVA] Erste Schritte mit DBUnit

Was ist DBUnit?

Sie haben häufig große Probleme beim Erstellen eines Testprogramms für einen Komponententest einer Klasse, die auf die Datenbank verweist oder diese aktualisiert. Die folgenden Probleme treten häufig auf, wenn die Datenbank auf Komponententests überprüft wird.

Daher werde ich ein Framework namens "DBUnit" einführen. DBUnit ist ein Framework zum Erstellen von Testprogrammen für Klassen, die mit Datenbanken arbeiten, und erweitert JUnit.

Es hat Funktionen wie. In diesem Kapitel wird beschrieben, wie Sie mit DBUnit Testklassen beschreiben, die die Datenbankverarbeitung durchführen.

DBUtil-Installation

Wenn es sich um ein Maven-Projekt handelt, können Sie DBUtil verwenden, indem Sie Folgendes in pom.xml schreiben.

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.22</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.dbunit</groupId>
			<artifactId>dbunit</artifactId>
			<version>2.6.0</version>
		</dependency>

JUnit verwendet Version 4.13.

Wenn Sie DBUtil anstelle des Maven-Projekts verwenden möchten, können Sie es verwenden, indem Sie die JAR-Datei über den folgenden Link herunterladen und über den Klassenpfad übergeben. (Obwohl nicht empfohlen) http://www.dbunit.org/

Dieses Mal verwenden wir DBUnit, um Folgendes zu tun:

Erstellen einer Testtabelle

Da wir diesmal die MySQL-Datenbank verwenden, erstellen Sie eine Tabelle mit dem folgenden SQL.

CREATE TABLE user (
  Id INT NOT NULL,
  name  VARCHAR(255) NOT NULL,
  age INT NOT NULL,
  salary INT,
  job_type VARCHAR(20),
  hiredate  TIMESTAMP(6),
  department_id INT
);

Implementierung getestet werden

Erstellen Sie eine Klasse, um einen Datensatz zu aktualisieren.

TestMain



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *Eine Klasse mit main für DBUnit-Tests.
 */
public class TestMain {
  /**Logger*/
  private static Logger logger = LoggerFactory.getLogger(TestMain.class);

  /**SQL auszuführen*/
  private static final String SQL
      = " update user set name = 'abc' where id = 1";

  /**
   * @param args
   */
  public static void main(String[] args) {
    logger.info("Starten Sie die Verarbeitung");

    // ---------------------------------
    //Aktualisieren Sie die Datenbank
    // ---------------------------------
    try {
    	Class.forName("com.mysql.jdbc.Driver");
    	Connection conn = DriverManager.getConnection(
    	        "jdbc:mysql://localhost:3306/[Name der Datenbank]?serverTimezone=JST", "[Nutzername]", "[Passwort]");
    	        PreparedStatement stmt = conn.prepareStatement(SQL);

      conn.setAutoCommit(false);
      int i = stmt.executeUpdate();

      //Zeigen Sie die Anzahl der Verarbeitungen an
      logger.info("Anzahl der bearbeiteten Fälle:[" + i + "]");

      conn.commit();
    } catch(Exception e) {
      logger.error("Error", e);
    }

    logger.info("Verarbeitung beenden");
  }
}

Erstellen einer XML-Datei zur Verwendung beim Ausführen des Tests

Before.xml


<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <!--
Numerische Daten sind auch in XML für Datensätze enthalten""Umgeben mit
Datumsangaben vom Typ DATE und TIMESTAMP sind "-Geben Sie durch Verbinden an
  -->
  <user
      ID="1"
      NAME="scott"
      AGE="22"
      SALARY="200000"
      JOB_TYPE="employee"
      HIREDATE="2017-01-01 12:34:56"
      DEPARTMENT_ID="1"
  />
</dataset>

After.xml


<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <!--
Das Datum unterliegt keiner Überprüfung, aber ich werde es vorerst auflisten.
Geben Sie absichtlich ein anderes Datum ein, um zu überprüfen, ob es gefiltert wurde.
  -->
  <user
      ID="1"
      NAME="abc"
      AGE="22"
      SALARY="200000"
      JOB_TYPE="employee"
      HIREDATE="2017-12-31 24:12:36"
      DEPARTMENT_ID="1"
  />
</dataset>

Before.xml sind die Daten, die vor dem Ausführen der Testklasse eingefügt werden müssen, um zu bestätigen, dass nur ein Fall aktualisiert wurde. After.xml sind die DB-Daten nach der Aktualisierung. Es wird verwendet, wenn die Testklasse aktiviert wird.

Implementierung der Testklasse

TestMainTest



import static org.junit.Assert.*;

import java.io.File;

import org.dbunit.Assertion;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * [Testklasse]<br>
 *Testen Sie mit JUnit und DBUnit.<br>
 * <br>
 */
public class TestMainTest {
  /**Logger*/
  private Logger logger = LoggerFactory.getLogger(TestMain.class);

  /**DBUnit-Tester*/
  private static IDatabaseTester databaseTester;

  /**
   * [Vorverarbeitung]<br>
   *Bereiten Sie Vorabdaten in der DB vor.<br>
   * <br>
   * @throws java.lang.Exception
   */
  @Before
  public void setUp() throws Exception {
    logger.info("Starten Sie die Vorverarbeitung");

    // --------------------------------------
    //EINFÜGEN von Vorbereitungsdaten
    // --------------------------------------
    //Geben Sie das Schema für INSERT der Vorbereitungsdaten an
    databaseTester = new JdbcDatabaseTester("com.mysql.jdbc.Driver",
        "jdbc:mysql://localhost:3306/[Name der Datenbank]?serverTimezone=JST", "[Nutzername]", "[Passwort]");

    // --------------------------------------
    //Dateneingabe testen
    // --------------------------------------
    IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File("src/test/java/com/example/DBUnitDemo/data/Before.xml"));
    databaseTester.setDataSet(dataSet);
    //Bereiten Sie die Vorbereitungsdaten mit DELETE → INSERT vor
    databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
        databaseTester.onSetup();

    logger.info("Vorverarbeitung beendet");
  }

  /**
   * [Nachbearbeitung]<br>
   *Führen Sie die Nachbearbeitung nach dem Test durch.<br>
   *Bereinigen Sie die DB-Einheit.<br>
   * <br>
   * @throws java.lang.Exception
   */
  @After
  public void tearDown() throws Exception {
    databaseTester.setTearDownOperation(DatabaseOperation.NONE);
    databaseTester.onTearDown();
  }

  /**
   * [Prüfung]<br>
   *Verwenden Sie DBUnit, um das Ergebnis der DB-Aktualisierung zu überprüfen.<br>
   */
  @Test
  public void test() {
    logger.info("JUnit +Starten Sie den Test mit DBUnit.");

    TestMain.main(null);

    try {
      // ----------------------------------
      //Datenprüfung nach Aktualisierung mit DBUnit
      // ----------------------------------
      IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File("src/test/java/com/example/DBUnitDemo/data/After.xml"));
      ITable expectedTable = expectedDataSet.getTable("user");

      IDataSet databaseDataSet = databaseTester.getConnection().createDataSet();
      ITable actualTable = databaseDataSet.getTable("user");

      //Die Behauptung für die Zeit schlägt mit ziemlicher Sicherheit fehl. Schließen Sie sie daher von der Überprüfung aus
      ITable filteredExpectedTable = DefaultColumnFilter.excludedColumnsTable(
          expectedTable, new String[]{"HIREDATE"});
      ITable filteredActualTable;
      filteredActualTable = DefaultColumnFilter.excludedColumnsTable(
          actualTable, new String[]{"HIREDATE"});

      // ---------------------------------------------------------------
      //Verwenden Sie DBUnit Assertion anstelle von JUnit, um die Aktualisierungsergebnisse zu überprüfen
      // ---------------------------------------------------------------
      Assertion.assertEquals(filteredExpectedTable, filteredActualTable);
    } catch (Exception e) {
      logger.error("Error", e);
      fail("Der Test schlug mit einem unerwarteten Fehler fehl.");
    }

    logger.info("JUnit +Starten Sie den Test mit DBUnit.");
  }
}

Die diesmal verwendete DBUnit-Methode lautet wie folgt.

Methodenname Erläuterung
JdbcDatabaseTester(String driverClass, String connectionUrl),JdbcDatabaseTester(String driverClass, String connectionUrl, String username, String password),JdbcDatabaseTester(String driverClass, String connectionUrl, String username, String password, String schema) DatabaseTester, der mithilfe des JDBC-Treibermanagers eine Verbindung herstellt.
FlatXmlDataSetBuilder().build(File xmlInputFile) FlatXmlDataSet Legt die zu erstellende flache XML-Eingabequelle fest.
IDatabaseTester.setDataSet(IDataSet dataSet) Stellen Sie den zu verwendenden Testdatensatz ein.
IDatabaseTester.setSetUpOperation() Ruft die DatabaseOperation zu Beginn des Tests auf.
setTearDownOperation(DatabaseOperation tearDownOperation) Stellen Sie die Datenbankoperation so ein, dass sie am Ende des Tests aufgerufen wird.
IDataSet.getTable(String tableName) Gibt die angegebene Tabelle aus dem Dataset zurück.
IDatabaseTester.getConnection() Gibt eine Testdatenbankverbindung zurück.
IDatabaseConnection.createDataSet() Erstellt ein Dataset, das nur die angegebenen Tabellen aus der Datenbank enthält.
DefaultColumnFilter.excludedColumnsTable(ITable table, Column[] columns) Gibt eine Tabelle mit den angegebenen ausgeschlossenen Spalten zurück.
Assertion.assertEquals(IDataSet expectedDataSet, IDataSet actualDataSet) Vergleichen Sie die erwartete ITable mit der tatsächlichen ITable

Referenz

Dieses Mal haben wir DBUnit eingeführt. Dieser Artikel wurde unter Bezugnahme auf die folgenden Artikel erstellt. Es ist detaillierter geschrieben. Wenn Sie mehr wissen möchten, lesen Sie bitte. [Für Super-Anfänger] DBUnit Super-Einführung DBUnit Laden von Daten aus Excel in DB mit DBUnit mit Spring Boot

Recommended Posts

Erste Schritte mit DBUnit
Erste Schritte mit Ruby
Erste Schritte mit Swift
Erste Schritte mit Doma-Transaktionen
Erste Schritte mit der Verarbeitung von Doma-Annotationen
Erste Schritte mit Java Collection
Erste Schritte mit JSP & Servlet
Erste Schritte mit Java Basics
Erste Schritte mit Spring Boot
Erste Schritte mit Ruby-Modulen
Erste Schritte mit Java_Kapitel 5_Praktische Übungen 5_4
[Google Cloud] Erste Schritte mit Docker
Erste Schritte mit Docker mit VS-Code
Erste Schritte mit dem Doma-Criteria API Cheet Sheet
Erste Schritte mit Ruby für Java-Ingenieure
Erste Schritte mit Docker für Mac (Installation)
Einführung in den Parametrisierungstest in JUnit
Einführung in Java ab 0 Teil 1
Erste Schritte mit Ratpack (4) -Routing & Static Content
Beginnen Sie mit der Funktionsweise von JVM GC
Erste Schritte mit dem Language Server Protocol mit LSP4J
Erste Schritte mit dem Erstellen von Ressourcenpaketen mit ListResoueceBundle
Erste Schritte mit Java_Kapitel 8_Über "Instanzen" und "Klassen"
Erste Schritte mit der Doma-Projektion mit der Criteira-API
Erste Schritte mit Java 1 Ähnliche Dinge zusammenstellen
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Erste Schritte mit Doma-Using Joins mit der Criteira-API
Erste Schritte mit Doma-Einführung in die Kriterien-API
Beginnen Sie mit Gradle
Ich habe versucht, mit Gradle auf Heroku zu beginnen
Erste Schritte mit Java-Programmen mit Visual Studio Code
Erste Schritte mit älteren Java-Ingenieuren (Stream + Lambda)
Beginnen Sie mit Spring Boot
Abschließende Zukunft Erste Schritte (Erste Zukunft)
Erste Schritte mit Reactive Streams und der JDK 9 Flow API
Erste Schritte mit der Git Hub Container Registry anstelle von Docker Hub
Beginnen wir mit der parallelen Programmierung
Wie fange ich mit schlank an?
Verwenden Sie den PostgreSQL-Inet-Typ mit DbUnit
Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben
Einführung in Swift / C Bridge mit der Geschichte der Portierung von Echo Server mit libuv
CompletableFuture Erste Schritte 2 (Versuchen Sie, CompletableFuture zu erstellen)
Die Nachrichtenkooperation begann mit Spring Boot
Erste Schritte mit Micronaut 2.x ~ Native Build und Bereitstellung für AWS Lambda ~
Erste Schritte mit maschinellem Lernen mit Spark "Preisschätzung" # 1 Laden von Datensätzen mit Apache Spark (Java)
Ich habe versucht, mit Web Assembly zu beginnen
[Hinweis] Erste Schritte mit Rspec
Mit dbunit 2.6.0 kommt poi ohne Erlaubnis herein
[Veraltet] Erste Schritte mit GC und Speicherverwaltung für JVMs, die ich nicht verstanden habe
Teil 2 Teil II. So fahren Sie mit den ersten Schritten fort Spring Referenzhandbuch Note Hinweis ①