Format test reports
Results on the Tests tab are parsed from test reports specified in the Report Paths setting in Run and Test steps. Test reports must be in JUnit XML format to appear on the Tests tab, because Harness parses test reports that are in JUnit XML format only.
For optimal rendering in the Harness UI, there is a limit of 8,000 characters per field. If a field in your XML file contains more than 8,000 characters, the output might render incorrectly on the Tests tab.
JUnit XML format resources
Use these resources to learn about JUnit XML formatting.
- Common JUnit XML format and examples from Testmo
- Examples of JUnit XML format mapping from IBM
- Apache Ant JUnit schema
Tools with built-in JUnit XML output
Here are some Harness YAML examples for test tools that produce JUnit XML output by default.
C, C++
CTest Output JUnit
You can use the --output-junit command with CTest.
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Sh
      command: |-
        mkdir build
        cmake -S . -B build
        ctest --test-dir build --output-junit out.xml
      reports:
        type: JUnit
        spec:
          paths:
            - /harness/build/out.xml
Java - Gradle
Gradle
Run step:
              - step:
                  type: Run
                  ...
                  spec:
                    shell: Sh
                    command: |-
                     test --tests
                    ...
                    reports:
                      type: JUnit
                      spec:
                        paths:
                          - "/harness/results.xml"
                      type: JUnit
Test step:
              - step:
                  type: Test
                  name: Intelligent Tests
                  identifier: test
                  spec:
                    command: test --tests
                    shell: Sh
                    ...
                    reports:
                      - "/harness/results.xml"
PHP
PHPUnit
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Sh
      command: |-
        mkdir -p /harness/phpunit
        phpunit --log-junit /harness/phpunit/junit.xml tests
      reports:
        type: JUnit
        spec:
          paths:
            - /harness/phpunit/junit.xml
Python
For Python, use pytest or unittest. You can also use pytest to run unittest.
Pytest in a Run step
This example runs pytest in a Run step.
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Sh
      command: |-
        . venv/bin/activate
        mkdir /harness/test-results
        pytest --junitxml=harness/test-results/junit.xml
      reports:
        type: JUnit
        spec:
          paths:
            - /harness/test-results/junit.xml
If you use test splitting with pytest in a Run step, you must set junit_family=xunit1 in your code repo's pytest.ini file or include -o junit_family="xunit1" in the step's command.
Pytest with Test Intelligence (Test step)
This example runs pytest with Test Intelligence.
              - step:
                  type: Test
                  name: Intelligent Tests
                  identifier: test
                  spec:
                    command: |-
                      python3 -m venv .venv
                      . .venv/bin/activate
                      python3 -m pip install -r requirements/test.txt
                      python3 -m pip install -e .
                      pytest --junitxml=out_report.xml
                    shell: Python
                    ...
                    reports:
                      - out_report.xml*
Ruby - Cucumber
Cucumber
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Sh
      command: |-
        bundle check || bundle install
        mkdir -p /harness/cucumber
        bundle exec cucumber --format junit --out /harness/cucumber/junit.xml
      reports:
        type: JUnit
        spec:
          paths:
            - /harness/cucumber/junit.xml
JUnit converters, formatters, and plugins
If your test tool doesn't automatically produce test results in JUnit XML format, there are JUnit converters, formatters, and plugins available for all major languages. Some examples of conversion tools and corresponding Harness YAML are provided below.
C# - .NET Core, NUnit
Example: NUnit to JUnit
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Powershell
      command: |-
        cd dotnet-agent/TestProject1
        wget -UseBasicParsing https://dot.net/v1/dotnet-install.ps1 -o dotnet-install.ps1
        .\dotnet-install.ps1
        dotnet build
        wget https://raw.githubusercontent.com/nunit/nunit-transforms/master/nunit3-junit/nunit3-junit.xslt -o nunit3-junit.xslt
        "C:/Program Files (x86)/NUnit.org/nunit-console/nunit3-console.exe" dotnet-agent/TestProject1/bin/Debug/net48/TestProject1.dll --result="UnitTestResults.xml;transform=nunit3-junit.xslt"
      reports:
        type: JUnit
        spec:
          paths:
            - UnitTestResults.xml
