Create Testing Odoo authored by Juan Pedro Sánchez's avatar Juan Pedro Sánchez
### Estructura de Directorios
La estructura típica de un módulo de Odoo con pruebas unitarias es la siguiente:
```
my_module/
|-- __init__.py
|-- __manifest__.py
|-- models/
| |-- __init__.py
| |-- my_model.py
|-- tests/
|-- __init__.py
|-- test_my_model.py
```
### Configuración del Módulo
Asegúrate de que tu archivo `__manifest__.py` incluya la dependencia del módulo de prueba base_test:
```python
{
'name': 'My Module',
'version': '1.0',
'depends': ['base'],
'category': 'Category',
'author': 'Author',
'website': 'http://www.example.com',
'description': """
Description of My Module
""",
'data': [
# Data files (e.g. views, security rules)
],
'demo': [
# Demo data files
],
'test': [
'tests/test_arkenova_backend.py',
],
'installable': True,
'auto_install': False,
}
```
### Tags Comunes
**standard:** Indica que el test es parte de la suite de pruebas estándar y debe ejecutarse en pruebas rutinarias.
**`at_install`:** Ejecuta los tests al instalar el módulo.
**`post_install`:** Ejecuta los tests después de instalar el módulo.
**`-at_install`:** Excluye los tests de la ejecución durante la instalación del módulo.
**`-post_install`:** Excluye los tests de la ejecución después de la instalación del módulo.
### Escribir Pruebas Unitarias
Crea un archivo de prueba en la carpeta `tests/`. Por ejemplo,
**`test_arkenova_backend.py:`**
```python
from odoo.tests.common import TransactionCase, tagged
from ..backends.arkenova_backend import ArkenovaBackend
from .backends_data import project_code
@tagged('post_install', 'energy_project')
class TestArkenovaBackend(TransactionCase):
def setUp(self):
# En el método setUp definimos todo aquello que es recurrente y común
# en el resto de métodos. También se pueden definir "propiedades"
# de comportamiento de los tests.
# Importante: este método se lanza cada vez que se ejecuta un test!!
self.maxDiff = None # como por ejemplo que se muestren todas
# las diferencias cuando falla un test
self.url = arkenova_data["url"]
self.token = arkenova_data["token"]
self.endpoint_patch = patch.dict(
ArkenovaBackend._endpoints,
{"project_daily_metrics": "project/v1/{system_id}"},
clear=True,
)
def tearDown(self):
# Es el método contrario al setup. Y nos sirve para limpiar, cerrar
# conexiones... y dejar el entorno limpio
# Importante: este método se ejecuta al final de cada test
if self.endpoint_patch._original:
self.endpoint_patch.stop()
def test__project_daily_metrics__wrong_from_date(self):
# given a project and an arkenova backend instance
project_id = project_code
arkenova = ArkenovaBackend(self.url, self.token)
# Nota: si instanciamos ArkenovaBackend en más test será interesante
# moverlo al setUp
# when we ask for the daily metrics without from_date
from_date = ""
to_date = str(date(2024, 4, 28))
# then an arkenova exception is raised
with self.assertRaises(RequestError) as excp_manager:
daily_metrics = arkenova.project_daily_metrics(
project_id, from_date, to_date
)
self.assertEqual(excp_manager.exception.error_code, 400)
self.assertEqual(excp_manager.exception.message, "Invalid from_date parameter format")
```
y importalo en el ```__init__.py``` de la carpeta tests
**`__init__.py:`**
```python
from . import test_arkenova_backend
# Esto es importante para que el "runner" de test de odoo detecte los test que se han implementado.
```
### Ejecutar las Pruebas
Para ejecutar las pruebas unitarias en Odoo, utiliza el siguiente comando en la terminal desde el directorio raíz de Odoo:
```bash
$(odoo)> ./odoo-bin -c odoo.conf -d your_database_name --test-enable --stop-after-init
```
Asegúrate de que `your_database_name` sea una base de datos válida y que `odoo.conf` esté configurado correctamente con los detalles de tu entorno.
Interpretar los Resultados
Después de ejecutar el comando anterior, Odoo ejecutará todas las pruebas definidas en tu módulo y mostrará los resultados en la terminal. Debes ver algo similar a:
```
2024-06-17 10:00:00,000 1 INFO ? odoo.addons.my_module.tests.test_my_model: Running test_create_record...
2024-06-17 10:00:00,001 1 INFO ? odoo.addons.my_module.tests.test_my_model: Running test_modify_record...
```
Si todas las pruebas pasan, tu módulo está funcionando correctamente. Si alguna prueba falla, Odoo proporcionará un traceback indicando qué prueba falló y por qué.
### Ejecutar Pruebas con Tags Concretos
Para ejecutar pruebas con un tag específico, puedes usar el parámetro --test-tags seguido del tag o tags deseados. Aquí hay algunos ejemplos:
* Ejecutar pruebas con el tag standard:
```bash
$(odoo)> ./odoo-bin -c odoo.conf -d your_database_name --test-enable --stop-after-init --test-tags standard
```
* Ejecutar pruebas con los tags post_install y standard:
```bash
$(odoo)> ./odoo-bin -c odoo.conf -d your_database_name --test-enable --stop-after-init --test-tags post_install,standard
```
* Ejecutar pruebas con el tag post_install excluyendo -at_install:
```bash
$(odoo)> ./odoo-bin -c odoo.conf -d your_database_name --test-enable --stop-after-init --test-tags post_install,-at_install
```
* Ejecutar todas las pruebas, excluyendo las etiquetadas con -post_install:
```bash
$(odoo)> ./odoo-bin -c odoo.conf -d your_database_name --test-enable --stop-after-init --test-tags -post_install
```
### Cosas que molan 🔝
* **Cobertura de pruebas** 👍🏽 Asegúrate de cubrir tanto casos de éxito como de fallo para validar correctamente tu módulo.
* **Datos de prueba** 👍🏽 Usa datos de prueba consistentes y relevantes para simular escenarios del mundo real.
* **Limpieza** 👍🏽 Limpia cualquier dato creado durante las pruebas en el método tearDown si es necesario.
Siguiendo estos pasos, puedes realizar pruebas unitarias efectivas en tus módulos de Odoo, lo que te ayudará a garantizar la calidad y estabilidad del código.
### Referencias:
Para más información, diferentes tipos de clases de test, configuraciones… en la
documentación de odoo: https://www.odoo.com/documentation/14.0/developer/reference/addons/testing.html#testing-python-code
Se encuentra todo explicado con detalle y ejemplos.