Ich habe eine Multiprojektkonfiguration und möchte gradle verwenden.
Meine Projekte sind wie folgt:
Projekt A.
- ->
src/main/java
- ->
src/test/java
- ->
Projekt B.
- ->
src/main/java
(abhängigsrc/main/java
von Projekt A ) - ->
src/test/java
(abhängigsrc/test/java
von Projekt A )
- ->
Meine Projekt B- build.gradle
Datei sieht folgendermaßen aus:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
Die Aufgabe compileJava
funktioniert hervorragend, aber compileTestJava
die Testdatei wird nicht aus Projekt A kompiliert .
Antworten:
Veraltet - Verwenden Sie für Gradle 5.6 und höher diese Antwort .
In Projekt B müssen Sie nur eine
testCompile
Abhängigkeit hinzufügen :Getestet mit Gradle 1.7.
quelle
gradle testClasses
bevor die Build-Struktur tatsächlich gültig ist. Mit dem Eclipse-Plugin können Sie das Projekt beispielsweise vorher nicht importieren. Es ist wirklich eine Schande, dasstestCompile project(':A')
es nicht funktioniert. @ DavidPärsson: "Gradle 1.3" widerspricht "nicht mehr", da Fesler mit Gradle 1.7 getestet hat.Ein einfacher Weg ist das Hinzufügen einer expliziten Aufgabenabhängigkeit in ProjectB:
Eine schwierige (aber klarere) Möglichkeit besteht darin, eine zusätzliche Artefaktkonfiguration für ProjectA zu erstellen:
und fügen Sie die
testCompile
Abhängigkeit für ProjectB hinzuquelle
testArtifacts
Konfiguration wie folgt hinzufügen :configurations { testArtifacts }
Weitere Details finden Sie in diesem Abschnitt der Gradle-Hilfe: gradle.org/docs/current/dsl/…from sourceSets.test.output
und möglicherweiseclassifier = 'tests'
anstelle// pack whatever you need...
der AntwortDies wird jetzt als erstklassiges Feature in Gradle unterstützt. Module mit
java
oderjava-library
Plugins können auch einjava-test-fixtures
Plugin enthalten, das Hilfsklassen und Ressourcen verfügbar macht, die mittestFixtures
Helfer verbraucht werden sollen . Vorteile dieses Ansatzes gegenüber Artefakten und Klassifikatoren sind:Beispiel
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / example / Helper.java
:modul:other
modul / other / build.gradle
modul / other / src / test / java / com / example / other / SomeTest.java
Weiterführende Literatur
Weitere Informationen finden Sie in der Dokumentation:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Es wurde in 5.6 hinzugefügt:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
quelle
Ich bin in letzter Zeit selbst auf dieses Problem gestoßen, und Mann, es ist schwierig, Antworten darauf zu finden.
Der Fehler, den Sie machen, besteht darin, dass ein Projekt seine Testelemente genauso exportieren sollte wie seine primären Artefakte und Abhängigkeiten.
Ich persönlich hatte viel mehr Erfolg damit, ein neues Projekt in Gradle zu machen. In Ihrem Beispiel würde ich es nennen
Projekt A_Test -> src / main / java
Ich würde die Dateien, die Sie derzeit in Projekt A / src / test / java haben, in src / main / java einfügen. Machen Sie alle testCompile-Abhängigkeiten Ihres Projekts A kompilieren Sie Abhängigkeiten von Project A_Test.
Machen Sie dann Projekt A_Test zu einer testCompile-Abhängigkeit von Projekt B.
Es ist nicht logisch, wenn man es aus der Sicht des Autors beider Projekte betrachtet, aber ich denke, es ist sehr sinnvoll, wenn man an Projekte wie junit und scalatest (und andere) denkt. Auch wenn diese Frameworks testbezogen sind, sind sie es werden nicht als Teil der "Test" -Ziele innerhalb ihrer eigenen Frameworks betrachtet - sie erzeugen primäre Artefakte, die andere Projekte zufällig in ihrer Testkonfiguration verwenden. Sie möchten nur demselben Muster folgen.
Der Versuch, die anderen hier aufgeführten Antworten zu geben, hat für mich persönlich nicht funktioniert (mit Gradle 1.9), aber ich habe festgestellt, dass das hier beschriebene Muster ohnehin eine sauberere Lösung ist.
quelle
Ich weiß, dass es eine alte Frage ist, aber ich hatte nur das gleiche Problem und verbrachte einige Zeit damit, herauszufinden, was los ist. Ich benutze Gradle 1.9. Alle Änderungen sollten in ProjectBs erfolgen
build.gradle
So verwenden Sie Testklassen von ProjectA in Tests von ProjectB:
So stellen Sie sicher, dass die
sourceSets
Eigenschaft für ProjectA verfügbar ist:So stellen Sie sicher, dass Testklassen von ProjectA tatsächlich vorhanden sind, wenn Sie ProjectB kompilieren:
quelle
.classesDir
.Neue testJar-basierte Lösung (Unterstützung für trnsitive Abhängigkeiten unterstützt) als Gradle-Plugin verfügbar:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
Aus der Dokumentation
quelle
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Bitte lesen Sie das Update unten.
Ähnliche von JustACluelessNewbie beschriebene Probleme treten in IntelliJ IDEA auf. Das Problem ist, dass Abhängigkeit
testCompile project(':core').sourceSets.test.output
tatsächlich bedeutet: "Abhängig von Klassen, die durch die Gradle-Build-Aufgabe generiert wurden". Wenn Sie also ein sauberes Projekt öffnen, in dem noch keine Klassen generiert wurden, erkennt IDEA sie nicht und meldet Fehler.Um dieses Problem zu beheben, müssen Sie neben der Abhängigkeit von kompilierten Klassen eine Abhängigkeit von Testquelldateien hinzufügen.
Von IDEA erkannte Abhängigkeiten können Sie unter Moduleinstellungen -> Abhängigkeiten (Testumfang) beobachten .
Übrigens. Dies ist keine gute Lösung, daher ist Refactoring eine Überlegung wert. Gradle selbst hat ein spezielles Teilprojekt, das nur Testunterstützungsklassen enthält. Siehe https://docs.gradle.org/current/userguide/test_kit.html
Update 05.06.2016 Mehr Ich denke über Lösungsvorschläge nach, weniger gefällt es mir. Es gibt nur wenige Probleme damit:
Was ist die bessere Lösung? Meiner Meinung nach wird ein neuer benutzerdefinierter Quellensatz erstellt und freigegebene Klassen eingefügt. Tatsächlich haben die Autoren des Gradle-Projekts dazu den Quellensatz testFixtures erstellt.
Um es zu tun, müssen Sie nur:
Deklarieren Sie die richtige Abhängigkeit im abhängigen Projekt:
quelle
Die Lösung von Fesler hat bei mir nicht funktioniert, als ich versucht habe, ein Android-Projekt (Gradle 2.2.0) zu erstellen. Also musste ich die erforderlichen Klassen manuell referenzieren:
quelle
@VisibleForTesting
Flusenregeln. Sie können solche Methoden nicht über das reguläre Modul im Ordner "Nicht testen" aufrufen.Ich bin so spät zur Party (es ist jetzt Gradle v4.4), aber für alle anderen, die dies finden:
Angenommen:
Gehen Sie zum build.gradle von Projekt B (das einige Testklassen von A benötigt) und fügen Sie Folgendes hinzu:
oder (vorausgesetzt, Ihr Projekt heißt "ProjectB")
Voila!
quelle
Wenn Sie Scheinabhängigkeiten haben, die Sie zwischen Tests teilen müssen, können Sie ein neues Projekt erstellen
projectA-mock
und es dann als Testabhängigkeit zuProjectA
und hinzufügenProjectB
:Dies ist klare Lösung zu teilen Mock Abhängigkeiten, aber wenn Sie benötigen Tests aus laufen
ProjectA
inProjectB
Gebrauch andere Lösung.quelle
Wenn Sie Artefaktabhängigkeiten verwenden möchten, um Folgendes zu haben:
Dann sollte der Abschnitt mit den Abhängigkeiten von ProjectB in build.gradle ungefähr so aussehen:
Damit dies funktioniert, muss ProjectA ein Test- JAR erstellen und es in die von ihm erzeugten Artefakte aufnehmen.
Das build.gradle von ProjectA sollte folgende Konfiguration enthalten:
Wenn die Artefakte von ProjectA in Ihrem Artefakt veröffentlicht werden, enthalten sie ein Testglas .
Die testCompile im Abschnitt Abhängigkeiten von ProjectB bringt die Klassen in das -tests- JAR.
Wenn Sie die Quell- und Testklassen von Flat ProjectA zu Entwicklungszwecken in ProjectB aufnehmen möchten, sieht der Abschnitt mit den Abhängigkeiten in ProjectBs build.gradle folgendermaßen aus:
quelle
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(in einem Kotlin-Buildscript) habe ich festgestellt, welche Konfigurationen noch existieren und Abhängigkeiten haben, aber für all diese hat sich Gradle beschwert: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.
Einige der anderen Antworten verursachten auf die eine oder andere Weise Fehler - Gradle erkannte keine Testklassen aus anderen Projekten oder das Eclipse-Projekt hatte beim Import ungültige Abhängigkeiten. Wenn jemand das gleiche Problem hat, schlage ich vor:
Die erste Zeile zwingt die Eclipse, das andere Projekt als Abhängigkeit zu verknüpfen, sodass alle Quellen enthalten und auf dem neuesten Stand sind. Mit der zweiten Option kann Gradle die Quellen tatsächlich anzeigen, ohne wie bisher ungültige Abhängigkeitsfehler zu verursachen
testCompile project(':core').sourceSets.test.output
.quelle
Wenn Sie Kotlin DSL verwenden , sollten Sie Ihre Aufgabe gemäß der Gradle- Dokumentation so erstellen .
Wie bei einigen früheren Antworten müssen Sie innerhalb des Projekts eine spezielle Konfiguration erstellen, die die Testklasse gemeinsam nutzt, damit Sie Test- und Hauptklassen nicht mischen.
Einfache Schritte
build.gradle.kts
:build.gradle.kts
:quelle
in Projekt B:
Scheint in 1.7-rc-2 zu funktionieren
quelle