J'ai une configuration multi-projets et je souhaite utiliser gradle.
Mes projets sont comme ça:
Projet A
- ->
src/main/java
- ->
src/test/java
- ->
Projet B
- ->
src/main/java
(dépendsrc/main/java
du projet A ) - ->
src/test/java
(dépendsrc/test/java
du projet A )
- ->
Mon fichier Project B build.gradle
est comme ceci:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
La tâche compileJava
grand travail , mais le compileTestJava
ne compile pas le fichier de test du projet A .
Réponses:
Obsolète - Pour Gradle 5.6 et supérieur, utilisez cette réponse .
Dans le projet B , il vous suffit d'ajouter une
testCompile
dépendance:Testé avec Gradle 1.7.
la source
gradle testClasses
avant que la structure de construction ne soit réellement valide. Par exemple, le plugin Eclipse ne vous permettra pas d'importer le projet avant cela. C'est vraiment dommage quetestCompile project(':A')
ça ne marche pas. @ DavidPärsson: "Gradle 1.3" contredit "plus" depuis que Fesler a testé avec Gradle 1.7.Un moyen simple consiste à ajouter une dépendance de tâche explicite dans ProjectB:
Une méthode difficile (mais plus claire) consiste à créer une configuration d'artefact supplémentaire pour ProjectA:
et ajoutez la
testCompile
dépendance pour ProjectBla source
testArtifacts
configuration comme celle-ci:configurations { testArtifacts }
pour plus de détails, consultez cette section de l'aide de Gradle: gradle.org/docs/current/dsl/…from sourceSets.test.output
-être et éventuellementclassifier = 'tests'
à la place de// pack whatever you need...
dans la réponseCeci est désormais pris en charge en tant que fonctionnalité de première classe dans Gradle. Les modules avec
java
oujava-library
plugins peuvent également inclure unjava-test-fixtures
plugin qui expose des classes d'assistance et des ressources à consommer avectestFixtures
helper. Les avantages de cette approche contre les artefacts et les classificateurs sont:Exemple
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / exemple / Helper.java
:modul:other
modul / autre / build.gradle
modul / autre / src / test / java / com / exemple / autre / SomeTest.java
Lectures complémentaires
Pour plus d'informations, consultez la documentation:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Il a été ajouté dans la version 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
la source
J'ai récemment rencontré ce problème moi-même, et l'homme est-ce un problème difficile auquel trouver des réponses.
L'erreur que vous faites est de penser qu'un projet doit exporter ses éléments de test de la même manière qu'il exporte ses principaux artefacts et dépendances.
Ce avec quoi j'ai eu beaucoup plus de succès personnellement, c'est de faire un nouveau projet à Gradle. Dans votre exemple, je le nommerais
Projet A_Test -> src / main / java
Je mettrais dans le src / main / java les fichiers que vous avez actuellement dans le projet A / src / test / java. Faites toutes les dépendances testCompile de votre projet A compiler les dépendances du projet A_Test.
Faites ensuite du projet A_Test une dépendance testCompile du projet B.
Ce n'est pas logique du point de vue de l'auteur des deux projets, mais je pense que cela a beaucoup de sens quand on pense à des projets comme junit et scalatest (et autres. Même si ces frameworks sont liés aux tests, ils ne sont pas considérés comme faisant partie des cibles "de test" dans leur propre cadre - ils produisent des artefacts primaires que d'autres projets utilisent simplement dans leur configuration de test. Vous voulez simplement suivre le même modèle.
Essayer de faire les autres réponses énumérées ici n'a pas fonctionné pour moi personnellement (en utilisant Gradle 1.9), mais j'ai trouvé que le modèle que je décris ici est de toute façon une solution plus propre.
la source
Je sais que c'est une vieille question, mais j'ai juste eu le même problème et j'ai passé du temps à comprendre ce qui se passe. J'utilise Gradle 1.9. Tous les changements doivent être dans ProjectB
build.gradle
Pour utiliser les classes de test de ProjectA dans les tests de ProjectB:
Pour vous assurer que cette
sourceSets
propriété est disponible pour ProjectA:Pour vous assurer que les classes de test de ProjectA sont réellement présentes, lorsque vous compilez ProjectB:
la source
.classesDir
.Nouvelle solution basée sur testJar (dépendances trnsitive prises en charge) disponible en tant que plugin gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
De la documentation
la source
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Veuillez lire la mise à jour ci-dessous.
Des problèmes similaires décrits par JustACluelessNewbie se produisent dans IntelliJ IDEA. Le problème est que la dépendance
testCompile project(':core').sourceSets.test.output
signifie en fait: "dépend des classes générées par la tâche de construction gradle". Donc, si vous ouvrez un projet propre où les classes ne sont pas encore générées, IDEA ne les reconnaîtra pas et signale une erreur.Pour résoudre ce problème, vous devez ajouter une dépendance sur les fichiers source de test à côté de la dépendance sur les classes compilées.
Vous pouvez observer les dépendances reconnues par IDEA dans Paramètres du module -> Dépendances (champ de test) .
Btw. ce n'est pas une bonne solution, donc la refactorisation vaut la peine d'être envisagée. Gradle lui-même a un sous-projet spécial contenant uniquement des classes de support de test. Voir https://docs.gradle.org/current/userguide/test_kit.html
Mise à jour 05/06/2016 Plus Je pense à la solution proposée moins je l'aime. Il y a peu de problèmes avec cela:
Alors, quelle est la meilleure solution? À mon avis, il s'agit de créer un nouvel ensemble de sources personnalisé et d'y mettre des classes partagées. En fait, les auteurs du projet Gradle l'ont fait en créant un ensemble de sources testFixtures.
Pour ce faire, il vous suffit de:
Déclarez la dépendance appropriée dans le projet dépendant:
la source
La solution de Fesler n'a pas fonctionné pour moi, quand je l'ai essayé pour construire un projet Android (gradle 2.2.0). J'ai donc dû référencer manuellement les classes requises:
la source
@VisibleForTesting
règles de la charpie. Vous ne pourrez pas appeler de telles méthodes à partir du module normal sous le dossier not test.Je suis si en retard à la fête (c'est maintenant Gradle v4.4) mais pour tous ceux qui trouvent ceci:
En supposant:
Accédez au build.gradle du projet B (celui qui nécessite des classes de test de A) et ajoutez ce qui suit:
ou (en supposant que votre projet s'appelle "ProjectB")
Voila!
la source
Si vous avez des dépendances fictives que vous devez partager entre les tests, vous pouvez créer un nouveau projet
projectA-mock
, puis l'ajouter en tant que dépendance de test àProjectA
etProjectB
:Il s'agit d'une solution claire pour partager des dépendances fictives, mais si vous devez exécuter des tests à partir
ProjectA
d'uneProjectB
autre solution en cours d' utilisation.la source
Si vous souhaitez utiliser des dépendances d' artefact pour avoir:
alors la section des dépendances de ProjectB dans build.gradle devrait ressembler à ceci:
Pour que cela fonctionne, ProjectA doit construire un -tests jar et l'inclure dans les artefacts qu'il produit.
Le build.gradle de ProjectA doit contenir une configuration comme celle-ci:
Lorsque les artefacts de ProjectA sont publiés dans votre artefact, ils incluent un pot -tests .
Le testCompile dans la section des dépendances de ProjectB introduira les classes dans le jar -tests .
Si vous souhaitez inclure les classes source et de test de Flat ProjectA dans ProjectB à des fins de développement, la section des dépendances dans build.gradle de ProjectB ressemblerait à ceci:
la source
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(dans un buildscript kotlin), j'ai déterminé quelles configurations existent toujours et ont des dépendances, mais pour tous ces, Gradle s'est plaint:Selected configuration 'testCompileClasspath' on 'project :sdk' but it can't be used as a project dependency because it isn't intended for consumption by other components.
Certaines des autres réponses ont provoqué des erreurs d'une manière ou d'une autre - Gradle n'a pas détecté les classes de test d'autres projets ou le projet Eclipse avait des dépendances non valides lors de l'importation. Si quelqu'un a le même problème, je suggère d'aller avec:
La première ligne force l'Eclipse à lier l'autre projet en tant que dépendance, de sorte que toutes les sources sont incluses et à jour. Le second permet à Gradle de voir réellement les sources, sans causer d'erreurs de dépendance invalides comme le
testCompile project(':core').sourceSets.test.output
fait.la source
Ici, si vous utilisez Kotlin DSL , vous devez créer votre tâche comme ça selon Gradle documentation .
Comme certaines réponses précédentes, vous devez créer une configuration spéciale à l'intérieur du projet qui partagera sa classe de tests, afin de ne pas mélanger les classes de test et principales.
Étapes simples
build.gradle.kts
:build.gradle.kts
:la source
dans le projet B:
Semble fonctionner dans 1.7-rc-2
la source