Tests d'intégration de printemps avec profil
Dans notre Printemps des applications web, nous utilisons le Printemps bean profils de différencier les trois scénarios de développement, d'intégration et de production. On les utilise pour se connecter à différentes bases de données ou définir d'autres constantes.
À l'aide de Printemps bean profils fonctionne très bien pour l'évolution de l'application web d'environnement.
Le problème que nous avons, c'est quand notre test d'intégration de code de l'évolution des besoins de l'environnement. Dans ces cas, le test d'intégration des charges de l'application de contexte de l'application web. De cette façon, nous n'avons pas à redéfinir les connexions de base de données, des constantes, etc. (en appliquant le principe SEC).
Nous avons configuré nos tests d'intégration comme suit.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
public class MyTestIT
{
@Autowired
@Qualifier("myRemoteURL") //a value from the web-app's applicationContext.xml
private String remoteURL;
...
}
Je peux le faire fonctionner localement à l'aide de @ActiveProfiles
mais c'est codé en dur et des causes de notre échec des tests sur le serveur de build.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
@ActiveProfiles("development")
public class MyTestIT
{ ... }
J'ai aussi essayé d'utiliser le @WebAppConfiguration
en espérant qu'il pourrait en quelque sorte de l'importation de la spring.profiles.active
propriété de Maven, mais qui ne fonctionne pas.
Une autre note, nous avons également besoin de configurer notre code afin que les développeurs peuvent exécuter l'application web, puis exécutez les tests à l'aide de l'Ide, du lanceur de test (ou un autre IDE). C'est beaucoup plus facile pour le débogage des tests d'intégration.
source d'informationauteur David V
Vous devez vous connecter pour publier un commentaire.
Que d'autres personnes l'ont déjà signalé, vous pouvez choisir d'utiliser Maven pour définir la
spring.profiles.active
de la propriété du système, en s'assurant pas à utiliser@ActiveProfiles
mais qui n'est pas pratique pour les tests s'exécutent au sein de l'IDE.Pour la programmation des moyens pour définir les profils actifs, vous avez quelques options.
ContextLoader
qui prépare le contexte par la définition de profils actifs dans le contexte de l'Environment
.ContextLoader
reste une option, mais un meilleur choix est de mettre en œuvre uneApplicationContextInitializer
et de le configurer via leinitializers
attribut de@ContextConfiguration
. Votre personnalisé initialiseur pouvez configurer leEnvironment
par programme définissant les profils actifs.ActiveProfilesResolver
API exactement à cette fin: à déterminer par programmation l'ensemble de profils actifs pour une utilisation dans un test. UnActiveProfilesResolver
peuvent être enregistrés par le biais de laresolver
attribut de@ActiveProfiles
.Ce qui concerne,
Sam (auteur de la Spring Framework TestContext)
J'ai eu un problème similaire: je voulais courir tous mes tests d'intégration avec un profil par défaut, mais permettent à un utilisateur de remplacer avec un profil qui a représenté un environnement différent ou de même db saveur sans avoir à modifier le @ActiveProfiles valeur. C'est faisable si vous utilisez Printemps 4.1+ avec une coutume ActiveProfilesResolver.
Cet exemple résolveur recherche un Système de Propriété, printemps.les profils.activeet si elle n'existe pas, il sera délégué à la résolution par défaut qui utilise simplement le @ActiveProfiles annotation.
}
Et dans vos classes de test, vous pouvez l'utiliser comme ceci:
Vous pouvez bien sûr utiliser d'autres méthodes en plus de vérifier l'existence d'un Système de Propriété pour définir les profils actifs. Espérons que cela aide quelqu'un.
Si vous voulez éviter de coder en dur le profil que vous souhaitez utiliser le le système de la propriété
spring.profiles.active
et définissez ce que vous avez besoin dans cet environnement particulier par exemple, nous avons les "dev", "scène" et "prod" profils pour nos environnements différents; nous avons aussi un "test", "test-local" et de "tester" serveur de profils pour nos tests.N'oubliez pas que vous pouvez avoir plus d'un profil dans le système de la propriété en utilisant une liste de valeurs séparées par des virgules par exemple "test,test d'assurance qualité".
Vous pouvez spécifier les propriétés du système dans un projet maven dans le maven plugin surefire ou de les passer comme ceci:
@ElderMael mentionné, vous pourriez utiliser le argLine propriété de maven plugin surefire. Souvent quand j'en ai besoin pour exécuter tous les tests avec différents Printemps profils, j'définir d'autres maven profil. Exemple:
Avec cette approche que l'on pourrait facilement exécuter tous les tests avec le profil activé par la commande maven:
L' @ActiveProfile annotation est bien, mais parfois nous avons besoin pour exécuter tous les tests avec l'activation des profils spécifiques et codées en dur @ActiveProfile paramètres, il est un problème.
Par exemple: par défaut du test d'intégration avec H2 en mémoire db, mais parfois vous voulez exécuter le test sur le "réel" de la base de données. Vous pouvez définir que d'autres maven profil et définir Jenkins travail. Avec SpringBoot vous pouvez aussi mettre des propriétés supplémentaires de test/resources avec le nom de l'application-foo.yml (ou propriétés) et ces propriétés seront pris en compte.
il y a de nombreux visages à ce problème.
dans mon cas, l'addition simple à construire.gradle déjà aidé: