我们刚开始在我们的项目中使用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,main]) completed. Took 0.229 secs. :contentplatform-service:processtestResources (Thread[Daemon worker Thread 7,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,m ain]) completed. Took 0.001 secs. :contentplatform-service:testClasses (Thread[Daemon worker Thread 7,main]) sta rted. :contentplatform-service:testClasses Skipping task ':contentplatform-service:testClasses' as it has no actions. :contentplatform-service:testClasses (Thread[Daemon worker Thread 7,main]) com pleted. Took 0.001 secs. :contentplatform-service:test (Thread[Daemon worker Thread 7,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,main]) completed. Took 0.194 secs.
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包含:
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"
}
}
我已经看过关于这个主题的other questions了,在那里我发现使用scanForTestClasses = false作为解决方法的提示(见https://issues.gradle.org/browse/GRADLE-1682).但是,这个问题似乎无关紧要.我在这里犯了一些其他的菜鸟错误吗?如何才能让SuperSimpleTest执行?
更新:我试图强制gradle运行一个特定的测试,结果是一个有趣的错误:Gradle complains about JUnit version on TestNG task
解决方法
这确实是一个愚蠢的noob错误.我们正在使用一个多项目设置,其中包含一个主项目和同一级别的几个文件夹,其中包含代码和测试.我意外使用的build.gradle只配置了主项目以使用TestNG.解决方案是将测试目标包含在allprojects或子项目闭包中.这里解释的是:
What is the difference between allprojects and subprojects
所以这是工作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('.')
}