Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include better failure information in swift-test xunit output #7622

Open
GNMoseke opened this issue Jun 1, 2024 · 1 comment
Open

Include better failure information in swift-test xunit output #7622

GNMoseke opened this issue Jun 1, 2024 · 1 comment

Comments

@GNMoseke
Copy link

GNMoseke commented Jun 1, 2024

Description

Problem

Currently, when creating an xunit xml output file with the --xunit-output option in swift test, test failures generate an empty <failure> tag:

 <testcase classname="ExampleTests.Tests" name="testFail" time="0.041534993">
 <failure message="failed"></failure>
 </testcase>

This doesn't really provide much useful information for anything that may want to consume this information (CI being the prime example). The xunit xml spec allows any string to be inside this tag.

I am not intimately familiar with XCTest, so as the fixme mentioned below indicates it may be that there just needs to be better reporting given by XCTIssue to include more relevant details.

Possible Fix

As the FIXME comment here suggests, we could simply stick the result.output onto line 1284

"""
            if !result.success {
                content += "<failure message=\"failed\">\(result.output)</failure>\n"
            }
"""

which generates XML that looks like this (just has stdout from the test invocation mushed into it):

<testcase classname="ExampleTests.Tests" name="testFail" time="0.029471092">
<failure message="failed">Test Suite 'Selected tests' started at 2024-06-01 21:02:59.244
Test Suite 'ExampleTests' started at 2024-06-01 21:02:59.246
Test Case 'Tests.testFail' started at 2024-06-01 21:02:59.246
/home/test-ex/Tests/test.swift:8: error: Tests.testFail : XCTAssertEqual failed: ("1") is not equal to ("2") -
/home/test-ex/Tests/test.swift:9: error: Tests.testFail : XCTAssertEqual failed: ("foo") is not equal to ("bar") -
/home/test-ex/Tests/test.swift:10: error: Tests.testFail : XCTAssertTrue failed -
Test Case 'Tests.testFail' failed (0.001 seconds)
Test Suite 'ExampleTests' failed at 2024-06-01 21:02:59.247
     Executed 1 test, with 3 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'Selected tests' failed at 2024-06-01 21:02:59.247
     Executed 1 test, with 3 failures (0 unexpected) in 0.001 (0.001) seconds
<failure>

That isn't ideal, but it's at least more detail than is given currently

If the full output is too verbose, there's plenty of room to process it down to something cleaner, but that would obviously be beholden to the output format remaining the same.

This does seem generally like it may need a wider refactor to pull additional information from the test reporter though, adjacent issues:

Expected behavior

xunit.xml failures include relevant failure information

Actual behavior

xunit.xml failures are empty

Steps to reproduce

Run swift test --parallel --xunit-output test.xml in any project with a test failure

Swift Package Manager version/commit hash

5.10

Swift & OS version (output of swift --version && uname -a)

Swift version 5.10 (swift-5.10-RELEASE)
Ubuntu 20.04 & macOS

@grynspan
Copy link
Contributor

grynspan commented Jun 9, 2024

Note that the output schema more closely matches JUnit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants