jvm Gradle集成测试套件取决于测试实施依赖关系

ne5o7dgx  于 2022-11-07  发布在  其他
关注(0)|答案(4)|浏览(139)

我正在尝试迁移到Gradle 7.3中引入的test suites。我想做的是将testImplementation依赖项添加到我的集成测试中。

testing {
    suites { 
        val test by getting(JvmTestSuite::class) { 
            useJUnitJupiter() 
        }

        val integrationTest by registering(JvmTestSuite::class) { 
            dependencies {
                implementation(project) // This adds dependencies to the prod code
                // What to add to automatically use testImplementation deps?
            }
            ...

        }
    }
}
mm5n2pyu

mm5n2pyu1#

你可能想让integrationTestImplementation配置扩展testImplementation配置--就像testImplementation已经默认扩展了implementation一样。
下面是一个自包含的示例(使用Gradle 7.3.2进行测试):

plugins {
    `java-library`
}

repositories {
    mavenCentral()
}

testing {
    suites { 
        val test by getting(JvmTestSuite::class) { 
            useJUnitJupiter() 
            dependencies {
                implementation("org.assertj:assertj-core:3.21.0")
            }
        }

        val integrationTest by registering(JvmTestSuite::class) { 
            dependencies {
                // TODO add any integration test only dependencies here
            }
        }
    }
}

// Here’s the bit that you’re after:
val integrationTestImplementation by configurations.getting {
    extendsFrom(configurations.testImplementation.get())
}

如果您运行./gradlew dependencies --configuration integrationTestRuntimeClasspath * 并配置了 * 配置继承,那么您将得到以下输出(缩写):

integrationTestRuntimeClasspath - Runtime classpath of source set 'integration test'.
+--- org.junit.jupiter:junit-jupiter:5.7.2
|    +--- org.junit:junit-bom:5.7.2
|    |    …
|    +--- org.junit.jupiter:junit-jupiter-api:5.7.2
|    |    …
|    +--- org.junit.jupiter:junit-jupiter-params:5.7.2
|    |    …
|    \--- org.junit.jupiter:junit-jupiter-engine:5.7.2
|         …
\--- org.assertj:assertj-core:3.21.0

但是,如果您运行同一个命令,* 而不 * 配置继承,那么您将得到以下输出(缩写)-请注意缺少org.assertj:assertj-core:3.21.0依赖项:

integrationTestRuntimeClasspath - Runtime classpath of source set 'integration test'.
\--- org.junit.jupiter:junit-jupiter:5.7.2
     +--- org.junit:junit-bom:5.7.2
     |    …
     +--- org.junit.jupiter:junit-jupiter-api:5.7.2
     |    …
     +--- org.junit.jupiter:junit-jupiter-params:5.7.2
     |    …
     \--- org.junit.jupiter:junit-jupiter-engine:5.7.2

根据答案注解中的要求,这里还有一种方法可以使单元测试套件中的测试数据类可用于集成测试:

sourceSets.named("integrationTest") {
    java {
        val sharedTestData = project.objects.sourceDirectorySet("testData",
                "Shared test data")
        sharedTestData.srcDir("src/test/java")
        sharedTestData.include("com/example/MyData.java")
        source(sharedTestData)
    }
}
3mpgtkmj

3mpgtkmj2#

我是一个Gradle开发人员,目前正在开发这个孵化功能。
需要记住的一点是,虽然当前为每个测试套件创建的配置名称都基于相应的sourceSet的名称,它与测试套件本身的名称相匹配,* 这些名称应该被视为实现细节 *。测试套件的主要目标之一是在这些细节上构建一个有用的抽象层,并允许您在不具备此类管道详细知识的情况下配置它们。
将配置与extendsFrom连接在一起违背了这一意图,任何类型的名称检索也是如此,应该将其视为反模式。
更好的选择包括使用suites.withType(JvmTestSuite).configureEach { suite -> ... }或创建一个包含您想要的配置的Closure,并使用它来配置感兴趣的测试套件,如下所示:

testing {
    suites {
        def applyMockitoAndJupiter = { suite -> 
            suite.useJUnitJupiter()
            suite.dependencies {
                implementation('org.mockito:mockito-junit-jupiter:4.6.1')
            }
        }

        /* This is the equivalent of:
            test {
                applyMockitoAndJupiter(this)
            }
         */
        test(applyMockitoAndJupiter) 

        /* This is the equivalent of:
            integrationTest(JvmTestSuite)
            applyMockitoAndJupiter(integrationTest)
         */
        integrationTest(JvmTestSuite, applyMockitoAndJupiter) 
    }
}

我们正在努力扩展测试套件和每个套件的dependencies块提供的功能,并使文档更明确地说明这一点。您可以在Gradle文档的未来版本中查看此建议的预览(可能会有进一步的更改)-您必须以访客身份登录。

6ss1mwsb

6ss1mwsb3#

我想出了以下解决方案

testing {
    suites { 
        val test by getting(JvmTestSuite::class) { 
            useJUnitJupiter() 
        }

        val integrationTest by registering(JvmTestSuite::class) {
            useJUnitJupiter()

            dependencies {
                implementation(project)
                // add testImplementation dependencies
                configurations.testImplementation {
                    dependencies.forEach(::implementation)
                }
            }

            sources {
                java {
                    //...
                }
            }

            targets {
                all {
                    testTask.configure {
                        shouldRunAfter(test)
                    }
                }
            }
        }
    }
}
yeotifhr

yeotifhr4#

这就是我用来避免为testcustomTest任务重写两次相同依赖项的方法。也许这并不像@Tom Tresansky所建议的那样,但我发现它非常方便:

configurations {
        customTestImplementation {
            extendsFrom testImplementation
        }
        customTestCompileOnly {
            extendsFrom testCompileOnly
        }
        customTestAnnotationProcessor {
            extendsFrom annotationProcessor
        }
    }

相关问题