Skip to content

Commit 2f63f03

Browse files
Do not report code coverage for skipped tests (#7244)
1 parent 9e325ef commit 2f63f03

3 files changed

Lines changed: 41 additions & 22 deletions

File tree

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,15 @@ public void end(@Nullable Long endTime) {
220220
InstrumentationTestBridge.fireBeforeTestEnd(context);
221221

222222
CoverageBridge.removeThreadLocalCoverageProbeStore();
223-
boolean coveragesGathered =
224-
context.getCoverageProbeStore().report(sessionId, suiteId, span.getSpanId());
225-
if (!coveragesGathered && !TestStatus.skip.equals(span.getTag(Tags.TEST_STATUS))) {
226-
// test is not skipped, but no coverages were gathered
227-
metricCollector.add(CiVisibilityCountMetric.CODE_COVERAGE_IS_EMPTY, 1);
223+
224+
// do not process coverage reports for skipped tests
225+
if (span.getTag(Tags.TEST_STATUS) != TestStatus.skip) {
226+
CoverageProbeStore coverageStore = context.getCoverageProbeStore();
227+
boolean coveragesGathered = coverageStore.report(sessionId, suiteId, span.getSpanId());
228+
if (!coveragesGathered && !TestStatus.skip.equals(span.getTag(Tags.TEST_STATUS))) {
229+
// test is not skipped, but no coverages were gathered
230+
metricCollector.add(CiVisibilityCountMetric.CODE_COVERAGE_IS_EMPTY, 1);
231+
}
228232
}
229233

230234
scope.close();

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/TestImplTest.groovy

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import datadog.trace.agent.tooling.TracerInstaller
55
import datadog.trace.api.Config
66
import datadog.trace.api.DDSpanTypes
77
import datadog.trace.api.IdGenerationStrategy
8+
import datadog.trace.api.civisibility.coverage.CoverageProbeStore
89
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation
910
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
1011
import datadog.trace.civisibility.codeowners.NoCodeowners
12+
import datadog.trace.civisibility.coverage.CoverageProbeStoreFactory
1113
import datadog.trace.civisibility.coverage.NoopCoverageProbeStore
1214
import datadog.trace.civisibility.decorator.TestDecoratorImpl
1315
import datadog.trace.civisibility.domain.TestImpl
@@ -104,7 +106,24 @@ class TestImplTest extends DDSpecification {
104106
})
105107
}
106108

107-
private TestImpl givenATest() {
109+
def "test coverage is not reported if test was skipped"() {
110+
setup:
111+
def coverageStore = Mock(CoverageProbeStore)
112+
def coveageStoreFactory = Stub(CoverageProbeStoreFactory)
113+
coveageStoreFactory.create(_, _) >> coverageStore
114+
115+
def test = givenATest(coveageStoreFactory)
116+
117+
when:
118+
test.setSkipReason("skipped")
119+
test.end(null)
120+
121+
then:
122+
0 * coverageStore.report(_, _, _)
123+
}
124+
125+
private TestImpl givenATest(
126+
CoverageProbeStoreFactory coverageProbeStoreFactory = new NoopCoverageProbeStore.NoopCoverageProbeStoreFactory()) {
108127
def sessionId = 123
109128
def moduleId = 456
110129
def suiteId = 789
@@ -115,7 +134,6 @@ class TestImplTest extends DDSpecification {
115134
def testDecorator = new TestDecoratorImpl("component", [:])
116135
def methodLinesResolver = { it -> MethodLinesResolver.MethodLines.EMPTY }
117136
def codeowners = NoCodeowners.INSTANCE
118-
def coverageProbeStoreFactory = new NoopCoverageProbeStore.NoopCoverageProbeStoreFactory()
119137
new TestImpl(
120138
sessionId,
121139
moduleId,

dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import java.util.Collection;
3131
import java.util.Collections;
3232
import java.util.List;
33-
import java.util.Objects;
34-
import java.util.stream.Collectors;
3533
import okhttp3.MultipartBody;
3634
import okhttp3.RequestBody;
3735

@@ -68,17 +66,16 @@ private CiTestCovMapperV2(int size, boolean compressionEnabled) {
6866
public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
6967
long serializationStartTimestamp = System.currentTimeMillis();
7068

71-
List<TestReport> testReports =
72-
trace.stream()
73-
// only consider test spans, since children spans
74-
// share test reports with their parents
75-
.filter(CiTestCovMapperV2::isTestSpan)
76-
.map(CiTestCovMapperV2::getTestReport)
77-
.filter(Objects::nonNull)
78-
.filter(TestReport::isNotEmpty)
79-
.collect(Collectors.toList());
80-
81-
for (TestReport testReport : testReports) {
69+
for (CoreSpan<?> span : trace) {
70+
if (!isTestSpan(span)) {
71+
continue;
72+
}
73+
74+
TestReport testReport = getTestReport(span);
75+
if (testReport == null || !testReport.isNotEmpty()) {
76+
continue;
77+
}
78+
8279
Long testSessionId = testReport.getTestSessionId();
8380
Long testSuiteId = testReport.getTestSuiteId();
8481

@@ -124,9 +121,9 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
124121
writable.writeInt(segment.getNumberOfExecutions());
125122
}
126123
}
127-
}
128124

129-
eventCount += testReports.size();
125+
eventCount++;
126+
}
130127
serializationTimeMillis += (int) (System.currentTimeMillis() - serializationStartTimestamp);
131128
}
132129

0 commit comments

Comments
 (0)