Perfekt! Jetzt habe ich den Code-Kontext. Danke, dass du mir die Dokumentation bereitgestellt hast. 😊
Odoo Tests – Umfassender Überblick
Basierend auf dem bereitgestellten Code und der Dokumentation kann ich dir einen vollständigen Überblick geben:
Backend-Tests (Python)
Ich sehe in der Dokumentation, dass ich Backend-Tests mit TransactionCase schreibe:
from odoo.tests.common import TransactionCase
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class EstateTestCase(TransactionCase):
@classmethod
def setUpClass(cls):
super(EstateTestCase, cls).setUpClass()
cls.properties = cls.env['estate.property'].create([...])
def test_creation_area(self):
"""Test that the total_area is computed like it should."""
self.properties.living_area = 20
self.assertRecordValues(self.properties, [
{'name': ..., 'total_area': ...},
])
Wichtige Punkte:
- Tests müssen in
tests/Ordner im Modul liegen (Dateien:test_*.py) - Alle Test-Dateien müssen in
tests/__init__.pyimportiert werden - Test-Klassen erben von
odoo.tests.common.TransactionCase - Decorator
@tagged('post_install', '-at_install')steuert, wann Tests laufen
Tests ausführen
Ich sehe mehrere Wege, Tests zu starten:
1. Alle Tests eines Moduls (mit Abhängigkeiten):
odoo-bin -i account --test-enable
2. Eine einzelne Test-Datei:
odoo-bin --test-file=addons/account/tests/test_account_move_entry.py
3. Mit Test-Tags filtern:
odoo-bin --test-tags=/account:TestAccountMove.test_custom_currency_on_account_1
4. Test-Tags Syntax (aus der Doku):
Format: [-][tag][/module][:class][.method]
-= exclude (wenn vorhanden)tag= Tag-Name (Standard:standardundat_installsind vorgesetzt)/module= Modul-Name:class= Test-Klasse.method= Test-Methode
Beispiele:
--test-tags=/account→ alle Tests des account-Moduls--test-tags=:TestAccountMove.test_custom_currency→ spezifische Test-Methode--test-tags=-external→ alles außer "external"-Tag
Frontend-Tests (JavaScript mit HOOT)
Ich sehe, dass HOOT (Hierarchically Organized Odoo Tests) das Frontend-Test-Framework ist:
Tests schreiben:
import { describe, expect, test } from "@odoo/hoot";
describe("My first suite", () => {
test("My first test", () => {
expect(2 + 2).toBe(4);
});
});
Tests ausführen:
- URL:
http://localhost:8000/web/tests - Tests laufen sequenziell in der Console und GUI
Runner-Optionen (URL-Parameter):
?headless // keine GUI
?filter=name // Tests nach Name filtern
?tag=external // nur bestimmte Tags
?timeout=5000 // Timeout in ms
?order=random // zufällige Reihenfolge
?loglevel=3 // 0-3: mehr Debug-Output
HTTP/JSON Tests
Ich sehe im Test-HTTP Modul, dass es Controller für verschiedene HTTP-Methoden gibt:
@http.route('/test_http/echo-json', type='json', auth='none', methods=['POST'], csrf=False)
def echo_json(self, **kwargs):
return kwargs
Das zeigt, wie man JSON-Endpoints testet.
Test-Tags erklärt
Nach der Doku gibt es zwei spezielle Tags:
at_install: Tests laufen direkt nach Modul-Installationpost_install: Tests laufen nach ALL Modulen installiert sind
Mit @tagged('post_install', '-at_install') sage ich: "Lauf nach allen Modulen, nicht sofort."
Best Practices (aus der Doku):
✅ Tests sollten unabhängig von DB-Daten sein
✅ Keine cr.commit() in Tests
✅ Test sollte ohne Fix FAIL, mit Fix PASS sein
✅ Nicht ORM-Features testen (das tun bereits andere)
✅ Fokus: Business Logic testen
✅ Keine .flush() nötig
Hast du noch eine konkretere Frage zu einem bestimmten Test-Typ oder -Scenario? Ich kann dir dann ein präzises Code-Beispiel zeigen! 🎯
📎 Quellreferenzen:
- Odoo 17/18/19 Tutorial: Unit Tests
- HOOT Frontend Testing Framework
odoo/addons/test_http/controllers.py→TestHttp(Odoo 18 Community)
Odoo-Expertin bei detalex GmbH