odoo-automated-tests – skill Lập trình cho agent AI
Viết và chạy kiểm thử tự động cho Odoo bằng TransactionCase, HttpCase và browser tour tests. Bao gồm thiết lập dữ liệu kiểm thử, mocking và tích hợp CI.
Cài skill odoo-automated-tests bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/odoo-automated-tests-8da09.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /odoo-automated-tests – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/odoo-automated-tests-8da09.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $odoo-automated-tests – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/odoo-automated-tests-8da09.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /odoo-automated-tests – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/odoo-automated-tests-8da09.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /odoo-automated-tests – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
Odoo Automated Tests
Overview
Odoo has a built-in testing framework based on Python's unittest. This skill helps you write TransactionCase unit tests, HttpCase integration tests, and JavaScript tour tests. It also covers running tests in CI pipelines.
When to Use This Skill
- Writing unit tests for a custom model's business logic.
- Creating an HTTP test to verify a controller endpoint.
- Debugging test failures in a CI pipeline.
- Setting up automated test execution with
--test-enable.
How It Works
1. Activate: Mention @odoo-automated-tests and describe the feature to test.
2. Generate: Get complete test class code with setup, teardown, and assertions.
3. Run: Get the exact odoo CLI command to execute your tests.
Examples
Example 1: TransactionCase Unit Test (Odoo 15+ pattern)
# tests/test_hospital_patient.py
from odoo.tests.common import TransactionCase
from odoo.tests import tagged
from odoo.exceptions import ValidationError, AccessError
@tagged('post_install', '-at_install')
class TestHospitalPatient(TransactionCase):
@classmethod
def setUpClass(cls):
# Use setUpClass for performance — runs once per class, not per test
super().setUpClass()
cls.Patient = cls.env['hospital.patient']
cls.doctor = cls.env['res.users'].browse(cls.env.uid)
def test_create_patient(self):
patient = self.Patient.create({
'name': 'John Doe',
'doctor_id': self.doctor.id,
})
self.assertEqual(patient.state, 'draft')
self.assertEqual(patient.name, 'John Doe')
def test_confirm_patient(self):
patient = self.Patient.create({'name': 'Jane Smith'})
patient.action_confirm()
self.assertEqual(patient.state, 'confirmed')
def test_empty_name_raises_error(self):
with self.assertRaises(ValidationError):
self.Patient.create({'name': ''})
def test_access_denied_for_other_user(self):
# Test security rules by running as a different user
other_user = self.env.ref('base.user_demo')
with self.assertRaises(AccessError):
self.Patient.with_user(other_user).create({'name': 'Test'})> setUpClass vs setUp: Use setUpClass (Odoo 15+) for shared test data. It runs once per class and is significantly faster than setUp which re-initializes for every single test method.
Example 2: Run Tests via CLI
# Run all tests for a specific module
./odoo-bin --test-enable --stop-after-init -d my_database -u hospital_management
# Run only tests tagged with a specific tag
./odoo-bin --test-enable --stop-after-init -d my_database \
--test-tags hospital_management
# Run a specific test class
./odoo-bin --test-enable --stop-after-init -d my_database \
--test-tags /hospital_management:TestHospitalPatientExample 3: HttpCase for Controller Testing
from odoo.tests.common import HttpCase
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestPatientController(HttpCase):
def test_patient_page_authenticated(self):
# Use an explicitly created synthetic fixture with a known test-only password.
self.authenticate("patient_test_user", "test-only-fixture-password")
resp = self.url_open('/hospital/patients')
self.assertEqual(resp.status_code, 200)
def test_patient_page_redirects_unauthenticated(self):
# No authenticate() call = public/anonymous user
resp = self.url_open('/hospital/patients', allow_redirects=False)
self.assertIn(resp.status_code, [301, 302, 403])Best Practices
- ✅ Do: Use
setUpClass()withcls.envinstead ofsetUp()— it is dramatically faster for large test suites. - ✅ Do: Use
@tagged('post_install', '-at_install')to run tests after all modules are installed. - ✅ Do: Test both the happy path and error conditions (
ValidationError,AccessError,UserError). - ✅ Do: Use
recordset.with_user(user)to test access control withoutsudo(); a TransactionCase instance is not the model recordset. - ❌ Don't: Use a production database for tests — always use a dedicated test database.
- ❌ Don't: Rely on test execution order — each
TransactionCasetest is rolled back in isolation. - ❌ Don't: Assume a user’s password equals their login. Create isolated fixture users with explicit test-only credentials and required groups/ACLs; never use real account passwords.
Limitations
- JavaScript tour tests require a running browser (via
phantomjsorChrome headless) and a live Odoo server — not covered in depth here. HttpCasetests are significantly slower thanTransactionCase— use them only for controller/route verification.- Does not cover mocking external services (e.g., mocking an SMTP server or payment gateway in tests).
- Test isolation is at the transaction level, not database level — tests that commit data (e.g., via
cr.commit()) can leak state between tests.
Skill liên quan
- odoo-migration-helper – Hướng dẫn từng bước di chuyển module tùy chỉnh Odoo giữa các phiên bản…
- odoo-module-developer – Hướng dẫn chuyên sâu tạo module Odoo tùy chỉnh. Bao gồm __manifest__.py, kế thừa model…
- odoo-rpc-api – Chuyên gia về API JSON-RPC và XML-RPC bên ngoài của Odoo. Bao gồm xác thực, gọi model…
- odoo-shopify-integration – Kết nối Odoo với Shopify: đồng bộ sản phẩm, tồn kho, đơn hàng và khách hàng qua Shopify…
- odoo-woocommerce-bridge – Đồng bộ Odoo với WooCommerce: sản phẩm, tồn kho, đơn hàng và khách hàng qua WooCommerce…
- omp-delegate – Giao tác vụ lập trình cho Oh My Pi (`omp`) chỉ khi người dùng yêu cầu rõ ràng, trong khi…
- openapi-spec-generation – Tạo và duy trì đặc tả OpenAPI 3.1 từ mã nguồn, đặc tả thiết kế trước (design-first) và…
- openapi-spec-generator – Tạo đặc tả OpenAPI 3.x và Swagger 2.0 hoàn chỉnh, sẵn sàng cho production từ mô tả bằng…