8 votes

Les tests d'intégration Gradle se construisent mais ne s'exécutent pas

Je suis en train de mettre en place un projet gradle multi-modules et j'essaie de séparer les tests d'intégration pour tous les sous-projets. J'ai réussi à créer la tâche integTest et je peux voir qu'elle construit les classes de tests d'intégration et crée des rapports de tests d'intégration dans des répertoires différents de ceux des tests unitaires. Cependant, elle n'exécute pas mon test d'intégration.

La structure du projet est la suivante

|_ gradle
| |_ integration-test.gradle
|_ subproject
| |_ src
| |  |_ main
| |  | |_ java
| |  | |_ resources
| |  |_ test
| |  | |_ java
| |  | |_ resources
| |  |_ integTest
| |    |_ java
| |    | |_sit
| |    |   |_ MyTest.java
| |    |_ resources
| |_ build.gradle
|_ build.gradle
|_ gradle.properties
|_ settings.gradle

Dans le fichier integration-test.gradle, j'ai

sourceSets {
    integTest {
        java.srcDir file('src/integTest/java')
        resources.srcDir file('src/integTest/resources')
        compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath
        runtimeClasspath += output + compileClasspath
    }
}

dependencies {
    integTestCompile sourceSets.main.output
    integTestCompile sourceSets.test.output 

    integTestCompile configurations.compile
    integTestCompile configurations.testCompile 

    integTestRuntime configurations.runtime
    integTestRuntime configurations.testRuntime 
}

task integTest(type: Test) {
    group = LifecycleBasePlugin.VERIFICATION_GROUP
    description = 'Runs the integration tests.' 

    maxHeapSize = '1024m' 

    testClassesDir = sourceSets.integTest.output.classesDir
    classpath = sourceSets.integTest.runtimeClasspath 

    binResultsDir = file("$buildDir/integration-test-results/binary/integTest")

    reports { 
        html.destination = "$buildDir/reports/integration-test"
        junitXml.destination = "$buildDir/integration-test-results"
    }

    mustRunAfter tasks.test
}

check.dependsOn integTest

Ensuite, dans le sous-projet build.gradle, j'ajoute ce qui suit en haut de la page

apply from: "$rootDir/gradle/integration-test.gradle"

Après l'exécution gradle clean build Je peux voir les tests unitaires se construire et s'exécuter et voir les rapports de test après coup. Je peux également voir que les tests d'intégration sont construits dans un répertoire integTest séparé, sous les classes dans le répertoire de construction. Je vois également un nouveau répertoire integration-test-results créé dans le répertoire de construction, mais les tests définis dans MyTest.java ne s'exécutent pas.

Je vois également ceci dans la console lorsque je lance le programme avec l'option -i

> Task :javaproject:integTest
Task ':javaproject:integTest' is not up-to-date because:
  Output property 'binResultsDir' file E:\dev\java\workspace\javaproject\subproject\build\integration-test-results\binary\integTest has been removed.
  Output property 'binResultsDir' file E:\dev\java\workspace\javaproject\subproject\build\integration-test-results\binary\integTest\output.bin has been removed.
  Output property 'binResultsDir' file E:\dev\java\workspace\javaproject\subproject\build\integration-test-results\binary\integTest\output.bin.idx has been removed.
Finished generating test XML results (0.0 secs) into: E:\dev\java\workspace\javaproject\subproject\build\integration-test-results
Generating HTML test report...
Finished generating test html results (0.006 secs) into: E:\dev\java\workspace\javaproject\subproject\build\reports\integration-test
:javaproject:integTest (Thread[Task worker for ':',5,main]) completed. Took 0.092 secs.
:javaproject:check (Thread[Task worker for ':',5,main]) started.

26voto

Paul Statham Points 586

Si vous utilisez JUnit5 et mettez en place des tests d'intégration de cette manière, assurez-vous d'ajouter useJUnitPlatform() à votre tâche de test d'intégration. Ma tâche est donc devenue

task integTest(type: Test) {
    useJUnitPlatform()
    group = LifecycleBasePlugin.VERIFICATION_GROUP
    description = 'Runs the integration tests.' 

    maxHeapSize = '1024m' 

    testClassesDir = sourceSets.integTest.output.classesDir
    classpath = sourceSets.integTest.runtimeClasspath 

    binResultsDir = file("$buildDir/integration-test-results/binary/integTest")

    reports { 
        html.destination = "$buildDir/reports/integration-test"
        junitXml.destination = "$buildDir/integration-test-results"
    }

    mustRunAfter tasks.test
}

Et puis, comme par magie, tout s'est mis à fonctionner. Je l'ai repéré parce que j'ai relancé la compilation avec gradle clean build -d et j'ai repéré ce qui suit, ce qui m'a permis d'affiner ma recherche dans googlefu

13:58:08.909 [DEBUG] [TestEventLogger] Gradle Test Run :subproject:integTest STARTED
13:58:08.943 [DEBUG] [org.gradle.api.internal.tasks.testing.detection.AbstractTestFrameworkDetector] test-class-scan : failed to scan parent class java/lang/Object, could not find the class file

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X