Gradle, tests: show test results in IDE
#KT-29946
This commit is contained in:
+15
-3
@@ -32,7 +32,11 @@ internal class TCServiceMessagesClient(
|
|||||||
val settings: TCServiceMessagesClientSettings,
|
val settings: TCServiceMessagesClientSettings,
|
||||||
val log: Logger
|
val log: Logger
|
||||||
) : ServiceMessageParserCallback {
|
) : ServiceMessageParserCallback {
|
||||||
|
lateinit var rootOperationId: Any
|
||||||
|
|
||||||
inline fun root(operation: OperationIdentifier, actions: () -> Unit) {
|
inline fun root(operation: OperationIdentifier, actions: () -> Unit) {
|
||||||
|
rootOperationId = operation.id
|
||||||
|
|
||||||
RootNode(operation.id).open {
|
RootNode(operation.id).open {
|
||||||
actions()
|
actions()
|
||||||
}
|
}
|
||||||
@@ -129,7 +133,9 @@ internal class TCServiceMessagesClient(
|
|||||||
extractExceptionClassName(parsedStackTrace?.message ?: message.failureMessage),
|
extractExceptionClassName(parsedStackTrace?.message ?: message.failureMessage),
|
||||||
message.failureMessage,
|
message.failureMessage,
|
||||||
stacktrace,
|
stacktrace,
|
||||||
patchStackTrace(this, parsedStackTrace?.stackTrace)
|
patchStackTrace(this, parsedStackTrace?.stackTrace),
|
||||||
|
message.expected,
|
||||||
|
message.actual
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -333,6 +339,7 @@ internal class TCServiceMessagesClient(
|
|||||||
inner class RootNode(val ownerBuildOperationId: Any) : GroupNode(null, settings.rootNodeName) {
|
inner class RootNode(val ownerBuildOperationId: Any) : GroupNode(null, settings.rootNodeName) {
|
||||||
override val descriptor: TestDescriptorInternal = object : DefaultTestSuiteDescriptor(settings.rootNodeName, localId) {
|
override val descriptor: TestDescriptorInternal = object : DefaultTestSuiteDescriptor(settings.rootNodeName, localId) {
|
||||||
override fun getOwnerBuildOperationId(): Any? = this@RootNode.ownerBuildOperationId
|
override fun getOwnerBuildOperationId(): Any? = this@RootNode.ownerBuildOperationId
|
||||||
|
override fun getParent(): TestDescriptorInternal? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun requireReportingNode(): TestDescriptorInternal = descriptor
|
override fun requireReportingNode(): TestDescriptorInternal = descriptor
|
||||||
@@ -376,7 +383,9 @@ internal class TCServiceMessagesClient(
|
|||||||
this.reportingParent = reportingParent
|
this.reportingParent = reportingParent
|
||||||
|
|
||||||
descriptor = object : DefaultTestSuiteDescriptor(id, fullName) {
|
descriptor = object : DefaultTestSuiteDescriptor(id, fullName) {
|
||||||
override fun getParent(): TestDescriptorInternal? = reportingParent.descriptor
|
override fun getDisplayName(): String = fullNameWithoutRoot
|
||||||
|
override fun getOwnerBuildOperationId(): Any? = rootOperationId
|
||||||
|
override fun getParent(): TestDescriptorInternal = reportingParent.descriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
shouldReportComplete = true
|
shouldReportComplete = true
|
||||||
@@ -413,9 +422,12 @@ internal class TCServiceMessagesClient(
|
|||||||
) : Node(parent, localId) {
|
) : Node(parent, localId) {
|
||||||
val output by lazy { StringBuilder() }
|
val output by lazy { StringBuilder() }
|
||||||
|
|
||||||
|
private val parentDescriptor = (this@TestNode.parent as GroupNode).requireReportingNode()
|
||||||
|
|
||||||
override val descriptor: TestDescriptorInternal =
|
override val descriptor: TestDescriptorInternal =
|
||||||
object : DefaultTestDescriptor(id, className, methodName, classDisplayName, displayName) {
|
object : DefaultTestDescriptor(id, className, methodName, classDisplayName, displayName) {
|
||||||
override fun getParent(): TestDescriptorInternal? = (this@TestNode.parent as GroupNode).requireReportingNode()
|
override fun getOwnerBuildOperationId(): Any? = rootOperationId
|
||||||
|
override fun getParent(): TestDescriptorInternal = parentDescriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun markStarted(ts: Long) {
|
override fun markStarted(ts: Long) {
|
||||||
|
|||||||
+1
-2
@@ -20,13 +20,12 @@ import org.gradle.api.plugins.BasePlugin
|
|||||||
import org.gradle.api.plugins.JavaBasePlugin
|
import org.gradle.api.plugins.JavaBasePlugin
|
||||||
import org.gradle.api.tasks.Delete
|
import org.gradle.api.tasks.Delete
|
||||||
import org.gradle.api.tasks.bundling.Jar
|
import org.gradle.api.tasks.bundling.Jar
|
||||||
import org.gradle.api.tasks.testing.Test
|
|
||||||
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
import org.gradle.language.jvm.tasks.ProcessResources
|
import org.gradle.language.jvm.tasks.ProcessResources
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
||||||
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTestTask
|
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTestTask
|
||||||
import org.jetbrains.kotlin.gradle.testing.registerTestTask
|
import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -9,8 +9,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsSetupTask
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.tasks.*
|
import org.jetbrains.kotlin.gradle.targets.js.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
import org.jetbrains.kotlin.gradle.testing.configureConventions
|
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
|
||||||
import org.jetbrains.kotlin.gradle.testing.registerTestTask
|
import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
internal class KotlinJsCompilationTestsConfigurator(
|
internal class KotlinJsCompilationTestsConfigurator(
|
||||||
|
|||||||
+2
-2
@@ -24,8 +24,8 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPI
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTestTask
|
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTestTask
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.testing.configureConventions
|
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
|
||||||
import org.jetbrains.kotlin.gradle.testing.registerTestTask
|
import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|||||||
-17
@@ -89,23 +89,6 @@ open class AggregateTestReport : DefaultTask() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val intellijReporterListener = object : TestListener {
|
|
||||||
override fun beforeTest(testDescriptor: TestDescriptor) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun afterSuite(suite: TestDescriptor, result: TestResult) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun beforeSuite(suite: TestDescriptor) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {
|
|
||||||
if (result.failedTestCount > 0) {
|
|
||||||
hasFailedTests = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal var checkFailedTests: Boolean = false
|
internal var checkFailedTests: Boolean = false
|
||||||
|
|
||||||
fun registerTestTask(task: AbstractTestTask) {
|
fun registerTestTask(task: AbstractTestTask) {
|
||||||
|
|||||||
+4
-2
@@ -19,8 +19,10 @@ import org.gradle.internal.serialize.PlaceholderException
|
|||||||
class KotlinTestFailure(
|
class KotlinTestFailure(
|
||||||
className: String,
|
className: String,
|
||||||
message: String?,
|
message: String?,
|
||||||
private val stackTraceString: String?,
|
val stackTraceString: String?,
|
||||||
private val stackTrace: List<StackTraceElement>? = null
|
private val stackTrace: List<StackTraceElement>? = null,
|
||||||
|
val expected: String? = null,
|
||||||
|
val actual: String? = null
|
||||||
) : PlaceholderException(
|
) : PlaceholderException(
|
||||||
className,
|
className,
|
||||||
message,
|
message,
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
* that can be found in the license/LICENSE.txt file.
|
* that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.testing
|
package org.jetbrains.kotlin.gradle.testing.internal
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.internal.plugins.DslObject
|
import org.gradle.api.internal.plugins.DslObject
|
||||||
+10
-4
@@ -3,12 +3,14 @@
|
|||||||
* that can be found in the license/LICENSE.txt file.
|
* that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.testing
|
package org.jetbrains.kotlin.gradle.testing.internal
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.plugins.JavaBasePlugin
|
||||||
import org.gradle.api.tasks.testing.AbstractTestTask
|
import org.gradle.api.tasks.testing.AbstractTestTask
|
||||||
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTestTask
|
||||||
import org.jetbrains.kotlin.gradle.tasks.AggregateTestReport
|
import org.jetbrains.kotlin.gradle.tasks.AggregateTestReport
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
|
|
||||||
@@ -16,6 +18,9 @@ internal val Project.allTestsTask: TaskHolder<AggregateTestReport>
|
|||||||
get() = locateOrRegisterTask("allTests") { aggregate ->
|
get() = locateOrRegisterTask("allTests") { aggregate ->
|
||||||
tasks.maybeCreate(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(aggregate)
|
tasks.maybeCreate(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(aggregate)
|
||||||
|
|
||||||
|
description = "Runs the tests for all targets and create aggregated report"
|
||||||
|
group = JavaBasePlugin.VERIFICATION_GROUP
|
||||||
|
|
||||||
aggregate.reports.configureConventions(project, "all")
|
aggregate.reports.configureConventions(project, "all")
|
||||||
|
|
||||||
aggregate.onlyIf {
|
aggregate.onlyIf {
|
||||||
@@ -34,9 +39,8 @@ internal fun registerTestTask(task: AbstractTestTask) {
|
|||||||
|
|
||||||
project.gradle.taskGraph.whenReady {
|
project.gradle.taskGraph.whenReady {
|
||||||
if (it.hasTask(allTests)) {
|
if (it.hasTask(allTests)) {
|
||||||
// when [allTestsTask] task enabled
|
// when [allTestsTask] task enabled, test failure should be reported only on [allTestsTask],
|
||||||
// let all tests be executed even on failed tests
|
// not at individual target's test tasks. To do that, we need:
|
||||||
// let all failed test be reported by [allTestsTask]:
|
|
||||||
// - disable all reporting in test tasks
|
// - disable all reporting in test tasks
|
||||||
// - enable [checkFailedTests] on [allTestsTask]
|
// - enable [checkFailedTests] on [allTestsTask]
|
||||||
|
|
||||||
@@ -48,4 +52,6 @@ internal fun registerTestTask(task: AbstractTestTask) {
|
|||||||
allTests.ignoreFailures = false
|
allTests.ignoreFailures = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ijListenTestTask(task)
|
||||||
}
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.testing.internal
|
||||||
|
|
||||||
|
import org.gradle.api.tasks.testing.AbstractTestTask
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Experimental test reporting for Intellij Ultimate only
|
||||||
|
*/
|
||||||
|
internal fun ijListenTestTask(task: AbstractTestTask) {
|
||||||
|
Class.forName("org.jetbrains.kotlin.gradle.testing.internal.IjTestListener")
|
||||||
|
?.getMethod("attachTo")
|
||||||
|
?.invoke(null, task)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user