1
votes

Existe-t-il un moyen de désactiver Testcontainers en fonction du profil Spring?

J'utilise Spring Boot et j'exécute des tests dans Testcontainers.

Parfois (lors du développement), je voudrais exécuter des tests non pas sur des conteneurs de test, mais sur des conteneurs déjà en cours d'exécution.

Existe-t-il un moyen de désactiver les conteneurs de test en fonction des profils Spring, des variables d'environnement, etc.?

En ce moment, je commente le code d'injection du conteneur et je le vérifie régulièrement comme ça.


0 commentaires

3 Réponses :


0
votes

Une façon d'obtenir des conteneurs dans votre test consiste simplement à utiliser l'URL JDBC, par le documents . Cela vous permet de basculer facilement entre par ex. Testcontainers et localhost basés sur un profil:

application-integration.yml

spring.datasource.url: jdbc:postgresql://localhost:5432/mydatabase

application-dev.yml

spring.datasource.url: jdbc:tc:postgresql:12-alpine:///mydatabase

Comme le note la documentation:

  • TC doit être sur le chemin de classe de votre application au moment de l'exécution pour que cela fonctionne
  • Pour Spring Boot (avant la version 2.3.0), vous devez spécifier le pilote manuellement spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver


2 commentaires

Cela ne fonctionnerait que pour le jdbc , non? Un de mes conteneurs contient un serveur LDAP. Également dans un environnement - je n'ai pas de moteur docker disponible. Donc les exceptions volent, si les conteneurs sont même présents et actifs. Donc, pour résoudre mes problèmes, les conteneurs ne doivent pas être injectés. Même la vérification du moteur docker ne devrait pas avoir lieu.


@Skip oui, uniquement pour les conteneurs qui peuvent être câblés via une "URL magique". Et je ne sais pas s'il essaierait toujours d'utiliser Docker dans le profil dev - ma base de données locale est également fournie via Docker, donc elle sera supprimée dans les deux cas!



2
votes

Oui, cela peut être fait en utilisant des profils.

Une solution possible serait (l'idée est de jouer avec le mot-clé static et cela suppose d'utiliser .withLocalCompose (true) ):

@Configuration
@Profile("test")
public class TestDockerConfig {
    // initialize your containers in static fields/static block
}

Et utilisez le profil de test quand vous en avez besoin. Même si vous importez cette configuration dans tous les tests, elle ne devrait être chargée que pour les "tests".

L'idée est d'avoir un environnement docker fourni à la suite de tests et d'utiliser des profils de propriété. Il peut soit:

  • être fourni par le moteur docker local ("dev") où vous démarrez les conteneurs vous-même avec les URL de développement appropriées spécifiées dans application-dev.properties
  • ou fournis via TestContainers, avec des URL de test dans application-test.properties

Puisque le démarrage des conteneurs prend du temps, vous ne voulez le faire qu'une seule fois de manière statique et il sera chargé avant toutes vos classes.

J'espère que cela vous aidera.


0 commentaires

1
votes

Comme recommandé par Sergei ici https://github.com/ testcontainers / testcontainers-java / issues / 2833 # event-3405411419

voici la solution:

// set this environment variable to true to disable test containers
    public static final String ENV_DISABLE_TEST_CONTAIENRS = "DISABLE_TEST_CONTAIENRS";

    @Container
    private static GenericContainer dynamoDb =
            new FixedHostPortGenericDisableableContainer("amazon/dynamodb-local:1.11.477")
                    .isActive(StringUtils.isBlank(System.getenv(ENV_DISABLE_TEST_CONTAIENRS)))
                    .withFixedExposedPort(8001, 8000)
                    .withStartupAttempts(100);

Utilisation

public class FixedHostPortGenericDisableableContainer<T extends FixedHostPortGenericDisableableContainer<T>> extends FixedHostPortGenericContainer<T> {

    private boolean isActive;

    public FixedHostPortGenericDisableableContainer(@NotNull String dockerImageName) {
        super(dockerImageName);
    }

    @Override
    public void start() {
        if (isActive) {
            super.start();
        }
    }

    public FixedHostPortGenericDisableableContainer isActive(boolean isActive) {
        this.isActive = isActive;
        return this;
    }
}


0 commentaires