Nutzung

Aufbau des Korpus, Format der Erwartungsdateien und Beispiele für eigene Tests.

Aufbau

korpus/
  valid/<szenario>_ubl.xml            gültige Rechnung (UBL)
  valid/<szenario>_cii.xml            gültige Rechnung (CII)
  invalid/<mutation>_ubl.xml          verletzt die Zielregel (target_rule)
  invalid/<mutation>_cii.xml          dasselbe in CII
  *.expected.json                     Erwartung je Datei
  manifest.csv                        eine Zeile je Datei, mit sha256
  index.json                          alle Erwartungen und Versionen
  LICENSE.txt, NOTICE.txt             CC0 1.0 und Lizenzhinweise
generator/                            Generator einvoice-core (Python, MIT)

Erwartungsdatei

Gekürztes Beispiel. Die vollständige Datei enthält zusätzlich die Meldungstexte und Fundstellen (XPath) des Validators, die Ausgangsdatei und die Versionen.

{
  "file": "invalid/br-de-15-kaeuferreferenz-fehlt_ubl.xml",
  "syntax": "ubl",
  "valid": false,
  "expected_verdict": "reject",
  "target_rule": "BR-DE-15",
  "expected_errors": [
    "BR-DE-15"
  ],
  "expected_warnings": []
}

In eigenen Tests verwenden

Beispiel in Python: alle Dateien prüfen und mit der Erwartung vergleichen.

import csv, json, pathlib

korpus = pathlib.Path("korpus")
for row in csv.DictReader(open(korpus / "manifest.csv", encoding="utf-8")):
    erwartet = json.loads((korpus / row["file"]).with_suffix(".expected.json").read_text("utf-8"))
    ergebnis = mein_validator(korpus / row["file"])      # deine Prüfung
    assert ergebnis.angenommen == erwartet["valid"], row["file"]
    assert set(ergebnis.fehlercodes) == set(erwartet["expected_errors"]), row["file"]

Mit dem KoSIT-Validator nachprüfen

Mit genau den Versionen, gegen die das Korpus geprüft wurde, samt Prüfsummen (Java 11 oder neuer):

curl -LO https://repo1.maven.org/maven2/org/kosit/validator/1.6.3/validator-1.6.3-standalone.jar
curl -L -o konfiguration.zip https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/v2026-08-31/xrechnung-3.0.2-validator-configuration-2026-08-31.zip
echo "799e64befca97d4080e03608c80b85dd5a5ecc5f4ae4f35d1116ec2855b9a7c9  validator-1.6.3-standalone.jar" | sha256sum -c
echo "2530cd107c414511c5d0462ec10f886910395abfca820db82e83d70bf01221a8  konfiguration.zip" | sha256sum -c
unzip -d konfiguration konfiguration.zip
java -jar validator-1.6.3-standalone.jar -s konfiguration/scenarios.xml \
  -r konfiguration -o berichte korpus/invalid/*.xml

Korpus neu erzeugen

Der Generator einvoice-core (Python 3.11, ohne weitere Abhängigkeiten, MIT-Lizenz) liegt dem Archiv im Ordner generator/ bei. Er erzeugt alle Dateien aus einem Parametermodell und einem Katalog von Mutationen:

cd erechnung-testkorpus/generator
python3 -m einvoice_core fetch                       # Validator und Konfiguration (gepinnt, sha256-geprüft)
python3 -m einvoice_core verify-corpus ../korpus     # mitgeliefertes Korpus mit dem Validator nachprüfen
python3 -m einvoice_core build-corpus ../korpus-neu  # neu erzeugen und gegen den Validator abgleichen