Skip to content

Commit 16f22b4

Browse files
Fix handling skipped features in Karate (#6870)
1 parent 97b9cf1 commit 16f22b4

File tree

6 files changed

+144
-6
lines changed

6 files changed

+144
-6
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,10 @@ public void end(@Nullable Long endTime) {
165165
+ "it is possible that end() was called multiple times "
166166
+ "or an operation that was started by the suite is still in progress; "
167167
+ "active scope span is: "
168-
+ scopeSpan);
168+
+ scopeSpan
169+
+ "; "
170+
+ "expected span is: "
171+
+ span);
169172
}
170173

171174
scope.close();

dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ public boolean beforeFeature(FeatureRuntime fr) {
4848
KarateUtils.getCategories(feature.getTags()),
4949
suite.parallel,
5050
TestFrameworkInstrumentation.KARATE);
51+
52+
if (!fr.scenarios.hasNext()) {
53+
// Karate will not trigger the afterFeature hook if suite has no scenarios
54+
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteSkip(suiteDescriptor, null);
55+
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteFinish(suiteDescriptor);
56+
}
57+
5158
return true;
5259
}
5360

dd-java-agent/instrumentation/karate/src/test/groovy/KarateTest.groovy

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.example.TestFailedParameterizedKarate
88
import org.example.TestFailedThenSucceedKarate
99
import org.example.TestParameterizedKarate
1010
import org.example.TestParameterizedMoreCasesKarate
11+
import org.example.TestSkippedFeatureKarate
1112
import org.example.TestSucceedKarate
1213
import org.example.TestSucceedKarateSlow
1314
import org.example.TestSucceedOneCaseKarate
@@ -34,11 +35,12 @@ class KarateTest extends CiVisibilityInstrumentationTest {
3435
assertSpansData(testcaseName, expectedTracesCount)
3536

3637
where:
37-
testcaseName | tests | expectedTracesCount | assumption
38-
"test-succeed" | [TestSucceedKarate] | 3 | true
39-
"test-with-setup" | [TestWithSetupKarate] | 3 | isSetupTagSupported(FileUtils.KARATE_VERSION)
40-
"test-parameterized" | [TestParameterizedKarate] | 3 | true
41-
"test-failed" | [TestFailedKarate] | 3 | true
38+
testcaseName | tests | expectedTracesCount | assumption
39+
"test-succeed" | [TestSucceedKarate] | 3 | true
40+
"test-with-setup" | [TestWithSetupKarate] | 3 | isSetupTagSupported(FileUtils.KARATE_VERSION)
41+
"test-parameterized" | [TestParameterizedKarate] | 3 | true
42+
"test-failed" | [TestFailedKarate] | 3 | true
43+
"test-skipped-feature" | [TestSkippedFeatureKarate] | 1 | true
4244
}
4345

