[JAVA] Premiers pas avec DBUnit

Qu'est-ce que DBUnit

Vous aurez souvent beaucoup de mal à créer un programme de test pour un test unitaire d'une classe qui référence ou met à jour la base de données. Les problèmes suivants ont tendance à se produire lors de la vérification de la base de données pour les tests unitaires.

Par conséquent, je vais introduire un framework appelé `` DBUnit ''. DBUnit est un framework pour créer des programmes de test pour les classes qui opèrent sur des bases de données et étend JUnit.

Il a des fonctions telles que. Ce chapitre décrit comment utiliser DBUnit pour décrire les classes de test qui effectuent le traitement de la base de données.

Installation de DBUtil

S'il s'agit d'un projet maven, vous pouvez utiliser DBUtil en écrivant ce qui suit dans pom.xml.

		<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 utilise la version 4.13.

Si vous souhaitez utiliser DBUtil au lieu du projet maven, vous pouvez l'utiliser en téléchargeant le fichier jar à partir du lien ci-dessous et en le passant par le chemin de classe. (Bien que non recommandé) http://www.dbunit.org/

Cette fois, nous utiliserons DBUnit pour effectuer les opérations suivantes:

Créer une table de test

Puisque nous utilisons la base de données mysql cette fois, créez une table avec le SQL suivant.

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
);

Implémentation à tester

Créez une classe pour METTRE À JOUR un enregistrement.

TestMain



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

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

/**
 *Une classe avec main pour les tests DBUnit.
 */
public class TestMain {
  /**Enregistreur*/
  private static Logger logger = LoggerFactory.getLogger(TestMain.class);

  /**SQL à exécuter*/
  private static final String SQL
      = " update user set name = 'abc' where id = 1";

  /**
   * @param args
   */
  public static void main(String[] args) {
    logger.info("Commencer le traitement");

    // ---------------------------------
    //Mettre à jour la base de données
    // ---------------------------------
    try {
    	Class.forName("com.mysql.jdbc.Driver");
    	Connection conn = DriverManager.getConnection(
    	        "jdbc:mysql://localhost:3306/[Nom de la base de données]?serverTimezone=JST", "[Nom d'utilisateur]", "[mot de passe]");
    	        PreparedStatement stmt = conn.prepareStatement(SQL);

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

      //Afficher le nombre de traitements
      logger.info("Nombre de dossiers traités:[" + i + "]");

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

    logger.info("Sortie de traitement");
  }
}

Création d'un fichier XML à utiliser lors de l'exécution du test

Before.xml


<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <!--
Les données numériques sont également incluses dans XML pour les ensembles de données""Entourez de
Les dates de type DATE et TIMESTAMP sont "-Précisez en vous connectant
  -->
  <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>
  <!--
La date n'est pas sujette à vérification, mais je la listerai pour le moment.
Saisissez une date différente pour vérifier qu'elle a été filtrée.
  -->
  <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 correspond aux données à insérer avant d'exécuter la classe de test pour confirmer qu'un seul cas a été mis à jour. After.xml correspond aux données de base de données une fois la mise à jour effectuée. Il est utilisé lors de l'affirmation de la classe de test.

Implémentation de classe de test

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;

/**
 * [Classe d'essai]<br>
 *Test à l'aide de JUnit et DBUnit.<br>
 * <br>
 */
public class TestMainTest {
  /**Enregistreur*/
  private Logger logger = LoggerFactory.getLogger(TestMain.class);

  /**Testeur DBUnit*/
  private static IDatabaseTester databaseTester;

  /**
   * [Prétraitement]<br>
   *Préparez les données avancées dans DB.<br>
   * <br>
   * @throws java.lang.Exception
   */
  @Before
  public void setUp() throws Exception {
    logger.info("Commencer le prétraitement");

    // --------------------------------------
    //INSÉRER des données de préparation
    // --------------------------------------
    //Spécifiez le schéma pour INSERT des données de préparation
    databaseTester = new JdbcDatabaseTester("com.mysql.jdbc.Driver",
        "jdbc:mysql://localhost:3306/[Nom de la base de données]?serverTimezone=JST", "[Nom d'utilisateur]", "[mot de passe]");

    // --------------------------------------
    //Entrée de données de test
    // --------------------------------------
    IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File("src/test/java/com/example/DBUnitDemo/data/Before.xml"));
    databaseTester.setDataSet(dataSet);
    //Préparer les données de préparation en SUPPRIMER → INSÉRER
    databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
        databaseTester.onSetup();

    logger.info("Pré-traitement terminé");
  }

  /**
   * [Post-traitement]<br>
   *Effectuer un post-traitement post-test.<br>
   *Nettoyez l'unité DB.<br>
   * <br>
   * @throws java.lang.Exception
   */
  @After
  public void tearDown() throws Exception {
    databaseTester.setTearDownOperation(DatabaseOperation.NONE);
    databaseTester.onTearDown();
  }

