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.
3 Réponses :
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
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!
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:
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.
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; } }