Pruebas y Calidad de Código en Odoo
El desarrollo profesional en Odoo exige garantizar que las reglas de negocio, cálculos de importes y flujos de estados funcionen sin fisuras mediante pruebas automatizadas integradas con el framework odoo.tests.
1. Clases de Prueba en Odoo (odoo.tests.common) #
| Clase Base | Comportamiento Transaccional | Caso de Uso |
|---|---|---|
TransactionCase | Cada método de test corre en una transacción propia que se revierte (rollback) al terminar. | Pruebas unitarias estándar de modelos y métodos. |
SingleTransactionCase | Toda la clase corre en una única transacción compartida. | Tests de integración secuenciales donde cada paso depende del anterior. |
HttpCase | Servidor HTTP simulado con soporte para llamadas JSON/REST y pruebas Tour de navegador con JS. | Pruebas de controladores web y flujos visuales de interfaz. |
2. Estructura y Redacción de un Test Unitario #
Los tests se ubican en la carpeta tests/ del módulo y se importan en tests/__init__.py:
1# Archivo: tests/test_library_book.py 2from odoo.tests.common import TransactionCase, tagged 3from odoo.exceptions import ValidationError 4 5@tagged('post_install', '-at_install') 6class TestLibraryBook(TransactionCase): 7 8 @classmethod 9 def setUpClass(cls): 10 super().setUpClass() 11 # Creamos datos base compartidos 12 cls.partner = cls.env['res.partner'].create({ 13 'name': 'Editorial Planeta', 14 'email': 'contacto@planeta.com' 15 }) 16 cls.book = cls.env['library.book'].create({ 17 'name': 'El Quijote', 18 'author': 'Miguel de Cervantes', 19 'price': 25.0, 20 'partner_id': cls.partner.id 21 }) 22 23 def test_01_discount_computation(self): 24 """Verificar que el precio con descuento se calcula al 90%.""" 25 self.assertEqual(self.book.discounted_price, 22.5, "El cálculo del descuento no es correcto.") 26 27 def test_02_negative_pages_constraint(self): 28 """Verificar que no se permiten libros con páginas negativas.""" 29 with self.assertRaises(ValidationError): 30 self.book.write({'pages': -10})
3. Ejecución de Tests y Depuración Interactiva #
- Ejecutar tests de un módulo específico:
1odoo-bin --test-enable --stop-after-init -i biblioteca -d db_test - Sesión interactiva de Odoo Shell:
1odoo-bin shell -d mi_base_datos 2>>> env['library.book'].search([]) 3library.book(1, 2)
Resumen del tema
Conceptos clave #
- Testing Integrado (
odoo.tests.common):TransactionCase: ejecuta tests unitarios dentro de una transacción aislada que revierte cambios al finalizar.SingleTransactionCase/HttpCase: para pruebas de integración y tests de navegación web.
- Ejecución de Pruebas: comando
odoo-bin --test-enable --stop-after-init -i modulo -d db_test. - Herramientas de Depuración:
odoo-bin shell: entorno interactivo Python/REPL conself.envprecargado.- Puntos de interrupción interactivos con
breakpoint(). - Etiquetado de tests con
@tagged('post_install', '-at_install').
- Estándares de Calidad: conformidad con PEP8 y linter especializado
pylint-odoo.
Qué debes recordar #
Ubica tus tests unitarios en la carpeta tests/ heredando de TransactionCase y usa odoo shell y --test-enable para garantizar la robustez del código.