java Gradle 编译但不运行 TestNG 测试

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28150119/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 13:05:28  来源:igfitidea点击:

Gradle compiles but does not run TestNG tests

javaunit-testinggradletestng

提问by titusn

We just started using Gradle and TestNG on our project, so I am checking whether failing any test actually fails the build. I was quite surprised to see it does not. The tests are picked up and compiled correctly, so I see the class files. Also I do get a report of the run, but it says 0 tests (expected 2). Running gradle clean test -igives me the following:

我们刚刚开始在我们的项目中使用 Gradle 和 TestNG,所以我正在检查是否有任何测试失败实际上使构建失败。我很惊讶地看到它没有。测试被正确选择和编译,所以我看到了类文件。我也得到了一份运行报告,但它说 0 次测试(预计 2 次)。跑步gradle clean test -i给了我以下内容:

:contentplatform-service:compileTestJava (Thread[Daemon worker Thread 7,5,main])
 started.
:contentplatform-service:compileTestJava
Executing task ':contentplatform-service:compileTestJava' (up-to-date check took
 0.08 secs) due to:
  Output file D:\Dev\contentplatform-service\build\classes\test has changed.
  Output file D:\Dev\contentplatform-service\build\dependency-cache has changed.

  Output file D:\Dev\contentplatform-service\build\classes\test\nl\xillio\conten
tplatform\service\SuperSimpleTest.class has been removed.
All input files are considered out-of-date for incremental task ':contentplatfor
m-service:compileTestJava'.
Compiling with JDK Java compiler API.
:contentplatform-service:compileTestJava (Thread[Daemon worker Thread 7,5,main])
 completed. Took 0.229 secs.
:contentplatform-service:processTestResources (Thread[Daemon worker Thread 7,5,m
ain]) started.
:contentplatform-service:processTestResources
Skipping task ':contentplatform-service:processTestResources' as it has no sourc
e files.
:contentplatform-service:processTestResources UP-TO-DATE
:contentplatform-service:processTestResources (Thread[Daemon worker Thread 7,5,m
ain]) completed. Took 0.001 secs.
:contentplatform-service:testClasses (Thread[Daemon worker Thread 7,5,main]) sta
rted.
:contentplatform-service:testClasses
Skipping task ':contentplatform-service:testClasses' as it has no actions.
:contentplatform-service:testClasses (Thread[Daemon worker Thread 7,5,main]) com
pleted. Took 0.001 secs.
:contentplatform-service:test (Thread[Daemon worker Thread 7,5,main]) started.
:contentplatform-service:test
Executing task ':contentplatform-service:test' (up-to-date check took 0.049 secs
) due to:
  Output file D:\Dev\contentplatform-service\build\test-results\binary\test has
changed.
  Output file D:\Dev\contentplatform-service\build\test-results has changed.
  Output file D:\Dev\contentplatform-service\build\reports\tests has changed.
Finished generating test XML results (0.0 secs) into: D:\Dev\contentplatform-ser
vice\build\test-results
Generating HTML test report...
Finished generating test html results (0.014 secs) into: D:\Dev\contentplatform-
service\build\reports\tests
:contentplatform-service:test (Thread[Daemon worker Thread 7,5,main]) completed.
 Took 0.194 secs.

SuperSimpleTest.java:

SuperSimpleTest.java:

package nl.xillio.contentplatform.service;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

@Test
public class SuperSimpleTest {

    @BeforeClass
    public void setUp() {
        // code that will be invoked when this test is instantiated
    }

    @Test
    public void testTest() {
        Assert.assertEquals(true, true);
    }
}

build.gradle contains:

build.gradle 包含:

test {
    // enable TestNG support (default is JUnit)
    useTestNG()
    scanForTestClasses = false  
    include '**/*'

    testLogging {
        showStandardStreams = true

        // log results to "build/test-results" directory
        exceptionFormat "full"
        events "started", "passed", "skipped", "failed", "standardOut", "standardError"
    }
}

