[JAVA] Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit

introduction

Dans les applications qui utilisent Spring Boot Décrit comment implémenter UT avec JUnit5 + DBUnit.

La structure du projet étant basée sur Spring Initializr, Vous pouvez facilement vérifier le fonctionnement en vous reportant à ce qui suit.

Installation

J'ai utilisé My Batis + Oracle pour vérifier l'opération. Veuillez faire correspondre la bibliothèque à utiliser pour chaque environnement.

build.gradle


plugins {
    id 'org.springframework.boot' version '2.2.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id 'eclipse'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '12'

repositories {
    mavenCentral()
}

dependencies {

    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

    //Veuillez définir pour chaque DB
    runtime files('libs/ojdbc8.jar')

    // Lombok
    compileOnly 'org.projectlombok:lombok'


    // JUnit5
    testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2'
    testImplementation 'org.junit.platform:junit-platform-commons:1.5.2'
    testImplementation 'com.github.springtestdbunit:spring-test-dbunit:1.3.0'

    // DBUnit
    testImplementation 'org.dbunit:dbunit:2.6.0'
}

test {
    useJUnitPlatform()
}

Échantillon à tester

application.yml Puisqu'il s'agira des informations de connexion d'Oracle, veuillez les définir pour chaque base de données. Il existe également un "schéma" dans l'attribut de source de données, mais veuillez le définir séparément. Lors de l'enregistrement des données de test, les informations contenues dans datasource.schema ne sont pas référencées et une exception se produit.

application.yml


spring:
  datasource:
    url: jdbc:oracle:thin:@localhost:1521/XEPDB1
    username: sample
    password: sample
    driverClassName: oracle.jdbc.OracleDriver
schema: SAMPLE
mybatis: 
  type-aliases-package: com.example.demo.entity
  configuration:
    map-underscore-to-camel-case: true

TABLEAU EXEMPLE

Pour Oracle ... (ry

CREATE TABLE SAMPLE_TABLE 
( SAMPLE_ID NUMBER NOT NULL,
  SAMPLE_NAME VARCHAR2(255 CHAR) NOT NULL, 
  CONSTRAINT "PK_SAMPLE_TABLE" PRIMARY KEY (SAMPLE_ID)
);

Entity

SampleTable.java


@Data
public class SampleTable {

    private long sampleId;

    private String sampleName;
}

Repository ( Mapper )

SampleTableRepository.java


@Mapper
public interface SampleTableRepository {
    @Select("SELECT SAMPLE_ID, SAMPLE_NAME FROM SAMPLE_TABLE WHERE SAMPLE_ID = #{sampleId}")
    SampleTable findOne(long sampleId);
}

Classe d'essai

Classe de paramétrage DB pour les tests

DBConfig pour l'exécution du test. Utilisez cette classe de configuration pour configurer la source de données et le schéma.

DbConfig.java


@Configuration
public class DbConfig {

    @Bean(name = "dbUnitDatabaseConnection")
    public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(DataSource dataSource, @Value(value = "${schema}") String schema) {
        DatabaseDataSourceConnectionFactoryBean connectionFactory = new DatabaseDataSourceConnectionFactoryBean();
        connectionFactory.setDataSource(dataSource);
        connectionFactory.setSchema(schema);
        return connectionFactory;
    }
}

Classe de chargeur pour Excel

XlsDataSetLoader.java


public class XlsDataSetLoader extends AbstractDataSetLoader {

    @Override
    protected IDataSet createDataSet(Resource resource) throws IOException, DataSetException {
        try (InputStream inputStream = resource.getInputStream()) {
            return new XlsDataSet(inputStream);
        }
    }
}

Classe d'essai

@DbUnitConfiguration: Veuillez définir la source de données de la "Classe de configuration de la base de données de test" et de la "Classe de chargeur pour Excel" ci-dessus. @DatabaseSetup: définissez pour chaque test et définissez la source de données, les données de test et la méthode d'enregistrement définies dans @DbUnitConfiguration.

python


@SpringBootTest
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class, databaseConnection = { "dbUnitDatabaseConnection" })
public class SampleTableRepositoryTest {

    @Autowired
    SampleTableRepository sampleTableRepository;

    @Test
    @DatabaseSetup(connection = "dbUnitDatabaseConnection", value = "/testdata/findOneTest.xlsx", type = DatabaseOperation.CLEAN_INSERT)
void Les données peuvent être acquises normalement() {
        SampleTable actual = sampleTableRepository.findOne(3L);
        Assertions.assertEquals("NAME_C", actual.getSampleName(), "SAMPLE_La valeur de NAME est celle attendue");
    }
}

données de test

Nom de la feuille: nom de la table 1ère ligne: nom de la colonne Deuxième ligne et suivantes: Données

テストデータ.PNG

en conclusion

Lorsque le test est exécuté avec la configuration ci-dessus, les données de test Excel seront enregistrées dans le DB. La difficulté est que la vitesse est lente. (Peut-être que la configuration n'est pas bonne À l'avenir, j'essaierai d'améliorer les performances.

Recommended Posts

Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
Effectuer un test de confirmation de transaction avec Spring Boot
Comment tester l'étendue privée avec JUnit
[Java] Comment tester s'il est nul dans JUnit
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment tester les interruptions pendant Thread.sleep avec JUnit
Comment utiliser h2db intégré avec Spring Boot
Comment écrire un test unitaire pour Spring Boot 2
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Comment démarrer par environnement avec Spring Boot de Maven
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Remarques sur l'utilisation de Spring Data JDBC
[Comment installer Spring Data Jpa]
Comment configurer Spring Boot + PostgreSQL
Utiliser DBUnit pour le test Spring Boot
Comment utiliser ModelMapper (Spring boot)
Contrôleur de cadre de test Spring avec Junit
Exemple de code pour le test unitaire d'un contrôleur Spring Boot avec MockMvc
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
Comment lire le corps de la requête plusieurs fois avec Spring Boot + Spring Security
Comment filtrer JUnit Test dans Gradle
Comment tester une méthode privée qui prend un tableau ou un argument de longueur variable dans JUnit
Comment supprimer des données avec une clé externe
Comment diviser un fichier de message Spring Boot
Test de validation de classe de formulaire avec Spring Boot
Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
Exemple de traitement par lots de données sur DB avec des démarreurs Apache Camel Spring Boot
Partie 2 Partie II. Comment procéder avec la mise en route Guide de référence de Spring Boot Remarque ①
Jusqu'à l'acquisition de données avec Spring Boot + MyBatis + PostgreSQL
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
Essayez d'implémenter la fonction de connexion avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Introduction à Spring Boot + In-Memory Data Grid
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Comment écrire du code de test avec la certification de base
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
[Spring Boot] Comment se référer au fichier de propriétés
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Spring Boot - Comment définir le délai d'expiration de la session
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Comment définir l'injection de dépendance Spring Boot (DI)
Mappez automatiquement DTO aux entités avec l'API Spring Boot
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid
Tester le contenu d'un fichier Excel avec JUnit
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
J'ai essayé de démarrer avec Spring Data JPA
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Comment tester l'écran de téléchargement de fichiers avec Spring + Selenium
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot
Faites un test unitaire avec Junit.