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": []
}
expected_verdict:acceptoderrejectnach dem Szenario „EN16931 XRechnung“ der KoSIT-Konfiguration.target_rule: die Regel, auf die die Änderung zielt.expected_errors: alle Codes mit dem Schweregrad „error“, die der Validator meldet – neben der Zielregel auch Folgefehler, die dieselbe Änderung zwangsläufig auslöst.expected_warnings: Warnungen, wie sie der Validator beim Bau gemeldet hat.
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