I already took a look at other questionsabout this topic, and there I found the hint to use scanForTestClasses = falseas a workaround (see https://issues.gradle.org/browse/GRADLE-1682). However, this problem seems unrelated. Am I making some other noob mistake here? How can I get SuperSimpleTest to just execute?

我已经查看了有关该主题的其他问题,并在那里找到了scanForTestClasses = false用作解决方法的提示(请参阅https://issues.gradle.org/browse/GRADLE-1682)。然而,这个问题似乎无关。我在这里犯了一些其他菜鸟错误吗?我怎样才能让 SuperSimpleTest 只执行?

UPDATE: I tried forcing gradle to run a specific test with an interesting error as a result: Gradle complains about JUnit version on TestNG task

更新:我尝试强制 gradle 运行一个特定的测试,结果出现了一个有趣的错误:Gradle 在 TestNG 任务上抱怨 JUnit 版本

回答by titusn

It was a stupid noob mistake indeed. We are using a multi-project setup with a master project and several folders on the same level, which contain the code and the tests. The build.gradleI was using accidentally only configured the master project to use TestNG. The solution is to include the test target within the allprojectsor subprojectsclosure. Which is explained here: What is the difference between allprojects and subprojects

这确实是一个愚蠢的菜鸟错误。我们正在使用多项目设置,其中包含一个主项目和同一级别的多个文件夹,其中包含代码和测试。在build.gradle我使用不慎唯一配置的主项目使用TestNG的。解决方案是在allprojectsorsubprojects闭包中包含测试目标。在这里解释:allprojects 和 subprojects 之间有什么区别

So here is the working build.gradle:

所以这是工作build.gradle

def mainClassName = 'nl.xillio.contentplatform.view.Run'


// Load settings for all projects including master and subprojects
allprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'

    version '0.1'

    repositories {
        mavenCentral()
        maven {
            url 'http://mvnrepository.com/maven2'
        }
        maven {
            url 'http://download.java.net/maven/2'
        }
    }
}

// Load the dependencies for all subprojects (layers)
subprojects {
    dependencies {
    //to do: move these to the correct subprojects
        compile 'javax.inject:javax.inject:1'
        compile 'org.springframework:spring-context:4.1.4.RELEASE'
        compile 'org.springframework:spring-core:4.1.4.RELEASE'
        compile 'org.springframework:spring-beans:4.1.4.RELEASE'
        compile 'commons-logging:commons-logging:1.2'
        testCompile 'org.springframework:spring-test:4.1.4.RELEASE'
        testCompile 'org.testng:testng:6.1.1'
    }

    test {
        // enable TestNG support (default is JUnit)
        useTestNG() 
    }
}

// Resolve the dependencies between the layers in the individual project's build.gradle files
// add ONLY specific per project behaviour of the GLOBAL build here:

project(':contentplatform-web') {
}

project(':contentplatform-service') {
}

project(':contentplatform-dao') {
}

// Return a list of all the external libraries
def getLibraries() {
    return configurations.runtime.filter{!it.name.startsWith('contentplatform')}
}

// Copy all the libraries to a libs folder
task copyLibraries(type: Copy) {
    group 'Content Platform'
    description 'Copy all the external libraries to the /libs folder.'

    destinationDir file('./build/')

    into('libs/') {
        from getLibraries()
    }
}

// Perform the build task before building the big jar
jar {
    group 'Content Platform'
    description 'Package all the layers and dependencies into a big jar.'

    // The libraries are required to build
    dependsOn(copyLibraries)

    // The final big jar needs all the layers
    dependencies {
        compile project(':contentplatform-web'), project(':contentplatform-dao'),
            project(':contentplatform-service'), project(':contentplatform-model')
    }
    // Create a MANIFEST.MF file, the main class file is in the web layer
    manifest {
        attributes 'Implementation-Title': 'Content Platform',  
            'Implementation-Version': version,
            'Built-By': System.getProperty('user.name'),
            'Built-Date': new Date(),
            'Built-JDK': System.getProperty('java.version'),
            'Class-Path': getLibraries().collect{'../libs/' + it.getName()}.join(' '),
            'Main-Class': mainClassName
    }

    // Include the layers in the fat jar
    from(configurations.compile.filter{it.name.startsWith('contentplatform')}.collect{it.isDirectory() ? it : zipTree(it) }) {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }

    // Save the fat jar in the root of the folder instead of in build/libs
    destinationDir file('.')
}