4446
def "test ITR #testcaseName"() {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.example;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import com.intuit.karate.Results;
6+
import com.intuit.karate.Runner;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class TestSkippedFeatureKarate {
10+
11+
@Test
12+
void testParallel() {
13+
Results results =
14+
Runner.path("classpath:org/example/test_succeed.feature")
15+
.systemProperty("karate.options", "--tags ~@foo")
16+
.parallel(1);
17+
assertEquals(0, results.getFailCount(), results.getErrorMessages());
18+
}
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[ ]
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
[ {
2+
"type" : "test_suite_end",
3+
"version" : 1,
4+
"content" : {
5+
"test_session_id" : ${content_test_session_id},
6+
"test_module_id" : ${content_test_module_id},
7+
"test_suite_id" : ${content_test_suite_id},
8+
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
9+
"name" : "karate.test_suite",
10+
"resource" : "[org/example/test_succeed] test succeed",
11+
"start" : ${content_start},
12+
"duration" : ${content_duration},
13+
"error" : 0,
14+
"metrics" : { },
15+
"meta" : {
16+
"test.type" : "test",
17+
"os.architecture" : ${content_meta_os_architecture},
18+
"test.module" : "karate",
19+
"test.status" : "skip",
20+
"test.traits" : "{\"category\":[\"foo\"]}",
21+
"runtime.name" : ${content_meta_runtime_name},
22+
"runtime.vendor" : ${content_meta_runtime_vendor},
23+
"env" : "none",
24+
"os.platform" : ${content_meta_os_platform},
25+
"dummy_ci_tag" : "dummy_ci_tag_value",
26+
"os.version" : ${content_meta_os_version},
27+
"library_version" : ${content_meta_library_version},
28+
"component" : "karate",
29+
"span.kind" : "test_suite_end",
30+
"test.suite" : "[org/example/test_succeed] test succeed",
31+
"runtime.version" : ${content_meta_runtime_version},
32+
"test.framework_version" : ${content_meta_test_framework_version},
33+
"test.framework" : "karate"
34+
}
35+
}
36+
}, {
37+
"type" : "test_session_end",
38+
"version" : 1,
39+
"content" : {
40+
"test_session_id" : ${content_test_session_id},
41+
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
42+
"name" : "karate.test_session",
43+
"resource" : "karate",
44+
"start" : ${content_start_2},
45+
"duration" : ${content_duration_2},
46+
"error" : 0,
47+
"metrics" : {
48+
"process_id" : ${content_metrics_process_id},
49+
"_dd.profiling.enabled" : 0,
50+
"_dd.trace_span_attribute_schema" : 0
51+
},
52+
"meta" : {
53+
"test.type" : "test",
54+
"os.architecture" : ${content_meta_os_architecture},
55+
"test.status" : "skip",
56+
"language" : "jvm",
57+
"runtime.name" : ${content_meta_runtime_name},
58+
"runtime.vendor" : ${content_meta_runtime_vendor},
59+
"env" : "none",
60+
"os.platform" : ${content_meta_os_platform},
61+
"dummy_ci_tag" : "dummy_ci_tag_value",
62+
"os.version" : ${content_meta_os_version},
63+
"library_version" : ${content_meta_library_version},
64+
"component" : "karate",
65+
"_dd.profiling.ctx" : "test",
66+
"span.kind" : "test_session_end",
67+
"runtime.version" : ${content_meta_runtime_version},
68+
"runtime-id" : ${content_meta_runtime_id},
69+
"test.command" : "karate",
70+
"test.framework_version" : ${content_meta_test_framework_version},
71+
"test.framework" : "karate"
72+
}
73+
}
74+
}, {
75+
"type" : "test_module_end",
76+
"version" : 1,
77+
"content" : {
78+
"test_session_id" : ${content_test_session_id},
79+
"test_module_id" : ${content_test_module_id},
80+
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
81+
"name" : "karate.test_module",
82+
"resource" : "karate",
83+
"start" : ${content_start_3},
84+
"duration" : ${content_duration_3},
85+
"error" : 0,
86+
"metrics" : { },
87+
"meta" : {
88+
"test.type" : "test",
89+
"os.architecture" : ${content_meta_os_architecture},
90+
"test.module" : "karate",
91+
"test.status" : "skip",
92+
"runtime.name" : ${content_meta_runtime_name},
93+
"runtime.vendor" : ${content_meta_runtime_vendor},
94+
"env" : "none",
95+
"os.platform" : ${content_meta_os_platform},
96+
"dummy_ci_tag" : "dummy_ci_tag_value",
97+
"os.version" : ${content_meta_os_version},
98+
"library_version" : ${content_meta_library_version},
99+
"component" : "karate",
100+
"span.kind" : "test_module_end",
101+
"runtime.version" : ${content_meta_runtime_version},
102+
"test.framework_version" : ${content_meta_test_framework_version},
103+
"test.framework" : "karate"
104+
}
105+
}
106+
} ]

0 commit comments

Comments
 (0)