Clojure
Go
Go Junit Report
You can use the go-junit-report tool.
- step:
    type: Run
    identifier: test
    name: Test
    spec:
      shell: Sh
      command: |-
        go install github.com/jstemmer/go-junit-report/v2@latest
        go test -v ./... | tee report.out
        cat report.out | $HOME/go/bin/go-junit-report -set-exit-code > report.xml
      reports:
        type: JUnit
        spec:
          paths:
            - report.xml
Java - Maven
Maven Surefire Plugin
This example uses the Maven Surefire Plugin.
Run step:
              - step:
                  type: Run
                  ...
                  spec:
                    shell: Sh
                    command: |-
                     test -Dmaven.test.failure.ignore=true -DfailIfNoTests=false
                    ...
                    reports:
                      type: JUnit
                      spec:
                        paths:
                          - "target/surefire-reports/*.xml"
                      type: JUnit
Test step:
              - step:
                  type: Test
                  name: Intelligent Tests
                  identifier: test
                  spec:
                    command: test -Dmaven.test.failure.ignore=true -DfailIfNoTests=false
                    shell: Sh
                    ...
                    reports:
                      - "target/surefire-reports/*.xml"
JavaScript
ESLint
- step:
    type: Run
    name: Run ESLint Tests
    identifier: run_eslint_tests
    spec:
      shell: Sh
      command: |
        mkdir -p /harness/reports
        eslint ./src/ --format junit --output-file /harness/reports/eslint.xml
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/reports/eslint.xml"
Jest
- step:
    type: Run
    name: Run Jest Tests
    identifier: run_jest_tests
    spec:
      shell: Sh
      command: |
        yarn add --dev jest-junit
        jest --ci --runInBand --reporters=default --reporters=jest-junit
    envVariables:
      JEST_JUNIT_OUTPUT_DIR: "/harness/reports"
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/reports/*.xml"
Karma
- step:
    type: Run
    name: Run Karma Tests
    identifier: run_karma_tests
    spec:
      shell: Sh
      command: |
        npm install
        mkdir /harness/junit
        karma start ./karma.conf.js
    envVariables:
      JUNIT_REPORT_PATH: /harness/junit/
      JUNIT_REPORT_NAME: test-results.xml
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/junit/test-results.xml"
Mocha
- step:
    type: Run
    name: Run Mocha Tests
    identifier: run_mocha_tests
    spec:
      shell: Sh
      command: |
        npm install
        mkdir /harness/junit
        mocha test --reporter mocha-junit-reporter --reporter-options mochaFile=./path_to_your/file.xml
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/junit/test-results.xml"
Ruby - Minitest, RSpec
Minitest
Add the Minitest Junit Formatter to your Gemfile.
- step:
    type: Run
    name: Run Ruby Tests
    identifier: run_ruby_tests
    spec:
      shell: Sh
      command: |
        bundle check || bundle install
        bundle exec rake test --junit
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/report.xml"
RSpec
Add the RSpec JUnit formatter to your Gemfile.
- step:
    type: Run
    name: Run RSpec Tests
    identifier: run_rspec_tests
    spec:
      shell: Sh
      command: |
        bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
        mkdir /harness/rspec
        bundle exec rspec --format progress --format RspecJunitFormatter -o /harness/rspec/rspec.xml
    reports:
      type: JUnit
      spec:
        paths:
          - "/harness/rspec/rspec.xml"
Code coverage reports and test report artifacts
For information about code coverage reports and publishing report URLs to the Artifacts tab, go to Code Coverage.
Troubleshoot test reports
Go to the CI Knowledge Base for questions and issues related to test reports in Harness CI, including: