2

主なソースのいくつかを使用する独自のソース セットがあります。

sourceSets {
    special {
            java {
                source main.java
            }
    }

コンパイルして正しく実行できることを確認しました。

configurations {

    specialCompile.extendsFrom(compile)
    specialRuntime.extendsFrom(runtime)

}

そして、それに対する私自身のテストタスクがあります:

task heavyTest(type: Test) {
    useTestNG()         
    testClassesDir  = project.sourceSets.special.output.classesDir
    testSrcDirs    += project.sourceSets.special.java.srcDirs.toList()
}

特別なソースには、クラス org.me.ImportantTests のテスト メソッドが含まれています

コンパイルは機能し、テストはEclipseでも正常に実行されますが、gradleからheavyTestタスクを実行しようとすると失敗します

01:18:23.360 [ERROR] [system.err] 01:18:23.357 [ERROR] [system.err] [TestNG] [ERROR] No test suite found. Nothing to run
01:18:23.488 [QUIET] [system.out] 01:18:23.486 [QUIET] [system.out] Usage: <main class> [options] The XML suite files to run

-d を指定して実行すると、gradle で ClassNotFoundException が発生したことがわかります。

01:18:23.559 [DEBUG] [TestEventLogger]         Caused by:
01:18:23.559 [DEBUG] [TestEventLogger]         org.gradle.api.GradleException: Could not load test class 'org.me.ImportantTests'.
01:18:23.560 [DEBUG] [TestEventLogger]             at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.processTestClass(TestNGTestClassProcessor.java:67)
01:18:23.561 [DEBUG] [TestEventLogger]             at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
01:18:23.561 [DEBUG] [TestEventLogger]             ... 21 more
01:18:23.561 [DEBUG] [TestEventLogger]
01:18:23.562 [DEBUG] [TestEventLogger]             Caused by:
01:18:23.563 [DEBUG] [TestEventLogger]             java.lang.ClassNotFoundException: org.me.ImportantTests

.class ファイルがクラスパスにないように見えます... しかし、testClassesDir を適切に設定すると、クラスは正確にあるべき場所 (/org/me/ImportantTests.class) になります! このタスクの何が問題になっていますか?

4

1 に答える 1

1

わかりました、次の方法でこれを修正できることに気付きました。

task integTest2(type: Test) {
    useTestNG()
    testClassesDir  = project.sourceSets.special.output.classesDir
    classpath = classpath.plus(files(testClassesDir))
    testSrcDirs    += project.sourceSets.special.java.srcDirs.toList()
}

これは機能しますが、かなり... ばかげているように見えます。テストするクラスを含むディレクトリがクラスパス上にある必要があることをテストタスクに伝える必要があるのはなぜですか? 「そのディレクトリにあるクラスをテストしてください。ちなみに、それらをロードするには、それらがあるディレクトリを調べてみてください」. 私は何か間違ったことをしていますか?

于 2014-01-26T02:11:56.870 に答える