openSOURCE

openSOURCE

Did You Know?

All the tech in one platform

Odoo Dev FAQs

Testing — unit & web tests

Estimated reading: 5 minutes 37 views

Selamat datang di bagian kesepuluh FAQ OdooCamp: Testing — unit & web tests. Prolog ini menjadi pengantar sebelum kita masuk ke pertanyaan teknis yang paling sering diajukan developer tentang pengujian otomatis pada Odoo 18 CE.


Mengapa Testing Penting?

Tanpa test, perubahan kecil pun bisa memecahkan fitur di modul lain. Dengan test yang baik, kita dapat:

  • Menjaga stabilitas saat refactor/upgrade.
  • Mempercepat review dan integrasi antar tim.
  • Mendokumentasikan perilaku yang diharapkan (executable spec).

Mindset Kerja

Isolasi Data → Jalankan Skenario → Assertion → Idempoten

  • Tulis test yang isolated (tidak bergantung pada urutan eksekusi test lain).
  • Simulasikan skenario nyata sekadar cukup untuk membuktikan perilaku.
  • Gunakan assertion yang jelas dan spesifik.
  • Pastikan test idempoten (bisa diulang tanpa sisa data).

Ruang Lingkup yang Akan Kita Bahas di FAQ Testing

  1. Python Unit Test: TransactionCase, SavepointCase, utilitas ORM.
  2. Functional/Web Test: HttpCase dan web tour.
  3. Helpers & Tools: Form, mute_logger, pembuatan user/grup untuk skenario akses.
  4. Menjalankan Test: perintah odoo-bin, --test-tags, --stop-after-init, strategi CI.
  5. Data & Performa: kapan pakai SavepointCase, kapan meminimalkan fixture.
  6. Diagnostik: membaca log, melokalisasi kegagalan, mempercepat iterasi.

Anatomi Minimal — Python Unit Test

File test Python ditempatkan di folder tests/ dalam modul.

# tests/test_sale_flow.py
from odoo.tests.common import SavepointCase, Form
from odoo.exceptions import ValidationError