  /**
   * [tester]<br>
   *Utilisez DBUnit pour vérifier le résultat de la mise à jour de la base de données.<br>
   */
  @Test
  public void test() {
    logger.info("JUnit +Commencez les tests avec DBUnit.");

    TestMain.main(null);

    try {
      // ----------------------------------
      //Contrôle des données après mise à jour avec 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");

      //L'assertion du temps échoue presque certainement, alors excluez-la de la vérification
      ITable filteredExpectedTable = DefaultColumnFilter.excludedColumnsTable(
          expectedTable, new String[]{"HIREDATE"});
      ITable filteredActualTable;
      filteredActualTable = DefaultColumnFilter.excludedColumnsTable(
          actualTable, new String[]{"HIREDATE"});

      // ---------------------------------------------------------------
      //Utilisez l'assertion DBUnit au lieu de JUnit pour valider les résultats de la mise à jour
      // ---------------------------------------------------------------
      Assertion.assertEquals(filteredExpectedTable, filteredActualTable);
    } catch (Exception e) {
      logger.error("Erreur", e);
      fail("Le test a échoué avec une erreur inattendue.");
    }

    logger.info("JUnit +Commencez le test avec DBUnit.");
  }
}

La méthode DBUnit utilisée cette fois est la suivante.

Nom de la méthode Explication
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 qui crée une connexion à l'aide du gestionnaire de pilotes JDBC.
FlatXmlDataSetBuilder().build(File xmlInputFile) FlatXmlDataSet Définit la source d'entrée XML plate à construire.
IDatabaseTester.setDataSet(IDataSet dataSet) Définissez le jeu de données de test à utiliser.
IDatabaseTester.setSetUpOperation() Obtient le DatabaseOperation à appeler au début du test.
setTearDownOperation(DatabaseOperation tearDownOperation) Définissez l'opération de base de données à appeler à la fin du test.
IDataSet.getTable(String tableName) Renvoie la table spécifiée à partir de l'ensemble de données.
IDatabaseTester.getConnection() Renvoie une connexion à la base de données de test.
IDatabaseConnection.createDataSet() Crée un ensemble de données qui contient uniquement les tables spécifiées de la base de données.
DefaultColumnFilter.excludedColumnsTable(ITable table, Column[] columns) Renvoie une table avec les colonnes spécifiées exclues.
Assertion.assertEquals(IDataSet expectedDataSet, IDataSet actualDataSet) Comparez l'ITable attendu avec l'ITable réel

référence

Cette fois, nous avons présenté DBUnit et cet article est créé en faisant référence aux articles suivants. Il est écrit plus en détail, donc si vous voulez en savoir plus, veuillez vous y référer. [Pour les super débutants] Super introduction à DBUnit DBUnit Chargement de données d'Excel dans DB à l'aide de DBUnit avec Spring Boot

Recommended Posts

Premiers pas avec DBUnit
Premiers pas avec Ruby
Premiers pas avec Swift
Premiers pas avec Doma-Transactions
Premiers pas avec le traitement Doma-Annotation
Premiers pas avec Java Collection
Premiers pas avec JSP et servlet
Premiers pas avec les bases de Java
Premiers pas avec Spring Boot
Premiers pas avec les modules Ruby
Premiers pas avec Java_Chapitre 5_Exercices pratiques 5_4
[Google Cloud] Premiers pas avec Docker
Premiers pas avec Docker avec VS Code
Premiers pas avec Doma-Criteria API Cheet Sheet
Premiers pas avec Ruby pour les ingénieurs Java
Premiers pas avec Docker pour Mac (installation)
Introduction au test de paramétrage dans JUnit
Introduction à Java à partir de 0 Partie 1
Premiers pas avec Ratpack (4) - Routage et contenu statique
Démarrez avec le fonctionnement de JVM GC
Premiers pas avec Language Server Protocol avec LSP4J
Premiers pas avec la création d'ensembles de ressources avec ListResoueceBundle
Premiers pas avec Java_Chapter 8_A propos des "Instances" et des "Classes"
Premiers pas avec Doma-Using Projection avec l'API Criteira
Premiers pas avec les sous-requêtes utilisant Doma avec l'API Criteria
Premiers pas avec Java 1 Assembler des éléments similaires
Premiers pas avec Kotlin à envoyer aux développeurs Java
Premiers pas avec Doma-Using Joins avec l'API Criteira
Premiers pas avec Doma - Introduction à l'API Criteria
Commencez avec Gradle
J'ai essayé de démarrer avec Gradle sur Heroku
Prise en main des programmes Java à l'aide de Visual Studio Code
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Démarrez avec Spring Boot
Prise en main de Completable Future (First Future)
Premiers pas avec Reactive Streams et l'API JDK 9 Flow
Premiers pas avec Git Hub Container Registry au lieu de Docker Hub
Commençons par la programmation parallèle
Comment démarrer avec Slim
Utiliser le type inet PostgreSQL avec DbUnit
Résumer les principaux points de démarrage avec JPA appris avec Hibernate
Présentation de Swift / C Bridge avec l'histoire du portage d'Echo Server à l'aide de libuv
CompletableFuture Getting Started 2 (Essayez de faire CompletableFuture)
La coopération des messages a commencé avec Spring Boot
Premiers pas avec Micronaut 2.x ~ Construction native et déploiement sur AWS Lambda ~
Premiers pas avec le Machine Learning avec Spark "Price Estimate" # 1 Chargement des ensembles de données avec Apache Spark (Java)
J'ai essayé de démarrer avec Web Assembly
[Note] Comment démarrer avec Rspec
Avec dbunit 2.6.0, poi arrive sans permission
[Obsolète] Premiers pas avec GC et la gestion de la mémoire pour les machines virtuelles Java Je n'ai pas compris
Partie 2 Partie II. Comment procéder avec la mise en route Guide de référence de Spring Boot Remarque ①