ABLUnit supports two output writer formats, giving you the flexibility to generate results compatible with both Progress Developer Studio for OpenEdge and third-party CI/CD tools:

  • ablunit writer (implemented by ResultsXmlWriter) โ€” the Progress Developer Studio for OpenEdge-compatible format, based on a lenient Jenkins JUnit schema. This is the default.
  • junit writer (implemented by JUnitXmlWriter) โ€” a stricter format based on the Apache Ant JUnit schema, intended for CI/CD tooling such as Jenkins, Azure DevOps, GitLab CI, GitHub Actions, and TeamCity.

An ablunit.config.schema file is included with the ABLUnit source code to validate the JSON configuration file passed as -param "CFG=C:\config-file" when executing ABLUnitCore.p.

Default writer behavior

If the writers object is not specified, ABLUnit uses the fileName and format properties to configure the default ablunit writer. Existing configuration files continue to work without modification:

{
  "options": {
    "output": {
      "location": "C:\\results",
      "fileName": "results",
      "format": "xml"
    }
  }
}

Configure writers

To generate output from one or both writers, add a writers object under output:

{
  "options": {
    "output": {
      "location": "C:\\results",
      "writers": {
        "ablunit": {
          "fileName": "results",
          "format": "xml"
        },
        "junit": {
          "fileName": "junit-results",
          "format": "xml"
        }
      }
    }
  }
}

Each writer behaves as follows:

  • If a writer key is present, even with a null value, that writer runs using its default settings.
  • If writers is specified, it overrides the fileName and format properties set directly under output, which otherwise configure the default ablunit writer.
  • Each writer can set its own fileName. Defaults apply if not specified.
  • Both writers default to, and currently only support, "xml".

Example: Use both writers with defaults

{
  "options": {
    "output": {
      "location": "C:\\results",
      "writers": {
        "ablunit": null,
        "junit": null
      }

    }
  }
}

Generates both results.xml (ablunit writer) and junit-results.xml (junit writer), using default file names.

Example: Generate JUnit output only

{
  "options": {
    "output": {
      "location": "C:\\results",
      "writers": {
        "junit": {
          "fileName": "ci-test-results"
        }
      }

    }
  }
}

Generates only ci-test-results.xml, from the junit writer.

Example: writers takes precedence over fileName

{
  "options": {
    "output": {
      "location": "C:\\results",
      "fileName": "direct-results",
      "writers": {
        "junit": {
          "fileName": "junit-output"
        }
      }
    }
  }
}

Generates only junit-output.xml. Because writers is present, "fileName": "direct-results" is ignored.

junit writer metadata

The junit writer produces strict Apache Ant JUnit schema output and includes metadata not present in the ablunit writer's output:

  • An ISO 8601 timestamp on each <testsuite> element, indicating when the suite ran:
    <testsuite name="MyTestClass" timestamp="2026-08-21T14:32:05" ...>
  • The hostname of the machine that ran the tests, on each <testsuite> element, for traceability in distributed CI/CD environments:
    <testsuite name="MyTestClass" hostname="build-server-01" ...>
  • Time values in decimal seconds with millisecond precision:
    <testsuite name="MyTestClass" time="1.234" ...>
      <testcase name="testMethod1" classname="MyTestClass" time="0.456" />
    </testsuite>
  • A required classname attribute on every <testcase> element
  • Required (though currently empty) <system-out> and <system-err> elements

Format comparison

Feature ablunit writer junit writer
Schema Lenient JUnit (Jenkins-compatible) Apache Ant JUnit (strict)
Timestamp Not included ISO 8601 timestamp on <testsuite>
Hostname Not included Hostname on <testsuite>
Time Format Decimal seconds Decimal seconds (same)
Classname Optional Required on <testcase>
System Output Not included Required on <system-out> and <system-err>
Testsuites Attributes Includes summary counts Container only (no attributes)
Use Case Progress Developer Studio for OpenEdge integration CI/CD tooling (Jenkins, Azure DevOps, GitLab CI)

Both writers can run from a single test execution, so you can generate Progress Developer Studio for OpenEdge-compatible and CI/CD-compatible results without running tests twice.