Gradle, tests: show test results in IDE

#KT-29946
This commit is contained in:
Sergey Rostov
2019-04-04 16:49:18 +03:00
parent 125dc65178
commit 8b16f182f6
9 changed files with 52 additions and 33 deletions
@@ -32,7 +32,11 @@ internal class TCServiceMessagesClient(
val settings: TCServiceMessagesClientSettings,
val log: Logger
) : ServiceMessageParserCallback {
lateinit var rootOperationId: Any
inline fun root(operation: OperationIdentifier, actions: () -> Unit) {
rootOperationId = operation.id
RootNode(operation.id).open {
actions()
}
@@ -129,7 +133,9 @@ internal class TCServiceMessagesClient(
extractExceptionClassName(parsedStackTrace?.message ?: message.failureMessage),
message.failureMessage,
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) {
override val descriptor: TestDescriptorInternal = object : DefaultTestSuiteDescriptor(settings.rootNodeName, localId) {
override fun getOwnerBuildOperationId(): Any? = this@RootNode.ownerBuildOperationId
override fun getParent(): TestDescriptorInternal? = null
}
override fun requireReportingNode(): TestDescriptorInternal = descriptor
@@ -376,7 +383,9 @@ internal class TCServiceMessagesClient(
this.reportingParent = reportingParent
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
@@ -413,9 +422,12 @@ internal class TCServiceMessagesClient(
) : Node(parent, localId) {
val output by lazy { StringBuilder() }
private val parentDescriptor = (this@TestNode.parent as GroupNode).requireReportingNode()
override val descriptor: TestDescriptorInternal =
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) {
@@ -20,13 +20,12 @@ import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.Delete
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.jvm.tasks.ProcessResources
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.*
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 java.util.concurrent.Callable
@@ -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.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.testing.configureConventions
import org.jetbrains.kotlin.gradle.testing.registerTestTask
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask
import org.jetbrains.kotlin.utils.addIfNotNull
internal class KotlinJsCompilationTestsConfigurator(
@@ -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.targets.native.tasks.KotlinNativeTestTask
import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.testing.configureConventions
import org.jetbrains.kotlin.gradle.testing.registerTestTask
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask
import java.io.File
import java.util.*
@@ -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
fun registerTestTask(task: AbstractTestTask) {
@@ -19,8 +19,10 @@ import org.gradle.internal.serialize.PlaceholderException
class KotlinTestFailure(
className: String,
message: String?,
private val stackTraceString: String?,
private val stackTrace: List<StackTraceElement>? = null
val stackTraceString: String?,
private val stackTrace: List<StackTraceElement>? = null,
val expected: String? = null,
val actual: String? = null
) : PlaceholderException(
className,
message,
@@ -3,7 +3,7 @@
* 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.internal.plugins.DslObject
@@ -3,12 +3,14 @@
* 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.plugins.JavaBasePlugin
import org.gradle.api.tasks.testing.AbstractTestTask
import org.gradle.language.base.plugins.LifecycleBasePlugin
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.locateOrRegisterTask
@@ -16,6 +18,9 @@ internal val Project.allTestsTask: TaskHolder<AggregateTestReport>
get() = locateOrRegisterTask("allTests") { 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.onlyIf {
@@ -34,9 +39,8 @@ internal fun registerTestTask(task: AbstractTestTask) {
project.gradle.taskGraph.whenReady {
if (it.hasTask(allTests)) {
// when [allTestsTask] task enabled
// let all tests be executed even on failed tests
// let all failed test be reported by [allTestsTask]:
// when [allTestsTask] task enabled, test failure should be reported only on [allTestsTask],
// not at individual target's test tasks. To do that, we need:
// - disable all reporting in test tasks
// - enable [checkFailedTests] on [allTestsTask]
@@ -48,4 +52,6 @@ internal fun registerTestTask(task: AbstractTestTask) {
allTests.ignoreFailures = false
}
}
ijListenTestTask(task)
}
@@ -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)
}