class TestSaleFlow(SavepointCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        # Fixture minimal
        cls.partner = cls.env["res.partner"].create({"name": "Test Customer"})
        cls.product = cls.env["product.product"].create({
            "name": "Consulting",
            "type": "service",
            "list_price": 100.0,
        })

    def test_create_quotation_and_confirm(self):
        # Buat SO dengan helper Form (mendekati UI)
        so_form = Form(self.env["sale.order"].with_context(tracking_disable=True))
        so_form.partner_id = self.partner
        with so_form.order_line.new() as line:
            line.product_id = self.product
            line.product_uom_qty = 2
        order = so_form.save()

        # Assert harga subtotal
        self.assertGreater(order.amount_total, 0)

        # Tindakan bisnis
        order.action_confirm()
        self.assertEqual(order.state, "sale")

    def test_amount_cannot_be_negative(self):
        with self.assertRaises(ValidationError):
            self.env["my.model"].create({"name": "X", "amount": -1})

Kapan pilih SavepointCase?

  • Lebih cepat untuk banyak test karena memakai savepoint (commit ringan per class). Cocok untuk suite besar.
  • TransactionCase mengembalikan transaksi per test (lebih bersih, sedikit lebih lambat).

Functional/Web Test — HttpCase + Tour

Gunakan HttpCase untuk mensimulasikan browser dan menjalankan web tour.

# tests/test_portal_tour.py
from odoo.tests.common import HttpCase, tagged

@tagged("post_install", "-at_install")
class TestPortalTour(HttpCase):
    def test_portal_flow(self):
        # Mulai dari home (atau /web) dan jalankan tour bernama 'my_tour'
        self.start_tour("/web", "my_tour", login="admin")

Tour didefinisikan di aset JS modul, misal static/src/js/tours/my_tour.js.

// static/src/js/tours/my_tour.js
/** Registrasi tour (skema generik, sesuaikan dengan API OWL/web_tour versi Anda) **/
odoo.define('my_module.tour', function (require) {
  const tour = require('web_tour.tour');
  tour.register('my_tour', { test: true }, [
    { trigger: '.o_app[data-menu-xmlid="sale.menu_sale_root"]' },
    { trigger: '.o_list_button_add' },
    { trigger: '.o_form_button_save' },
  ]);
});

Catatan: API tour/registry pada Odoo modern berbasis OWL; struktur di atas bersifat indikatif. Di project nyata, sesuaikan import/registry dengan versi Odoo Anda (bundle web_tour).


Menjalankan Test

Contoh perintah umum:

# Install modul + jalankan semua test modul tersebut
odoo-bin -d mydb -i my_module --test-enable --stop-after-init

# Ulangi test saat meng-upgrade modul (hanya modul tertentu)
odoo-bin -d mydb -u my_module --test-enable --stop-after-init

# Jalankan subset test berdasar tag (contoh: hanya post_install)
odoo-bin -d mydb -u my_module --test-tags my_module,post_install --stop-after-init

# Fokus ke satu file test (mengandalkan test-tags per modul/nama)
odoo-bin -d mydb -u my_module --test-tags /my_module/tests/test_sale_flow.py --stop-after-init

Tips:

  • Gunakan @tagged('post_install', '-at_install') untuk test yang harus berjalan setelah install.
  • --stop-after-init menutup server setelah test selesai (praktis untuk CI).

Helpers yang Berguna

  • Form: membuat record mendekati cara UI mengisi form (menangani onchanges).
  • mute_logger: meredam noise log saat menguji error yang diharapkan.
  • Utility user/grup: buat user sementara untuk menguji ACL/record rules.
from odoo.tests.common import Form, mute_logger

with mute_logger('odoo.tests'):  # contoh channel log
    with self.assertRaises(Exception):
        self.env['model.x'].method_y()

Best Practices (Do/Don’t)

Do

  • Gunakan fixture minimal di setUpClass (untuk SavepointCase) agar suite cepat.
  • Tulis test satu skenario, satu tujuan (hindari test gemuk yang sulit dipelihara).
  • Beri nama test deskriptif dan assertion yang jelas.
  • Tandai test yang memerlukan UI/JS dengan tag yang sesuai (post_install).

Don’t

  • Jangan bergantung pada urutan eksekusi test.
  • Jangan membuat/menghapus data global yang mempengaruhi test lain.
  • Jangan menaruh sleep berlebihan di tour; gunakan trigger yang deterministik.

Diagnostik & Percepatan Iterasi

  • Naikkan verbosity log saat debugging dan gunakan Developer Mode di instance lokal.
  • Jalankan subset test dengan --test-tags untuk siklus cepat.
  • Periksa traceback pertama yang muncul; error berantai sering berasal dari sana.

Checklist Sebelum Masuk ke FAQ Detail

  • Struktur tests/ sudah ada dan dimuat saat install/upgrade modul.
  • Pilih SavepointCase untuk speed, TransactionCase untuk isolasi ketat jika perlu.
  • Functional test memakai HttpCase + tour yang stabil (trigger deterministik).
  • Perintah odoo-bin untuk test sudah teruji (install/upgrade/tags/stop-after-init).
  • Logging & tagging test jelas untuk CI.

Yang Akan Kita Jawab di FAQ Testing

  • Kapan pakai TransactionCase vs SavepointCase dan dampaknya pada performa.
  • Cara menulis test yang memanfaatkan Form/onchange dengan benar.
  • Menulis dan menjalankan web tour yang tidak rapuh.
  • Menandai test dengan tag dan menjalankannya selektif (--test-tags).
  • Strategi menyusun suite test untuk modul bisnis yang kompleks.

Dengan prolog ini, kita siap melangkah ke FAQ Testing — unit & web tests dan membahas praktik konkret yang sering muncul dalam proyek Odoo 18 CE.

Leave a Comment

Share this Doc

Testing — unit & web tests

Or copy link

CONTENTS